==============
File Time Type
==============

.. contents::
   :local:

.. _file-time-type-motivation:

Motivation
==========

The filesystem library provides interfaces for getting and setting the last
write time of a file or directory. The interfaces use the ``file_time_type``
type, which is a specialization of ``chrono::time_point`` for the
"filesystem clock". According to [fs.filesystem.syn]

  trivial-clock is an implementation-defined type that satisfies the
  Cpp17TrivialClock requirements ([time.clock.req]) and that is capable of
  representing and measuring file time values. Implementations should ensure
  that the resolution and range of file_time_type reflect the operating
  system dependent resolution and range of file time values.


On POSIX systems, file times are represented using the ``timespec`` struct,
which is defined as follows:

.. code-block:: cpp

  struct timespec {
    time_t tv_sec;
    long   tv_nsec;
  };

To represent the range and resolution of ``timespec``, we need to (A) have
nanosecond resolution, and (B) use more than 64 bits (assuming a 64 bit ``time_t``).

As the standard requires us to use the ``chrono`` interface, we have to define
our own filesystem clock which specifies the period and representation of
the time points and duration it provides. It will look like this:

.. code-block:: cpp

  struct _FilesystemClock {
    using period = nano;
    using rep = TBD; // What is this?

    using duration = chrono::duration<rep, period>;
    using time_point = chrono::time_point<_FilesystemClock>;

    // ... //
  };

  using file_time_type = _FilesystemClock::time_point;


To get nanosecond resolution, we simply define ``period`` to be ``std::nano``.
But what type can we use as the arithmetic representation that is capable
of representing the range of the ``timespec`` struct?

Problems To Consider
====================

Before considering solutions, let's consider the problems they should solve,
and how important solving those problems are:


Having a Smaller Range than ``timespec``
----------------------------------------

One solution to the range problem is to simply reduce the resolution of
``file_time_type`` to be less than that of nanoseconds. This is what libc++'s
initial implementation of ``file_time_type`` did; it's also what
``std::system_clock`` does. As a result, it can represent time points about
292 thousand years on either side of the epoch, as opposed to only 292 years
at nanosecond resolution.

``timespec`` can represent time points +/- 292 billion years from the epoch
(just in case you needed a time point 200 billion years before the big bang,
and with nanosecond resolution).

To get the same range, we would need to drop our resolution to that of seconds
to come close to having the same range.

This begs the question, is the range problem "really a problem"? Sane usages
of file time stamps shouldn't exceed +/- 300 years, so should we care to support it?

I believe the answer is yes. We're not designing the filesystem time API, we're
providing glorified C++ wrappers for it. If the underlying API supports
a value, then we should too. Our wrappers should not place artificial restrictions
on users that are not present in the underlying filesystem.

Having a smaller range that the underlying filesystem forces the
implementation to report ``value_too_large`` errors when it encounters a time
point that it can't represent. This can cause the call to ``last_write_time``
to throw in cases where the user was confident the call should succeed. (See below)


.. code-block:: cpp

  #include <filesystem>
  using namespace std::filesystem;

  // Set the times using the system interface.
  void set_file_times(const char* path, struct timespec ts) {
    timespec both_times[2];
    both_times[0] = ts;
    both_times[1] = ts;
    int result = ::utimensat(AT_FDCWD, path, both_times, 0);
    assert(result != -1);
  }

  // Called elsewhere to set the file time to something insane, and way
  // out of the 300 year range we might expect.
  void some_bad_persons_code() {
    struct timespec new_times;
    new_times.tv_sec = numeric_limits<time_t>::max();
    new_times.tv_nsec = 0;
    set_file_times("/tmp/foo", new_times); // OK, supported by most FSes
  }

  int main(int, char**) {
    path p = "/tmp/foo";
    file_status st = status(p);
    if (!exists(st) || !is_regular_file(st))
      return 1;
    if ((st.permissions() & perms::others_read) == perms::none)
      return 1;
    // It seems reasonable to assume this call should succeed.
    file_time_type tp = last_write_time(p); // BAD! Throws value_too_large.
    return 0;
  }


Having a Smaller Resolution than ``timespec``
---------------------------------------------

As mentioned in the previous section, one way to solve the range problem
is by reducing the resolution. But matching the range of ``timespec`` using a
64 bit representation requires limiting the resolution to seconds.

