Home | History | Annotate | Download | only in time
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Time represents an absolute point in coordinated universal time (UTC),
      6 // internally represented as microseconds (s/1,000,000) since the Windows epoch
      7 // (1601-01-01 00:00:00 UTC). System-dependent clock interface routines are
      8 // defined in time_PLATFORM.cc. Note that values for Time may skew and jump
      9 // around as the operating system makes adjustments to synchronize (e.g., with
     10 // NTP servers). Thus, client code that uses the Time class must account for
     11 // this.
     12 //
     13 // TimeDelta represents a duration of time, internally represented in
     14 // microseconds.
     15 //
     16 // TimeTicks and ThreadTicks represent an abstract time that is most of the time
     17 // incrementing, for use in measuring time durations. Internally, they are
     18 // represented in microseconds. They cannot be converted to a human-readable
     19 // time, but are guaranteed not to decrease (unlike the Time class). Note that
     20 // TimeTicks may "stand still" (e.g., if the computer is suspended), and
     21 // ThreadTicks will "stand still" whenever the thread has been de-scheduled by
     22 // the operating system.
     23 //
     24 // All time classes are copyable, assignable, and occupy 64-bits per instance.
     25 // As a result, prefer passing them by value:
     26 //   void MyFunction(TimeDelta arg);
     27 // If circumstances require, you may also pass by const reference:
     28 //   void MyFunction(const TimeDelta& arg);  // Not preferred.
     29 //
     30 // Definitions of operator<< are provided to make these types work with
     31 // DCHECK_EQ() and other log macros. For human-readable formatting, see
     32 // "base/i18n/time_formatting.h".
     33 //
     34 // So many choices!  Which time class should you use?  Examples:
     35 //
     36 //   Time:        Interpreting the wall-clock time provided by a remote system.
     37 //                Detecting whether cached resources have expired. Providing the
     38 //                user with a display of the current date and time. Determining
     39 //                the amount of time between events across re-boots of the
     40 //                machine.
     41 //
     42 //   TimeTicks:   Tracking the amount of time a task runs. Executing delayed
     43 //                tasks at the right time. Computing presentation timestamps.
     44 //                Synchronizing audio and video using TimeTicks as a common
     45 //                reference clock (lip-sync). Measuring network round-trip
     46 //                latency.
     47 //
     48 //   ThreadTicks: Benchmarking how long the current thread has been doing actual
     49 //                work.
     50 
     51 #ifndef BASE_TIME_TIME_H_
     52 #define BASE_TIME_TIME_H_
     53 
     54 #include <stdint.h>
     55 #include <time.h>
     56 
     57 #include <iosfwd>
     58 #include <limits>
     59 
     60 #include "base/base_export.h"
     61 #include "base/compiler_specific.h"
     62 #include "base/logging.h"
     63 #include "base/numerics/safe_math.h"
     64 #include "build/build_config.h"
     65 
     66 #if defined(OS_FUCHSIA)
     67 #include <zircon/types.h>
     68 #endif
     69 
     70 #if defined(OS_MACOSX)
     71 #include <CoreFoundation/CoreFoundation.h>
     72 // Avoid Mac system header macro leak.
     73 #undef TYPE_BOOL
     74 #endif
     75 
     76 #if defined(OS_ANDROID)
     77 #include <jni.h>
     78 #endif
     79 
     80 #if defined(OS_POSIX) || defined(OS_FUCHSIA)
     81 #include <unistd.h>
     82 #include <sys/time.h>
     83 #endif
     84 
     85 #if defined(OS_WIN)
     86 #include "base/gtest_prod_util.h"
     87 #include "base/win/windows_types.h"
     88 #endif
     89 
     90 namespace base {
     91 
     92 class PlatformThreadHandle;
     93 class TimeDelta;
     94 
     95 // The functions in the time_internal namespace are meant to be used only by the
     96 // time classes and functions.  Please use the math operators defined in the
     97 // time classes instead.
     98 namespace time_internal {
     99 
    100 // Add or subtract |value| from a TimeDelta. The int64_t argument and return
    101 // value are in terms of a microsecond timebase.
    102 BASE_EXPORT int64_t SaturatedAdd(TimeDelta delta, int64_t value);
    103 BASE_EXPORT int64_t SaturatedSub(TimeDelta delta, int64_t value);
    104 
    105 }  // namespace time_internal
    106 
    107 // TimeDelta ------------------------------------------------------------------
    108 
    109 class BASE_EXPORT TimeDelta {
    110  public:
    111   constexpr TimeDelta() : delta_(0) {}
    112 
    113   // Converts units of time to TimeDeltas.
    114   static constexpr TimeDelta FromDays(int days);
    115   static constexpr TimeDelta FromHours(int hours);
    116   static constexpr TimeDelta FromMinutes(int minutes);
    117   static constexpr TimeDelta FromSeconds(int64_t secs);
    118   static constexpr TimeDelta FromMilliseconds(int64_t ms);
    119   static constexpr TimeDelta FromMicroseconds(int64_t us);
    120   static constexpr TimeDelta FromNanoseconds(int64_t ns);
    121   static constexpr TimeDelta FromSecondsD(double secs);
    122   static constexpr TimeDelta FromMillisecondsD(double ms);
    123   static constexpr TimeDelta FromMicrosecondsD(double us);
    124   static constexpr TimeDelta FromNanosecondsD(double ns);
    125 #if defined(OS_WIN)
    126   static TimeDelta FromQPCValue(LONGLONG qpc_value);
    127   static TimeDelta FromFileTime(FILETIME ft);
    128 #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
    129   static TimeDelta FromTimeSpec(const timespec& ts);
    130 #endif
    131 
    132   // Converts an integer value representing TimeDelta to a class. This is used
    133   // when deserializing a |TimeDelta| structure, using a value known to be
    134   // compatible. It is not provided as a constructor because the integer type
    135   // may be unclear from the perspective of a caller.
    136   //
    137   // DEPRECATED - Do not use in new code. http://crbug.com/634507
    138   static constexpr TimeDelta FromInternalValue(int64_t delta) {
    139     return TimeDelta(delta);
    140   }
    141 
    142   // Returns the maximum time delta, which should be greater than any reasonable
    143   // time delta we might compare it to. Adding or subtracting the maximum time
    144   // delta to a time or another time delta has an undefined result.
    145   static constexpr TimeDelta Max();
    146 
    147   // Returns the minimum time delta, which should be less than than any
    148   // reasonable time delta we might compare it to. Adding or subtracting the
    149   // minimum time delta to a time or another time delta has an undefined result.
    150   static constexpr TimeDelta Min();
    151 
    152   // Returns the internal numeric value of the TimeDelta object. Please don't
    153   // use this and do arithmetic on it, as it is more error prone than using the
    154   // provided operators.
    155   // For serializing, use FromInternalValue to reconstitute.
    156   //
    157   // DEPRECATED - Do not use in new code. http://crbug.com/634507
    158   constexpr int64_t ToInternalValue() const { return delta_; }
    159 
    160   // Returns the magnitude (absolute value) of this TimeDelta.
    161   constexpr TimeDelta magnitude() const {
    162     // Some toolchains provide an incomplete C++11 implementation and lack an
    163     // int64_t overload for std::abs().  The following is a simple branchless
    164     // implementation:
    165     const int64_t mask = delta_ >> (sizeof(delta_) * 8 - 1);
    166     return TimeDelta((delta_ + mask) ^ mask);
    167   }
    168 
    169   // Returns true if the time delta is zero.
    170   constexpr bool is_zero() const { return delta_ == 0; }
    171 
    172   // Returns true if the time delta is the maximum/minimum time delta.
    173   constexpr bool is_max() const {
    174     return delta_ == std::numeric_limits<int64_t>::max();
    175   }
    176   constexpr bool is_min() const {
    177     return delta_ == std::numeric_limits<int64_t>::min();
    178   }
    179 
    180 #if defined(OS_POSIX) || defined(OS_FUCHSIA)
    181   struct timespec ToTimeSpec() const;
    182 #endif
    183 
    184   // Returns the time delta in some unit. The InXYZF versions return a floating
    185   // point value. The InXYZ versions return a truncated value (aka rounded
    186   // towards zero, std::trunc() behavior). The InXYZFloored() versions round to
    187   // lesser integers (std::floor() behavior). The XYZRoundedUp() versions round
    188   // up to greater integers (std::ceil() behavior).
    189   int InDays() const;
    190   int InDaysFloored() const;
    191   int InHours() const;
    192   int InMinutes() const;
    193   double InSecondsF() const;
    194   int64_t InSeconds() const;
    195   double InMillisecondsF() const;
    196   int64_t InMilliseconds() const;
    197   int64_t InMillisecondsRoundedUp() const;
    198   int64_t InMicroseconds() const;
    199   double InMicrosecondsF() const;
    200   int64_t InNanoseconds() const;
    201 
    202   constexpr TimeDelta& operator=(TimeDelta other) {
    203     delta_ = other.delta_;
    204     return *this;
    205   }
    206 
    207   // Computations with other deltas. Can easily be made constexpr with C++17 but
    208   // hard to do until then per limitations around
    209   // __builtin_(add|sub)_overflow in safe_math_clang_gcc_impl.h :
    210   // https://chromium-review.googlesource.com/c/chromium/src/+/873352#message-59594ab70827795a67e0780404adf37b4b6c2f14
    211   TimeDelta operator+(TimeDelta other) const {
    212     return TimeDelta(time_internal::SaturatedAdd(*this, other.delta_));
    213   }
    214   TimeDelta operator-(TimeDelta other) const {
    215     return TimeDelta(time_internal::SaturatedSub(*this, other.delta_));
    216   }
    217 
    218   TimeDelta& operator+=(TimeDelta other) {
    219     return *this = (*this + other);
    220   }
    221   TimeDelta& operator-=(TimeDelta other) {
    222     return *this = (*this - other);
    223   }
    224   constexpr TimeDelta operator-() const { return TimeDelta(-delta_); }
    225 
    226   // Computations with numeric types. operator*() isn't constexpr because of a
    227   // limitation around __builtin_mul_overflow (but operator/(1.0/a) works for
    228   // |a|'s of "reasonable" size -- i.e. that don't risk overflow).
    229   template <typename T>
    230   TimeDelta operator*(T a) const {
    231     CheckedNumeric<int64_t> rv(delta_);
    232     rv *= a;
    233     if (rv.IsValid())
    234       return TimeDelta(rv.ValueOrDie());
    235     // Matched sign overflows. Mismatched sign underflows.
    236     if ((delta_ < 0) ^ (a < 0))
    237       return TimeDelta(std::numeric_limits<int64_t>::min());
    238     return TimeDelta(std::numeric_limits<int64_t>::max());
    239   }
    240   template <typename T>
    241   constexpr TimeDelta operator/(T a) const {
    242     CheckedNumeric<int64_t> rv(delta_);
    243     rv /= a;
    244     if (rv.IsValid())
    245       return TimeDelta(rv.ValueOrDie());
    246     // Matched sign overflows. Mismatched sign underflows.
    247     // Special case to catch divide by zero.
    248     if ((delta_ < 0) ^ (a <= 0))
    249       return TimeDelta(std::numeric_limits<int64_t>::min());
    250     return TimeDelta(std::numeric_limits<int64_t>::max());
    251   }
    252   template <typename T>
    253   TimeDelta& operator*=(T a) {
    254     return *this = (*this * a);
    255   }
    256   template <typename T>
    257   constexpr TimeDelta& operator/=(T a) {
    258     return *this = (*this / a);
    259   }
    260 
    261   constexpr int64_t operator/(TimeDelta a) const { return delta_ / a.delta_; }
    262   constexpr TimeDelta operator%(TimeDelta a) const {
    263     return TimeDelta(delta_ % a.delta_);
    264   }
    265 
    266   // Comparison operators.
    267   constexpr bool operator==(TimeDelta other) const {
    268     return delta_ == other.delta_;
    269   }
    270   constexpr bool operator!=(TimeDelta other) const {
    271     return delta_ != other.delta_;
    272   }
    273   constexpr bool operator<(TimeDelta other) const {
    274     return delta_ < other.delta_;
    275   }
    276   constexpr bool operator<=(TimeDelta other) const {
    277     return delta_ <= other.delta_;
    278   }
    279   constexpr bool operator>(TimeDelta other) const {
    280     return delta_ > other.delta_;
    281   }
    282   constexpr bool operator>=(TimeDelta other) const {
    283     return delta_ >= other.delta_;
    284   }
    285 
    286 #if defined(OS_WIN)
    287   // This works around crbug.com/635974
    288   constexpr TimeDelta(const TimeDelta& other) : delta_(other.delta_) {}
    289 #endif
    290 
    291  private:
    292   friend int64_t time_internal::SaturatedAdd(TimeDelta delta, int64_t value);
    293   friend int64_t time_internal::SaturatedSub(TimeDelta delta, int64_t value);
    294 
    295   // Constructs a delta given the duration in microseconds. This is private
    296   // to avoid confusion by callers with an integer constructor. Use
    297   // FromSeconds, FromMilliseconds, etc. instead.
    298   constexpr explicit TimeDelta(int64_t delta_us) : delta_(delta_us) {}
    299 
    300   // Private method to build a delta from a double.
    301   static constexpr TimeDelta FromDouble(double value);
    302 
    303   // Private method to build a delta from the product of a user-provided value
    304   // and a known-positive value.
    305   static constexpr TimeDelta FromProduct(int64_t value, int64_t positive_value);
    306 
    307   // Delta in microseconds.
    308   int64_t delta_;
    309 };
    310 
    311 template <typename T>
    312 TimeDelta operator*(T a, TimeDelta td) {
    313   return td * a;
    314 }
    315 
    316 // For logging use only.
    317 BASE_EXPORT std::ostream& operator<<(std::ostream& os, TimeDelta time_delta);
    318 
    319 // Do not reference the time_internal::TimeBase template class directly.  Please
    320 // use one of the time subclasses instead, and only reference the public
    321 // TimeBase members via those classes.
    322 namespace time_internal {
    323 
    324 // TimeBase--------------------------------------------------------------------
    325 
    326 // Provides value storage and comparison/math operations common to all time
    327 // classes. Each subclass provides for strong type-checking to ensure
    328 // semantically meaningful comparison/math of time values from the same clock
    329 // source or timeline.
    330 template<class TimeClass>
    331 class TimeBase {
    332  public:
    333   static const int64_t kHoursPerDay = 24;
    334   static const int64_t kMillisecondsPerSecond = 1000;
    335   static const int64_t kMillisecondsPerDay =
    336       kMillisecondsPerSecond * 60 * 60 * kHoursPerDay;
    337   static const int64_t kMicrosecondsPerMillisecond = 1000;
    338   static const int64_t kMicrosecondsPerSecond =
    339       kMicrosecondsPerMillisecond * kMillisecondsPerSecond;
    340   static const int64_t kMicrosecondsPerMinute = kMicrosecondsPerSecond * 60;
    341   static const int64_t kMicrosecondsPerHour = kMicrosecondsPerMinute * 60;
    342   static const int64_t kMicrosecondsPerDay =
    343       kMicrosecondsPerHour * kHoursPerDay;
    344   static const int64_t kMicrosecondsPerWeek = kMicrosecondsPerDay * 7;
    345   static const int64_t kNanosecondsPerMicrosecond = 1000;
    346   static const int64_t kNanosecondsPerSecond =
    347       kNanosecondsPerMicrosecond * kMicrosecondsPerSecond;
    348 
    349   // Returns true if this object has not been initialized.
    350   //
    351   // Warning: Be careful when writing code that performs math on time values,
    352   // since it's possible to produce a valid "zero" result that should not be
    353   // interpreted as a "null" value.
    354   bool is_null() const {
    355     return us_ == 0;
    356   }
    357 
    358   // Returns true if this object represents the maximum/minimum time.
    359   bool is_max() const { return us_ == std::numeric_limits<int64_t>::max(); }
    360   bool is_min() const { return us_ == std::numeric_limits<int64_t>::min(); }
    361 
    362   // Returns the maximum/minimum times, which should be greater/less than than
    363   // any reasonable time with which we might compare it.
    364   static TimeClass Max() {
    365     return TimeClass(std::numeric_limits<int64_t>::max());
    366   }
    367 
    368   static TimeClass Min() {
    369     return TimeClass(std::numeric_limits<int64_t>::min());
    370   }
    371 
    372   // For serializing only. Use FromInternalValue() to reconstitute. Please don't
    373   // use this and do arithmetic on it, as it is more error prone than using the
    374   // provided operators.
    375   //
    376   // DEPRECATED - Do not use in new code. For serializing Time values, prefer
    377   // Time::ToDeltaSinceWindowsEpoch().InMicroseconds(). http://crbug.com/634507
    378   int64_t ToInternalValue() const { return us_; }
    379 
    380   // The amount of time since the origin (or "zero") point. This is a syntactic
    381   // convenience to aid in code readability, mainly for debugging/testing use
    382   // cases.
    383   //
    384   // Warning: While the Time subclass has a fixed origin point, the origin for
    385   // the other subclasses can vary each time the application is restarted.
    386   TimeDelta since_origin() const { return TimeDelta::FromMicroseconds(us_); }
    387 
    388   TimeClass& operator=(TimeClass other) {
    389     us_ = other.us_;
    390     return *(static_cast<TimeClass*>(this));
    391   }
    392 
    393   // Compute the difference between two times.
    394   TimeDelta operator-(TimeClass other) const {
    395     return TimeDelta::FromMicroseconds(us_ - other.us_);
    396   }
    397 
    398   // Return a new time modified by some delta.
    399   TimeClass operator+(TimeDelta delta) const {
    400     return TimeClass(time_internal::SaturatedAdd(delta, us_));
    401   }
    402   TimeClass operator-(TimeDelta delta) const {
    403     return TimeClass(-time_internal::SaturatedSub(delta, us_));
    404   }
    405 
    406   // Modify by some time delta.
    407   TimeClass& operator+=(TimeDelta delta) {
    408     return static_cast<TimeClass&>(*this = (*this + delta));
    409   }
    410   TimeClass& operator-=(TimeDelta delta) {
    411     return static_cast<TimeClass&>(*this = (*this - delta));
    412   }
    413 
    414   // Comparison operators
    415   bool operator==(TimeClass other) const {
    416     return us_ == other.us_;
    417   }
    418   bool operator!=(TimeClass other) const {
    419     return us_ != other.us_;
    420   }
    421   bool operator<(TimeClass other) const {
    422     return us_ < other.us_;
    423   }
    424   bool operator<=(TimeClass other) const {
    425     return us_ <= other.us_;
    426   }
    427   bool operator>(TimeClass other) const {
    428     return us_ > other.us_;
    429   }
    430   bool operator>=(TimeClass other) const {
    431     return us_ >= other.us_;
    432   }
    433 
    434  protected:
    435   constexpr explicit TimeBase(int64_t us) : us_(us) {}
    436 
    437   // Time value in a microsecond timebase.
    438   int64_t us_;
    439 };
    440 
    441 }  // namespace time_internal
    442 
    443 template<class TimeClass>
    444 inline TimeClass operator+(TimeDelta delta, TimeClass t) {
    445   return t + delta;
    446 }
    447 
    448 // Time -----------------------------------------------------------------------
    449 
    450 // Represents a wall clock time in UTC. Values are not guaranteed to be
    451 // monotonically non-decreasing and are subject to large amounts of skew.
    452 class BASE_EXPORT Time : public time_internal::TimeBase<Time> {
    453  public:
    454   // Offset of UNIX epoch (1970-01-01 00:00:00 UTC) from Windows FILETIME epoch
    455   // (1601-01-01 00:00:00 UTC), in microseconds. This value is derived from the
    456   // following: ((1970-1601)*365+89)*24*60*60*1000*1000, where 89 is the number
    457   // of leap year days between 1601 and 1970: (1970-1601)/4 excluding 1700,
    458   // 1800, and 1900.
    459   static constexpr int64_t kTimeTToMicrosecondsOffset =
    460       INT64_C(11644473600000000);
    461 
    462 #if defined(OS_WIN)
    463   // To avoid overflow in QPC to Microseconds calculations, since we multiply
    464   // by kMicrosecondsPerSecond, then the QPC value should not exceed
    465   // (2^63 - 1) / 1E6. If it exceeds that threshold, we divide then multiply.
    466   static constexpr int64_t kQPCOverflowThreshold = INT64_C(0x8637BD05AF7);
    467 #endif
    468 
    469 // kExplodedMinYear and kExplodedMaxYear define the platform-specific limits
    470 // for values passed to FromUTCExploded() and FromLocalExploded(). Those
    471 // functions will return false if passed values outside these limits. The limits
    472 // are inclusive, meaning that the API should support all dates within a given
    473 // limit year.
    474 #if defined(OS_WIN)
    475   static constexpr int kExplodedMinYear = 1601;
    476   static constexpr int kExplodedMaxYear = 30827;
    477 #elif defined(OS_IOS)
    478   static constexpr int kExplodedMinYear = std::numeric_limits<int>::min();
    479   static constexpr int kExplodedMaxYear = std::numeric_limits<int>::max();
    480 #elif defined(OS_MACOSX)
    481   static constexpr int kExplodedMinYear = 1902;
    482   static constexpr int kExplodedMaxYear = std::numeric_limits<int>::max();
    483 #elif defined(OS_ANDROID)
    484   // Though we use 64-bit time APIs on both 32 and 64 bit Android, some OS
    485   // versions like KitKat (ARM but not x86 emulator) can't handle some early
    486   // dates (e.g. before 1170). So we set min conservatively here.
    487   static constexpr int kExplodedMinYear = 1902;
    488   static constexpr int kExplodedMaxYear = std::numeric_limits<int>::max();
    489 #else
    490   static constexpr int kExplodedMinYear =
    491       (sizeof(time_t) == 4 ? 1902 : std::numeric_limits<int>::min());
    492   static constexpr int kExplodedMaxYear =
    493       (sizeof(time_t) == 4 ? 2037 : std::numeric_limits<int>::max());
    494 #endif
    495 
    496   // Represents an exploded time that can be formatted nicely. This is kind of
    497   // like the Win32 SYSTEMTIME structure or the Unix "struct tm" with a few
    498   // additions and changes to prevent errors.
    499   struct BASE_EXPORT Exploded {
    500     int year;          // Four digit year "2007"
    501     int month;         // 1-based month (values 1 = January, etc.)
    502     int day_of_week;   // 0-based day of week (0 = Sunday, etc.)
    503     int day_of_month;  // 1-based day of month (1-31)
    504     int hour;          // Hour within the current day (0-23)
    505     int minute;        // Minute within the current hour (0-59)
    506     int second;        // Second within the current minute (0-59 plus leap
    507                        //   seconds which may take it up to 60).
    508     int millisecond;   // Milliseconds within the current second (0-999)
    509 
    510     // A cursory test for whether the data members are within their
    511     // respective ranges. A 'true' return value does not guarantee the
    512     // Exploded value can be successfully converted to a Time value.
    513     bool HasValidValues() const;
    514   };
    515 
    516   // Contains the NULL time. Use Time::Now() to get the current time.
    517   constexpr Time() : TimeBase(0) {}
    518 
    519   // Returns the time for epoch in Unix-like system (Jan 1, 1970).
    520   static Time UnixEpoch();
    521 
    522   // Returns the current time. Watch out, the system might adjust its clock
    523   // in which case time will actually go backwards. We don't guarantee that
    524   // times are increasing, or that two calls to Now() won't be the same.
    525   static Time Now();
    526 
    527   // Returns the current time. Same as Now() except that this function always
    528   // uses system time so that there are no discrepancies between the returned
    529   // time and system time even on virtual environments including our test bot.
    530   // For timing sensitive unittests, this function should be used.
    531   static Time NowFromSystemTime();
    532 
    533   // Converts to/from TimeDeltas relative to the Windows epoch (1601-01-01
    534   // 00:00:00 UTC). Prefer these methods for opaque serialization and
    535   // deserialization of time values, e.g.
    536   //
    537   //   // Serialization:
    538   //   base::Time last_updated = ...;
    539   //   SaveToDatabase(last_updated.ToDeltaSinceWindowsEpoch().InMicroseconds());
    540   //
    541   //   // Deserialization:
    542   //   base::Time last_updated = base::Time::FromDeltaSinceWindowsEpoch(
    543   //       base::TimeDelta::FromMicroseconds(LoadFromDatabase()));
    544   static Time FromDeltaSinceWindowsEpoch(TimeDelta delta);
    545   TimeDelta ToDeltaSinceWindowsEpoch() const;
    546 
    547   // Converts to/from time_t in UTC and a Time class.
    548   static Time FromTimeT(time_t tt);
    549   time_t ToTimeT() const;
    550 
    551   // Converts time to/from a double which is the number of seconds since epoch
    552   // (Jan 1, 1970).  Webkit uses this format to represent time.
    553   // Because WebKit initializes double time value to 0 to indicate "not
    554   // initialized", we map it to empty Time object that also means "not
    555   // initialized".
    556   static Time FromDoubleT(double dt);
    557   double ToDoubleT() const;
    558 
    559 #if defined(OS_POSIX) || defined(OS_FUCHSIA)
    560   // Converts the timespec structure to time. MacOS X 10.8.3 (and tentatively,
    561   // earlier versions) will have the |ts|'s tv_nsec component zeroed out,
    562   // having a 1 second resolution, which agrees with
    563   // https://developer.apple.com/legacy/library/#technotes/tn/tn1150.html#HFSPlusDates.
    564   static Time FromTimeSpec(const timespec& ts);
    565 #endif
    566 
    567   // Converts to/from the Javascript convention for times, a number of
    568   // milliseconds since the epoch:
    569   // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/getTime.
    570   static Time FromJsTime(double ms_since_epoch);
    571   double ToJsTime() const;
    572 
    573   // Converts to/from Java convention for times, a number of milliseconds since
    574   // the epoch. Because the Java format has less resolution, converting to Java
    575   // time is a lossy operation.
    576   static Time FromJavaTime(int64_t ms_since_epoch);
    577   int64_t ToJavaTime() const;
    578 
    579 #if defined(OS_POSIX) || defined(OS_FUCHSIA)
    580   static Time FromTimeVal(struct timeval t);
    581   struct timeval ToTimeVal() const;
    582 #endif
    583 
    584 #if defined(OS_MACOSX)
    585   static Time FromCFAbsoluteTime(CFAbsoluteTime t);
    586   CFAbsoluteTime ToCFAbsoluteTime() const;
    587 #endif
    588 
    589 #if defined(OS_WIN)
    590   static Time FromFileTime(FILETIME ft);
    591   FILETIME ToFileTime() const;
    592 
    593   // The minimum time of a low resolution timer.  This is basically a windows
    594   // constant of ~15.6ms.  While it does vary on some older OS versions, we'll
    595   // treat it as static across all windows versions.
    596   static const int kMinLowResolutionThresholdMs = 16;
    597 
    598   // Enable or disable Windows high resolution timer.
    599   static void EnableHighResolutionTimer(bool enable);
    600 
    601   // Activates or deactivates the high resolution timer based on the |activate|
    602   // flag.  If the HighResolutionTimer is not Enabled (see
    603   // EnableHighResolutionTimer), this function will return false.  Otherwise
    604   // returns true.  Each successful activate call must be paired with a
    605   // subsequent deactivate call.
    606   // All callers to activate the high resolution timer must eventually call
    607   // this function to deactivate the high resolution timer.
    608   static bool ActivateHighResolutionTimer(bool activate);
    609 
    610   // Returns true if the high resolution timer is both enabled and activated.
    611   // This is provided for testing only, and is not tracked in a thread-safe
    612   // way.
    613   static bool IsHighResolutionTimerInUse();
    614 
    615   // The following two functions are used to report the fraction of elapsed time
    616   // that the high resolution timer is activated.
    617   // ResetHighResolutionTimerUsage() resets the cumulative usage and starts the
    618   // measurement interval and GetHighResolutionTimerUsage() returns the
    619   // percentage of time since the reset that the high resolution timer was
    620   // activated.
    621   // ResetHighResolutionTimerUsage() must be called at least once before calling
    622   // GetHighResolutionTimerUsage(); otherwise the usage result would be
    623   // undefined.
    624   static void ResetHighResolutionTimerUsage();
    625   static double GetHighResolutionTimerUsage();
    626 #endif  // defined(OS_WIN)
    627 
    628   // Converts an exploded structure representing either the local time or UTC
    629   // into a Time class. Returns false on a failure when, for example, a day of
    630   // month is set to 31 on a 28-30 day month. Returns Time(0) on overflow.
    631   static bool FromUTCExploded(const Exploded& exploded,
    632                               Time* time) WARN_UNUSED_RESULT {
    633     return FromExploded(false, exploded, time);
    634   }
    635   static bool FromLocalExploded(const Exploded& exploded,
    636                                 Time* time) WARN_UNUSED_RESULT {
    637     return FromExploded(true, exploded, time);
    638   }
    639 
    640   // Converts a string representation of time to a Time object.
    641   // An example of a time string which is converted is as below:-
    642   // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified
    643   // in the input string, FromString assumes local time and FromUTCString
    644   // assumes UTC. A timezone that cannot be parsed (e.g. "UTC" which is not
    645   // specified in RFC822) is treated as if the timezone is not specified.
    646   // TODO(iyengar) Move the FromString/FromTimeT/ToTimeT/FromFileTime to
    647   // a new time converter class.
    648   static bool FromString(const char* time_string,
    649                          Time* parsed_time) WARN_UNUSED_RESULT {
    650     return FromStringInternal(time_string, true, parsed_time);
    651   }
    652   static bool FromUTCString(const char* time_string,
    653                             Time* parsed_time) WARN_UNUSED_RESULT {
    654     return FromStringInternal(time_string, false, parsed_time);
    655   }
    656 
    657   // Fills the given exploded structure with either the local time or UTC from
    658   // this time structure (containing UTC).
    659   void UTCExplode(Exploded* exploded) const {
    660     return Explode(false, exploded);
    661   }
    662   void LocalExplode(Exploded* exploded) const {
    663     return Explode(true, exploded);
    664   }
    665 
    666   // Rounds this time down to the nearest day in local time. It will represent
    667   // midnight on that day.
    668   Time LocalMidnight() const;
    669 
    670   // Converts an integer value representing Time to a class. This may be used
    671   // when deserializing a |Time| structure, using a value known to be
    672   // compatible. It is not provided as a constructor because the integer type
    673   // may be unclear from the perspective of a caller.
    674   //
    675   // DEPRECATED - Do not use in new code. For deserializing Time values, prefer
    676   // Time::FromDeltaSinceWindowsEpoch(). http://crbug.com/634507
    677   static constexpr Time FromInternalValue(int64_t us) { return Time(us); }
    678 
    679  private:
    680   friend class time_internal::TimeBase<Time>;
    681 
    682   constexpr explicit Time(int64_t us) : TimeBase(us) {}
    683 
    684   // Explodes the given time to either local time |is_local = true| or UTC
    685   // |is_local = false|.
    686   void Explode(bool is_local, Exploded* exploded) const;
    687 
    688   // Unexplodes a given time assuming the source is either local time
    689   // |is_local = true| or UTC |is_local = false|. Function returns false on
    690   // failure and sets |time| to Time(0). Otherwise returns true and sets |time|
    691   // to non-exploded time.
    692   static bool FromExploded(bool is_local,
    693                            const Exploded& exploded,
    694                            Time* time) WARN_UNUSED_RESULT;
    695 
    696   // Converts a string representation of time to a Time object.
    697   // An example of a time string which is converted is as below:-
    698   // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified
    699   // in the input string, local time |is_local = true| or
    700   // UTC |is_local = false| is assumed. A timezone that cannot be parsed
    701   // (e.g. "UTC" which is not specified in RFC822) is treated as if the
    702   // timezone is not specified.
    703   static bool FromStringInternal(const char* time_string,
    704                                  bool is_local,
    705                                  Time* parsed_time) WARN_UNUSED_RESULT;
    706 
    707   // Comparison does not consider |day_of_week| when doing the operation.
    708   static bool ExplodedMostlyEquals(const Exploded& lhs,
    709                                    const Exploded& rhs) WARN_UNUSED_RESULT;
    710 };
    711 
    712 // static
    713 constexpr TimeDelta TimeDelta::FromDays(int days) {
    714   return days == std::numeric_limits<int>::max()
    715              ? Max()
    716              : TimeDelta(days * Time::kMicrosecondsPerDay);
    717 }
    718 
    719 // static
    720 constexpr TimeDelta TimeDelta::FromHours(int hours) {
    721   return hours == std::numeric_limits<int>::max()
    722              ? Max()
    723              : TimeDelta(hours * Time::kMicrosecondsPerHour);
    724 }
    725 
    726 // static
    727 constexpr TimeDelta TimeDelta::FromMinutes(int minutes) {
    728   return minutes == std::numeric_limits<int>::max()
    729              ? Max()
    730              : TimeDelta(minutes * Time::kMicrosecondsPerMinute);
    731 }
    732 
    733 // static
    734 constexpr TimeDelta TimeDelta::FromSeconds(int64_t secs) {
    735   return FromProduct(secs, Time::kMicrosecondsPerSecond);
    736 }
    737 
    738 // static
    739 constexpr TimeDelta TimeDelta::FromMilliseconds(int64_t ms) {
    740   return FromProduct(ms, Time::kMicrosecondsPerMillisecond);
    741 }
    742 
    743 // static
    744 constexpr TimeDelta TimeDelta::FromMicroseconds(int64_t us) {
    745   return TimeDelta(us);
    746 }
    747 
    748 // static
    749 constexpr TimeDelta TimeDelta::FromNanoseconds(int64_t ns) {
    750   return TimeDelta(ns / Time::kNanosecondsPerMicrosecond);
    751 }
    752 
    753 // static
    754 constexpr TimeDelta TimeDelta::FromSecondsD(double secs) {
    755   return FromDouble(secs * Time::kMicrosecondsPerSecond);
    756 }
    757 
    758 // static
    759 constexpr TimeDelta TimeDelta::FromMillisecondsD(double ms) {
    760   return FromDouble(ms * Time::kMicrosecondsPerMillisecond);
    761 }
    762 
    763 // static
    764 constexpr TimeDelta TimeDelta::FromMicrosecondsD(double us) {
    765   return FromDouble(us);
    766 }
    767 
    768 // static
    769 constexpr TimeDelta TimeDelta::FromNanosecondsD(double ns) {
    770   return FromDouble(ns / Time::kNanosecondsPerMicrosecond);
    771 }
    772 
    773 // static
    774 constexpr TimeDelta TimeDelta::Max() {
    775   return TimeDelta(std::numeric_limits<int64_t>::max());
    776 }
    777 
    778 // static
    779 constexpr TimeDelta TimeDelta::Min() {
    780   return TimeDelta(std::numeric_limits<int64_t>::min());
    781 }
    782 
    783 // static
    784 constexpr TimeDelta TimeDelta::FromDouble(double value) {
    785   // TODO(crbug.com/612601): Use saturated_cast<int64_t>(value) once we sort out
    786   // the Min() behavior.
    787   return value > std::numeric_limits<int64_t>::max()
    788              ? Max()
    789              : value < std::numeric_limits<int64_t>::min()
    790                    ? Min()
    791                    : TimeDelta(static_cast<int64_t>(value));
    792 }
    793 
    794 // static
    795 constexpr TimeDelta TimeDelta::FromProduct(int64_t value,
    796                                            int64_t positive_value) {
    797   DCHECK(positive_value > 0);
    798   return value > std::numeric_limits<int64_t>::max() / positive_value
    799              ? Max()
    800              : value < std::numeric_limits<int64_t>::min() / positive_value
    801                    ? Min()
    802                    : TimeDelta(value * positive_value);
    803 }
    804 
    805 // For logging use only.
    806 BASE_EXPORT std::ostream& operator<<(std::ostream& os, Time time);
    807 
    808 // TimeTicks ------------------------------------------------------------------
    809 
    810 // Represents monotonically non-decreasing clock time.
    811 class BASE_EXPORT TimeTicks : public time_internal::TimeBase<TimeTicks> {
    812  public:
    813   // The underlying clock used to generate new TimeTicks.
    814   enum class Clock {
    815     FUCHSIA_ZX_CLOCK_MONOTONIC,
    816     LINUX_CLOCK_MONOTONIC,
    817     IOS_CF_ABSOLUTE_TIME_MINUS_KERN_BOOTTIME,
    818     MAC_MACH_ABSOLUTE_TIME,
    819     WIN_QPC,
    820     WIN_ROLLOVER_PROTECTED_TIME_GET_TIME
    821   };
    822 
    823   constexpr TimeTicks() : TimeBase(0) {}
    824 
    825   // Platform-dependent tick count representing "right now." When
    826   // IsHighResolution() returns false, the resolution of the clock could be
    827   // as coarse as ~15.6ms. Otherwise, the resolution should be no worse than one
    828   // microsecond.
    829   static TimeTicks Now();
    830 
    831   // Returns true if the high resolution clock is working on this system and
    832   // Now() will return high resolution values. Note that, on systems where the
    833   // high resolution clock works but is deemed inefficient, the low resolution
    834   // clock will be used instead.
    835   static bool IsHighResolution() WARN_UNUSED_RESULT;
    836 
    837   // Returns true if TimeTicks is consistent across processes, meaning that
    838   // timestamps taken on different processes can be safely compared with one
    839   // another. (Note that, even on platforms where this returns true, time values
    840   // from different threads that are within one tick of each other must be
    841   // considered to have an ambiguous ordering.)
    842   static bool IsConsistentAcrossProcesses() WARN_UNUSED_RESULT;
    843 
    844 #if defined(OS_FUCHSIA)
    845   // Converts between TimeTicks and an ZX_CLOCK_MONOTONIC zx_time_t value.
    846   static TimeTicks FromZxTime(zx_time_t nanos_since_boot);
    847   zx_time_t ToZxTime() const;
    848 #endif
    849 
    850 #if defined(OS_WIN)
    851   // Translates an absolute QPC timestamp into a TimeTicks value. The returned
    852   // value has the same origin as Now(). Do NOT attempt to use this if
    853   // IsHighResolution() returns false.
    854   static TimeTicks FromQPCValue(LONGLONG qpc_value);
    855 #endif
    856 
    857 #if defined(OS_MACOSX) && !defined(OS_IOS)
    858   static TimeTicks FromMachAbsoluteTime(uint64_t mach_absolute_time);
    859 #endif  // defined(OS_MACOSX) && !defined(OS_IOS)
    860 
    861 #if defined(OS_ANDROID)
    862   // Converts to TimeTicks the value obtained from SystemClock.uptimeMillis().
    863   // Note: this convertion may be non-monotonic in relation to previously
    864   // obtained TimeTicks::Now() values because of the truncation (to
    865   // milliseconds) performed by uptimeMillis().
    866   static TimeTicks FromUptimeMillis(jlong uptime_millis_value);
    867 #endif
    868 
    869   // Get an estimate of the TimeTick value at the time of the UnixEpoch. Because
    870   // Time and TimeTicks respond differently to user-set time and NTP
    871   // adjustments, this number is only an estimate. Nevertheless, this can be
    872   // useful when you need to relate the value of TimeTicks to a real time and
    873   // date. Note: Upon first invocation, this function takes a snapshot of the
    874   // realtime clock to establish a reference point.  This function will return
    875   // the same value for the duration of the application, but will be different
    876   // in future application runs.
    877   static TimeTicks UnixEpoch();
    878 
    879   // Returns |this| snapped to the next tick, given a |tick_phase| and
    880   // repeating |tick_interval| in both directions. |this| may be before,
    881   // after, or equal to the |tick_phase|.
    882   TimeTicks SnappedToNextTick(TimeTicks tick_phase,
    883                               TimeDelta tick_interval) const;
    884 
    885   // Returns an enum indicating the underlying clock being used to generate
    886   // TimeTicks timestamps. This function should only be used for debugging and
    887   // logging purposes.
    888   static Clock GetClock();
    889 
    890   // Converts an integer value representing TimeTicks to a class. This may be
    891   // used when deserializing a |TimeTicks| structure, using a value known to be
    892   // compatible. It is not provided as a constructor because the integer type
    893   // may be unclear from the perspective of a caller.
    894   //
    895   // DEPRECATED - Do not use in new code. For deserializing TimeTicks values,
    896   // prefer TimeTicks + TimeDelta(). http://crbug.com/634507
    897   static constexpr TimeTicks FromInternalValue(int64_t us) {
    898     return TimeTicks(us);
    899   }
    900 
    901 #if defined(OS_WIN)
    902  protected:
    903   typedef DWORD (*TickFunctionType)(void);
    904   static TickFunctionType SetMockTickFunction(TickFunctionType ticker);
    905 #endif
    906 
    907  private:
    908   friend class time_internal::TimeBase<TimeTicks>;
    909 
    910   // Please use Now() to create a new object. This is for internal use
    911   // and testing.
    912   constexpr explicit TimeTicks(int64_t us) : TimeBase(us) {}
    913 };
    914 
    915 // For logging use only.
    916 BASE_EXPORT std::ostream& operator<<(std::ostream& os, TimeTicks time_ticks);
    917 
    918 // ThreadTicks ----------------------------------------------------------------
    919 
    920 // Represents a clock, specific to a particular thread, than runs only while the
    921 // thread is running.
    922 class BASE_EXPORT ThreadTicks : public time_internal::TimeBase<ThreadTicks> {
    923  public:
    924   ThreadTicks() : TimeBase(0) {
    925   }
    926 
    927   // Returns true if ThreadTicks::Now() is supported on this system.
    928   static bool IsSupported() WARN_UNUSED_RESULT {
    929 #if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
    930     (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_ANDROID) ||  \
    931     defined(OS_FUCHSIA)
    932     return true;
    933 #elif defined(OS_WIN)
    934     return IsSupportedWin();
    935 #else
    936     return false;
    937 #endif
    938   }
    939 
    940   // Waits until the initialization is completed. Needs to be guarded with a
    941   // call to IsSupported().
    942   static void WaitUntilInitialized() {
    943 #if defined(OS_WIN)
    944     WaitUntilInitializedWin();
    945 #endif
    946   }
    947 
    948   // Returns thread-specific CPU-time on systems that support this feature.
    949   // Needs to be guarded with a call to IsSupported(). Use this timer
    950   // to (approximately) measure how much time the calling thread spent doing
    951   // actual work vs. being de-scheduled. May return bogus results if the thread
    952   // migrates to another CPU between two calls. Returns an empty ThreadTicks
    953   // object until the initialization is completed. If a clock reading is
    954   // absolutely needed, call WaitUntilInitialized() before this method.
    955   static ThreadTicks Now();
    956 
    957 #if defined(OS_WIN)
    958   // Similar to Now() above except this returns thread-specific CPU time for an
    959   // arbitrary thread. All comments for Now() method above apply apply to this
    960   // method as well.
    961   static ThreadTicks GetForThread(const PlatformThreadHandle& thread_handle);
    962 #endif
    963 
    964   // Converts an integer value representing ThreadTicks to a class. This may be
    965   // used when deserializing a |ThreadTicks| structure, using a value known to
    966   // be compatible. It is not provided as a constructor because the integer type
    967   // may be unclear from the perspective of a caller.
    968   //
    969   // DEPRECATED - Do not use in new code. For deserializing ThreadTicks values,
    970   // prefer ThreadTicks + TimeDelta(). http://crbug.com/634507
    971   static constexpr ThreadTicks FromInternalValue(int64_t us) {
    972     return ThreadTicks(us);
    973   }
    974 
    975  private:
    976   friend class time_internal::TimeBase<ThreadTicks>;
    977 
    978   // Please use Now() or GetForThread() to create a new object. This is for
    979   // internal use and testing.
    980   constexpr explicit ThreadTicks(int64_t us) : TimeBase(us) {}
    981 
    982 #if defined(OS_WIN)
    983   FRIEND_TEST_ALL_PREFIXES(TimeTicks, TSCTicksPerSecond);
    984 
    985   // Returns the frequency of the TSC in ticks per second, or 0 if it hasn't
    986   // been measured yet. Needs to be guarded with a call to IsSupported().
    987   // This method is declared here rather than in the anonymous namespace to
    988   // allow testing.
    989   static double TSCTicksPerSecond();
    990 
    991   static bool IsSupportedWin() WARN_UNUSED_RESULT;
    992   static void WaitUntilInitializedWin();
    993 #endif
    994 };
    995 
    996 // For logging use only.
    997 BASE_EXPORT std::ostream& operator<<(std::ostream& os, ThreadTicks time_ticks);
    998 
    999 }  // namespace base
   1000 
   1001 #endif  // BASE_TIME_TIME_H_
   1002