So we might ask: Do users "need" nanosecond precision? Is seconds not good enough?
I limit my consideration of the point to this: Why was it not good enough for
the underlying system interfaces? If it wasn't good enough for them, then it
isn't good enough for us. Our job is to match the filesystems range and
representation, not design it.


Having a Larger Range than ``timespec``
----------------------------------------

We should also consider the opposite problem of having a ``file_time_type``
that is able to represent a larger range than ``timespec``. At least in
this case ``last_write_time`` can be used to get and set all possible values
supported by the underlying filesystem; meaning ``last_write_time(p)`` will
never throw a overflow error when retrieving a value.

However, this introduces a new problem, where users are allowed to attempt to
create a time point beyond what the filesystem can represent. Two particular
values which cause this are ``file_time_type::min()`` and
``file_time_type::max()``. As a result, the following code would throw:

.. code-block:: cpp

  void test() {
    last_write_time("/tmp/foo", file_time_type::max()); // Throws
    last_write_time("/tmp/foo", file_time_type::min()); // Throws.
  }

Apart from cases explicitly using ``min`` and ``max``, I don't see users taking
a valid time point, adding a couple hundred billions of years in error,
and then trying to update a file's write time to that value very often.

Compared to having a smaller range, this problem seems preferable. At least
now we can represent any time point the filesystem can, so users won't be forced
to revert back to system interfaces to avoid limitations in the C++ STL.

I posit that we should only consider this concern *after* we have something
with at least the same range and resolution of the underlying filesystem. The
latter two problems are much more important to solve.

Potential Solutions And Their Complications
===========================================

Source Code Portability Across Implementations
-----------------------------------------------

As we've discussed, ``file_time_type`` needs a representation that uses more
than 64 bits. The possible solutions include using ``__int128_t``, emulating a
128 bit integer using a class, or potentially defining a ``timespec`` like
arithmetic type. All three will allow us to, at minimum, match the range
and resolution, and the last one might even allow us to match them exactly.

But when considering these potential solutions we need to consider more than
just the values they can represent. We need to consider the effects they will
have on users and their code. For example, each of them breaks the following
code in some way:

.. code-block:: cpp

  // Bug caused by an unexpected 'rep' type returned by count.
  void print_time(path p) {
    // __int128_t doesn't have streaming operators, and neither would our
    // custom arithmetic types.
    cout << last_write_time(p).time_since_epoch().count() << endl;
  }

  // Overflow during creation bug.
  file_time_type timespec_to_file_time_type(struct timespec ts) {
    // woops! chrono::seconds and chrono::nanoseconds use a 64 bit representation
    // this may overflow before it's converted to a file_time_type.
    auto dur = seconds(ts.tv_sec) + nanoseconds(ts.tv_nsec);
    return file_time_type(dur);
  }

  file_time_type correct_timespec_to_file_time_type(struct timespec ts) {
    // This is the correct version of the above example, where we
    // avoid using the chrono typedefs as they're not sufficient.
    // Can we expect users to avoid this bug?
    using fs_seconds = chrono::duration<file_time_type::rep>;
    using fs_nanoseconds = chrono::duration<file_time_type::rep, nano>;
    auto dur = fs_seconds(ts.tv_sec) + fs_nanoseconds(tv.tv_nsec);
    return file_time_type(dur);
  }

  // Implicit truncation during conversion bug.
  intmax_t get_time_in_seconds(path p) {
    using fs_seconds = duration<file_time_type::rep, ratio<1, 1> >;
    auto tp = last_write_time(p);

    // This works with truncation for __int128_t, but what does it do for
    // our custom arithmetic types.
    return duration_cast<fs_seconds>().count();
  }


Each of the above examples would require a user to adjust their filesystem code
to the particular eccentricities of the representation, hopefully only in such
a way that the code is still portable across implementations.

At least some of the above issues are unavoidable, no matter what
representation we choose. But some representations may be quirkier than others,
and, as I'll argue later, using an actual arithmetic type (``__int128_t``)
provides the least aberrant behavior.


Chrono and ``timespec`` Emulation.
----------------------------------

One of the options we've considered is using something akin to ``timespec``
to represent the ``file_time_type``. It only seems natural seeing as that's
what the underlying system uses, and because it might allow us to match
the range and resolution exactly. But would it work with chrono? And could
it still act at all like a ``timespec`` struct?

For ease of consideration, let's consider what the implementation might
look like.

.. code-block:: cpp

  struct fs_timespec_rep {
    fs_timespec_rep(long long v)
      : tv_sec(v / nano::den), tv_nsec(v % nano::den)
    { }
  private:
    time_t tv_sec;
    long tv_nsec;
  };
  bool operator==(fs_timespec_rep, fs_timespec_rep);
  fs_int128_rep operator+(fs_timespec_rep, fs_timespec_rep);
  // ... arithmetic operators ... //

The first thing to notice is that we can't construct ``fs_timespec_rep`` like
a ``timespec`` by passing ``{secs, nsecs}``. Instead we're limited to
constructing it from a single 64 bit integer.

We also can't allow the user to inspect the ``tv_sec`` or ``tv_nsec`` values
directly. A ``chrono::duration`` represents its value as a tick period and a
number of ticks stored using ``rep``. The representation is unaware of the
tick period it is being used to represent, but ``timespec`` is setup to assume
a nanosecond tick period; which is the only case where the names ``tv_sec``
and ``tv_nsec`` match the values they store.

When we convert a nanosecond duration to seconds, ``fs_timespec_rep`` will
use ``tv_sec`` to represent the number of giga seconds, and ``tv_nsec`` the
remaining seconds. Let's consider how this might cause a bug were users allowed
to manipulate the fields directly.

.. code-block:: cpp

  template <class Period>
  timespec convert_to_timespec(duration<fs_time_rep, Period> dur) {
    fs_timespec_rep rep = dur.count();
    return {rep.tv_sec, rep.tv_nsec}; // Oops! Period may not be nanoseconds.
  }

  template <class Duration>
  Duration convert_to_duration(timespec ts) {
    Duration dur({ts.tv_sec, ts.tv_nsec}); // Oops! Period may not be nanoseconds.
    return file_time_type(dur);
    file_time_type tp = last_write_time(p);
    auto dur =
  }

  time_t extract_seconds(file_time_type tp) {
    // Converting to seconds is a silly bug, but I could see it happening.
    using SecsT = chrono::duration<file_time_type::rep, ratio<1, 1>>;
    auto secs = duration_cast<Secs>(tp.time_since_epoch());
    // tv_sec is now representing gigaseconds.
    return secs.count().tv_sec; // Oops!
  }

Despite ``fs_timespec_rep`` not being usable in any manner resembling
``timespec``, it still might buy us our goal of matching its range exactly,
right?

Sort of. Chrono provides a specialization point which specifies the minimum
and maximum values for a custom representation. It looks like this:

.. code-block:: cpp

  template <>
  struct duration_values<fs_timespec_rep> {
    static fs_timespec_rep zero();
    static fs_timespec_rep min();
    static fs_timespec_rep max() { // assume friendship.
      fs_timespec_rep val;
      val.tv_sec = numeric_limits<time_t>::max();
      val.tv_nsec = nano::den - 1;
      return val;
    }
  };

Notice that ``duration_values`` doesn't tell the representation what tick
period it's actually representing. This would indeed correctly limit the range
of ``duration<fs_timespec_rep, nano>`` to exactly that of ``timespec``. But
nanoseconds isn't the only tick period it will be used to represent. For
example:

.. code-block:: cpp

  void test() {
    using rep = file_time_type::rep;
    using fs_nsec = duration<rep, nano>;
    using fs_sec = duration<rep>;
    fs_nsec nsecs(fs_seconds::max()); // Truncates
  }

Though the above example may appear silly, I think it follows from the incorrect
notion that using a ``timespec`` rep in chrono actually makes it act as if it
were an actual ``timespec``.

Interactions with 32 bit ``time_t``
-----------------------------------

Up until now we've only be considering cases where ``time_t`` is 64 bits, but what
about 32 bit systems/builds where ``time_t`` is 32 bits? (this is the common case
for 32 bit builds).

When ``time_t`` is 32 bits, we can implement ``file_time_type`` simply using 64-bit
``long long``. There is no need to get either ``__int128_t`` or ``timespec`` emulation
involved. And nor should we, as it would suffer from the numerous complications
described by this paper.

Obviously our implementation for 32-bit builds should act as similarly to the
64-bit build as possible. Code which compiles in one, should compile in the other.
This consideration is important when choosing between ``__int128_t`` and
emulating ``timespec``. The solution which provides the most uniformity with
the least eccentricity is the preferable one.

Summary
=======

The ``file_time_type`` time point is used to represent the write times for files.
Its job is to act as part of a C++ wrapper for less ideal system interfaces. The
underlying filesystem uses the ``timespec`` struct for the same purpose.

However, the initial implementation of ``file_time_type`` could not represent
either the range or resolution of ``timespec``, making it unsuitable. Fixing
this requires an implementation which uses more than 64 bits to store the
time point.

We primarily considered two solutions: Using ``__int128_t`` and using a
arithmetic emulation of ``timespec``. Each has its pros and cons, and both
come with more than one complication.

The Potential Solutions
-----------------------

``long long`` - The Status Quo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Pros:

* As a type ``long long`` plays the nicest with others:

  * It works with streaming operators and other library entities which support
    builtin integer types, but don't support ``__int128_t``.
  * Its the representation used by chrono's ``nanosecond`` and ``second`` typedefs.

Cons:

* It cannot provide the same resolution as ``timespec`` unless we limit it
  to a range of +/- 300 years from the epoch.
* It cannot provide the same range as ``timespec`` unless we limit its resolution
  to seconds.
* ``last_write_time`` has to report an error when the time reported by the filesystem
  is unrepresentable.

__int128_t
~~~~~~~~~~~

Pros:

* It is an integer type.
* It makes the implementation simple and efficient.
* Acts exactly like other arithmetic types.
* Can be implicitly converted to a builtin integer type by the user.

  * This is important for doing things like:

    .. code-block:: cpp

      void c_interface_using_time_t(const char* p, time_t);

      void foo(path p) {
        file_time_type tp = last_write_time(p);
        time_t secs = duration_cast<seconds>(tp.time_since_epoch()).count();
        c_interface_using_time_t(p.c_str(), secs);
      }

Cons:

* It isn't always available (but on 64 bit machines, it normally is).
* It causes ``file_time_type`` to have a larger range than ``timespec``.
* It doesn't always act the same as other builtin integer types. For example
  with ``cout`` or ``to_string``.
* Allows implicit truncation to 64 bit integers.
* It can be implicitly converted to a builtin integer type by the user,
  truncating its value.

Arithmetic ``timespec`` Emulation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Pros:

* It has the exact same range and resolution of ``timespec`` when representing
  a nanosecond tick period.
* It's always available, unlike ``__int128_t``.

Cons:

* It has a larger range when representing any period longer than a nanosecond.
* Doesn't actually allow users to use it like a ``timespec``.
* The required representation of using ``tv_sec`` to store the giga tick count
  and ``tv_nsec`` to store the remainder adds nothing over a 128 bit integer,
  but complicates a lot.
* It isn't a builtin integer type, and can't be used anything like one.
* Chrono can be made to work with it, but not nicely.
* Emulating arithmetic classes come with their own host of problems regarding
  overload resolution (Each operator needs three SFINAE constrained versions of
  it in order to act like builtin integer types).
* It offers little over simply using ``__int128_t``.
* It acts the most differently than implementations using an actual integer type,
  which has a high chance of breaking source compatibility.


Selected Solution - Using ``__int128_t``
=========================================

The solution I selected for libc++ is using ``__int128_t`` when available,
and otherwise falling back to using ``long long`` with nanosecond precision.

When ``__int128_t`` is available, or when ``time_t`` is 32-bits, the implementation
provides same resolution and a greater range than ``timespec``. Otherwise
it still provides the same resolution, but is limited to a range of +/- 300
years. This final case should be rather rare, as ``__int128_t``
is normally available in 64-bit builds, and ``time_t`` is normally 32-bits
during 32-bit builds.

Although falling back to ``long long`` and nanosecond precision is less than
ideal, it also happens to be the implementation provided by both libstdc++
and MSVC. (So that makes it better, right?)

Although the ``timespec`` emulation solution is feasible and would largely
do what we want, it comes with too many complications, potential problems
and discrepancies when compared to "normal" chrono time points and durations.

An emulation of a builtin arithmetic type using a class is never going to act
exactly the same, and the difference will be felt by users. It's not reasonable
to expect them to tolerate and work around these differences. And once
we commit to an ABI it will be too late to change. Committing to this seems
risky.

Therefore, ``__int128_t`` seems like the better solution.
