1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Time represents an absolute point in coordinated universal time (UTC), 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// internally represented as microseconds (s/1,000,000) since the Windows epoch 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// (1601-01-01 00:00:00 UTC). System-dependent clock interface routines are 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// defined in time_PLATFORM.cc. Note that values for Time may skew and jump 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// around as the operating system makes adjustments to synchronize (e.g., with 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// NTP servers). Thus, client code that uses the Time class must account for 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// this. 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TimeDelta represents a duration of time, internally represented in 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// microseconds. 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 160d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// TimeTicks and ThreadTicks represent an abstract time that is most of the time 170d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// incrementing, for use in measuring time durations. Internally, they are 180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// represented in microseconds. They can not be converted to a human-readable 190d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// time, but are guaranteed not to decrease (unlike the Time class). Note that 200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// TimeTicks may "stand still" (e.g., if the computer is suspended), and 210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// ThreadTicks will "stand still" whenever the thread has been de-scheduled by 220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// the operating system. 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// All time classes are copyable, assignable, and occupy 64-bits per 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// instance. Thus, they can be efficiently passed by-value (as opposed to 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// by-reference). 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Definitions of operator<< are provided to make these types work with 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// DCHECK_EQ() and other log macros. For human-readable formatting, see 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// "base/i18n/time_formatting.h". 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// So many choices! Which time class should you use? Examples: 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Time: Interpreting the wall-clock time provided by a remote 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// system. Detecting whether cached resources have 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// expired. Providing the user with a display of the current date 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// and time. Determining the amount of time between events across 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// re-boots of the machine. 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TimeTicks: Tracking the amount of time a task runs. Executing delayed 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// tasks at the right time. Computing presentation timestamps. 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Synchronizing audio and video using TimeTicks as a common 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// reference clock (lip-sync). Measuring network round-trip 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// latency. 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// ThreadTicks: Benchmarking how long the current thread has been doing actual 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// work. 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_TIME_TIME_H_ 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_TIME_TIME_H_ 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 520d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stdint.h> 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <time.h> 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <iosfwd> 560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <limits> 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/base_export.h" 590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez#include "base/compiler_specific.h" 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/numerics/safe_math.h" 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "build/build_config.h" 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX) 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <CoreFoundation/CoreFoundation.h> 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Avoid Mac system header macro leak. 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#undef TYPE_BOOL 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_POSIX) 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <unistd.h> 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <sys/time.h> 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// For FILETIME in FromFileTime, until it moves to a new converter class. 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// See TODO(iyengar) below. 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <windows.h> 780d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/gtest_prod_util.h" 790d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 8394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezclass PlatformThreadHandle; 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TimeDelta; 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// The functions in the time_internal namespace are meant to be used only by the 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// time classes and functions. Please use the math operators defined in the 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// time classes instead. 89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace time_internal { 90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 910d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Add or subtract |value| from a TimeDelta. The int64_t argument and return 920d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// value are in terms of a microsecond timebase. 930d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int64_t SaturatedAdd(TimeDelta delta, int64_t value); 940d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int64_t SaturatedSub(TimeDelta delta, int64_t value); 95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 960d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Clamp |value| on overflow and underflow conditions. The int64_t argument and 97b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// return value are in terms of a microsecond timebase. 980d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int64_t FromCheckedNumeric(const CheckedNumeric<int64_t> value); 99b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace time_internal 101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TimeDelta ------------------------------------------------------------------ 103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass BASE_EXPORT TimeDelta { 105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta() : delta_(0) { 107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts units of time to TimeDeltas. 11094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static constexpr TimeDelta FromDays(int days); 11194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static constexpr TimeDelta FromHours(int hours); 11294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static constexpr TimeDelta FromMinutes(int minutes); 11394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static constexpr TimeDelta FromSeconds(int64_t secs); 11494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static constexpr TimeDelta FromMilliseconds(int64_t ms); 11594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static constexpr TimeDelta FromSecondsD(double secs); 11694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static constexpr TimeDelta FromMillisecondsD(double ms); 11794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static constexpr TimeDelta FromMicroseconds(int64_t us); 118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static TimeDelta FromQPCValue(LONGLONG qpc_value); 120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 122b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts an integer value representing TimeDelta to a class. This is used 123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // when deserializing a |TimeDelta| structure, using a value known to be 124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // compatible. It is not provided as a constructor because the integer type 125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // may be unclear from the perspective of a caller. 1260d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static TimeDelta FromInternalValue(int64_t delta) { return TimeDelta(delta); } 127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the maximum time delta, which should be greater than any reasonable 129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // time delta we might compare it to. Adding or subtracting the maximum time 130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // delta to a time or another time delta has an undefined result. 131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static TimeDelta Max(); 132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the internal numeric value of the TimeDelta object. Please don't 134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // use this and do arithmetic on it, as it is more error prone than using the 135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // provided operators. 136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // For serializing, use FromInternalValue to reconstitute. 1370d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t ToInternalValue() const { return delta_; } 138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the magnitude (absolute value) of this TimeDelta. 140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta magnitude() const { 141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Some toolchains provide an incomplete C++11 implementation and lack an 1420d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // int64_t overload for std::abs(). The following is a simple branchless 143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // implementation: 1440d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const int64_t mask = delta_ >> (sizeof(delta_) * 8 - 1); 145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeDelta((delta_ + mask) ^ mask); 146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns true if the time delta is zero. 149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool is_zero() const { 150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return delta_ == 0; 151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns true if the time delta is the maximum time delta. 1540d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko bool is_max() const { return delta_ == std::numeric_limits<int64_t>::max(); } 155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_POSIX) 157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat struct timespec ToTimeSpec() const; 158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the time delta in some unit. The F versions return a floating 161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // point value, the "regular" versions return a rounded-down value. 162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // 163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // InMillisecondsRoundedUp() instead returns an integer that is rounded up 164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // to the next full millisecond. 165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int InDays() const; 166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int InHours() const; 167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int InMinutes() const; 168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double InSecondsF() const; 1690d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t InSeconds() const; 170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double InMillisecondsF() const; 1710d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t InMilliseconds() const; 1720d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t InMillisecondsRoundedUp() const; 1730d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t InMicroseconds() const; 174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta& operator=(TimeDelta other) { 176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat delta_ = other.delta_; 177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return *this; 178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Computations with other deltas. 181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta operator+(TimeDelta other) const { 182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeDelta(time_internal::SaturatedAdd(*this, other.delta_)); 183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta operator-(TimeDelta other) const { 185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeDelta(time_internal::SaturatedSub(*this, other.delta_)); 186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta& operator+=(TimeDelta other) { 189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return *this = (*this + other); 190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta& operator-=(TimeDelta other) { 192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return *this = (*this - other); 193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta operator-() const { 195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeDelta(-delta_); 196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Computations with numeric types. 199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat template<typename T> 200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta operator*(T a) const { 2010d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko CheckedNumeric<int64_t> rv(delta_); 202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat rv *= a; 203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeDelta(time_internal::FromCheckedNumeric(rv)); 204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat template<typename T> 206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta operator/(T a) const { 2070d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko CheckedNumeric<int64_t> rv(delta_); 208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat rv /= a; 209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeDelta(time_internal::FromCheckedNumeric(rv)); 210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat template<typename T> 212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta& operator*=(T a) { 213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return *this = (*this * a); 214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat template<typename T> 216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta& operator/=(T a) { 217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return *this = (*this / a); 218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t operator/(TimeDelta a) const { return delta_ / a.delta_; } 221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta operator%(TimeDelta a) const { 222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeDelta(delta_ % a.delta_); 223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Comparison operators. 22694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez constexpr bool operator==(TimeDelta other) const { 227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return delta_ == other.delta_; 228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 22994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez constexpr bool operator!=(TimeDelta other) const { 230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return delta_ != other.delta_; 231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 23294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez constexpr bool operator<(TimeDelta other) const { 233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return delta_ < other.delta_; 234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 23594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez constexpr bool operator<=(TimeDelta other) const { 236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return delta_ <= other.delta_; 237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 23894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez constexpr bool operator>(TimeDelta other) const { 239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return delta_ > other.delta_; 240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 24194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez constexpr bool operator>=(TimeDelta other) const { 242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return delta_ >= other.delta_; 243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 2460d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko friend int64_t time_internal::SaturatedAdd(TimeDelta delta, int64_t value); 2470d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko friend int64_t time_internal::SaturatedSub(TimeDelta delta, int64_t value); 248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Constructs a delta given the duration in microseconds. This is private 250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // to avoid confusion by callers with an integer constructor. Use 251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // FromSeconds, FromMilliseconds, etc. instead. 25294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez constexpr explicit TimeDelta(int64_t delta_us) : delta_(delta_us) {} 2530d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 2540d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // Private method to build a delta from a double. 25594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static constexpr TimeDelta FromDouble(double value); 25694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 25794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Private method to build a delta from the product of a user-provided value 25894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // and a known-positive value. 25994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static constexpr TimeDelta FromProduct(int64_t value, int64_t positive_value); 260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Delta in microseconds. 2620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t delta_; 263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattemplate<typename T> 266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratinline TimeDelta operator*(T a, TimeDelta td) { 267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return td * a; 268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// For logging use only. 271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT std::ostream& operator<<(std::ostream& os, TimeDelta time_delta); 272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Do not reference the time_internal::TimeBase template class directly. Please 274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// use one of the time subclasses instead, and only reference the public 275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TimeBase members via those classes. 276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace time_internal { 277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TimeBase-------------------------------------------------------------------- 279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Provides value storage and comparison/math operations common to all time 281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// classes. Each subclass provides for strong type-checking to ensure 282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// semantically meaningful comparison/math of time values from the same clock 283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// source or timeline. 284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattemplate<class TimeClass> 285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TimeBase { 286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 2870d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kHoursPerDay = 24; 2880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kMillisecondsPerSecond = 1000; 2890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kMillisecondsPerDay = 2900d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko kMillisecondsPerSecond * 60 * 60 * kHoursPerDay; 2910d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kMicrosecondsPerMillisecond = 1000; 2920d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kMicrosecondsPerSecond = 2930d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko kMicrosecondsPerMillisecond * kMillisecondsPerSecond; 2940d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kMicrosecondsPerMinute = kMicrosecondsPerSecond * 60; 2950d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kMicrosecondsPerHour = kMicrosecondsPerMinute * 60; 2960d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kMicrosecondsPerDay = 2970d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko kMicrosecondsPerHour * kHoursPerDay; 2980d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kMicrosecondsPerWeek = kMicrosecondsPerDay * 7; 2990d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kNanosecondsPerMicrosecond = 1000; 3000d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kNanosecondsPerSecond = 3010d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko kNanosecondsPerMicrosecond * kMicrosecondsPerSecond; 302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns true if this object has not been initialized. 304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // 305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Warning: Be careful when writing code that performs math on time values, 306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // since it's possible to produce a valid "zero" result that should not be 307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // interpreted as a "null" value. 308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool is_null() const { 309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return us_ == 0; 310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns true if this object represents the maximum time. 3130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko bool is_max() const { return us_ == std::numeric_limits<int64_t>::max(); } 314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 3150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Returns the maximum time, which should be greater than any reasonable time 3160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // with which we might compare it. 3170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez static TimeClass Max() { 3180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez return TimeClass(std::numeric_limits<int64_t>::max()); 3190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 3200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // For serializing only. Use FromInternalValue() to reconstitute. Please don't 322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // use this and do arithmetic on it, as it is more error prone than using the 323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // provided operators. 3240d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t ToInternalValue() const { return us_; } 325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeClass& operator=(TimeClass other) { 327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat us_ = other.us_; 328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return *(static_cast<TimeClass*>(this)); 329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Compute the difference between two times. 332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta operator-(TimeClass other) const { 333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeDelta::FromMicroseconds(us_ - other.us_); 334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Return a new time modified by some delta. 337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeClass operator+(TimeDelta delta) const { 338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeClass(time_internal::SaturatedAdd(delta, us_)); 339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeClass operator-(TimeDelta delta) const { 341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeClass(-time_internal::SaturatedSub(delta, us_)); 342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Modify by some time delta. 345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeClass& operator+=(TimeDelta delta) { 346b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return static_cast<TimeClass&>(*this = (*this + delta)); 347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 348b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeClass& operator-=(TimeDelta delta) { 349b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return static_cast<TimeClass&>(*this = (*this - delta)); 350b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 351b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Comparison operators 353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool operator==(TimeClass other) const { 354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return us_ == other.us_; 355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool operator!=(TimeClass other) const { 357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return us_ != other.us_; 358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool operator<(TimeClass other) const { 360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return us_ < other.us_; 361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool operator<=(TimeClass other) const { 363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return us_ <= other.us_; 364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool operator>(TimeClass other) const { 366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return us_ > other.us_; 367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool operator>=(TimeClass other) const { 369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return us_ >= other.us_; 370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts an integer value representing TimeClass to a class. This is used 373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // when deserializing a |TimeClass| structure, using a value known to be 374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // compatible. It is not provided as a constructor because the integer type 375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // may be unclear from the perspective of a caller. 3760d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static TimeClass FromInternalValue(int64_t us) { return TimeClass(us); } 377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat protected: 3790d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko explicit TimeBase(int64_t us) : us_(us) {} 380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Time value in a microsecond timebase. 3820d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t us_; 383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace time_internal 386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattemplate<class TimeClass> 388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratinline TimeClass operator+(TimeDelta delta, TimeClass t) { 389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return t + delta; 390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Time ----------------------------------------------------------------------- 393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Represents a wall clock time in UTC. Values are not guaranteed to be 395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// monotonically non-decreasing and are subject to large amounts of skew. 396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass BASE_EXPORT Time : public time_internal::TimeBase<Time> { 397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The representation of Jan 1, 1970 UTC in microseconds since the 399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // platform-dependent epoch. 4000d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kTimeTToMicrosecondsOffset; 401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if !defined(OS_WIN) 403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // On Mac & Linux, this value is the delta from the Windows epoch of 1601 to 404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // the Posix delta of 1970. This is used for migrating between the old 405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // 1970-based epochs to the new 1601-based ones. It should be removed from 406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // this global header and put in the platform-specific ones when we remove the 407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // migration code. 4080d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static const int64_t kWindowsEpochDeltaMicroseconds; 409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#else 410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // To avoid overflow in QPC to Microseconds calculations, since we multiply 411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // by kMicrosecondsPerSecond, then the QPC value should not exceed 412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // (2^63 - 1) / 1E6. If it exceeds that threshold, we divide then multiply. 4130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko enum : int64_t{kQPCOverflowThreshold = 0x8637BD05AF7}; 414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Represents an exploded time that can be formatted nicely. This is kind of 417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // like the Win32 SYSTEMTIME structure or the Unix "struct tm" with a few 418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // additions and changes to prevent errors. 419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat struct BASE_EXPORT Exploded { 420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int year; // Four digit year "2007" 421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int month; // 1-based month (values 1 = January, etc.) 422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int day_of_week; // 0-based day of week (0 = Sunday, etc.) 423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int day_of_month; // 1-based day of month (1-31) 424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int hour; // Hour within the current day (0-23) 425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int minute; // Minute within the current hour (0-59) 426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int second; // Second within the current minute (0-59 plus leap 427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // seconds which may take it up to 60). 428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int millisecond; // Milliseconds within the current second (0-999) 429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // A cursory test for whether the data members are within their 431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // respective ranges. A 'true' return value does not guarantee the 432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Exploded value can be successfully converted to a Time value. 433b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool HasValidValues() const; 434b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 435b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 436b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Contains the NULL time. Use Time::Now() to get the current time. 437b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Time() : TimeBase(0) { 438b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 439b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 440b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the time for epoch in Unix-like system (Jan 1, 1970). 441b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time UnixEpoch(); 442b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 443b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the current time. Watch out, the system might adjust its clock 444b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // in which case time will actually go backwards. We don't guarantee that 445b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // times are increasing, or that two calls to Now() won't be the same. 446b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time Now(); 447b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 448b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the current time. Same as Now() except that this function always 449b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // uses system time so that there are no discrepancies between the returned 450b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // time and system time even on virtual environments including our test bot. 451b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // For timing sensitive unittests, this function should be used. 452b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time NowFromSystemTime(); 453b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 454b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts to/from time_t in UTC and a Time class. 455b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TODO(brettw) this should be removed once everybody starts using the |Time| 456b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // class. 457b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time FromTimeT(time_t tt); 458b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat time_t ToTimeT() const; 459b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 460b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts time to/from a double which is the number of seconds since epoch 461b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // (Jan 1, 1970). Webkit uses this format to represent time. 462b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Because WebKit initializes double time value to 0 to indicate "not 463b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // initialized", we map it to empty Time object that also means "not 464b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // initialized". 465b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time FromDoubleT(double dt); 466b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double ToDoubleT() const; 467b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_POSIX) 469b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts the timespec structure to time. MacOS X 10.8.3 (and tentatively, 470b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // earlier versions) will have the |ts|'s tv_nsec component zeroed out, 471b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // having a 1 second resolution, which agrees with 472b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // https://developer.apple.com/legacy/library/#technotes/tn/tn1150.html#HFSPlusDates. 473b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time FromTimeSpec(const timespec& ts); 474b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts to/from the Javascript convention for times, a number of 477b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // milliseconds since the epoch: 478b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/getTime. 479b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time FromJsTime(double ms_since_epoch); 480b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double ToJsTime() const; 481b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 482b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts to Java convention for times, a number of 483b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // milliseconds since the epoch. 4840d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t ToJavaTime() const; 485b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 486b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_POSIX) 487b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time FromTimeVal(struct timeval t); 488b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat struct timeval ToTimeVal() const; 489b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 490b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 491b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX) 492b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time FromCFAbsoluteTime(CFAbsoluteTime t); 493b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CFAbsoluteTime ToCFAbsoluteTime() const; 494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 496b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time FromFileTime(FILETIME ft); 498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FILETIME ToFileTime() const; 499b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The minimum time of a low resolution timer. This is basically a windows 501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // constant of ~15.6ms. While it does vary on some older OS versions, we'll 502b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // treat it as static across all windows versions. 503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static const int kMinLowResolutionThresholdMs = 16; 504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 505b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Enable or disable Windows high resolution timer. 506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static void EnableHighResolutionTimer(bool enable); 507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Activates or deactivates the high resolution timer based on the |activate| 509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // flag. If the HighResolutionTimer is not Enabled (see 510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // EnableHighResolutionTimer), this function will return false. Otherwise 511b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // returns true. Each successful activate call must be paired with a 512b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // subsequent deactivate call. 513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // All callers to activate the high resolution timer must eventually call 514b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // this function to deactivate the high resolution timer. 515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static bool ActivateHighResolutionTimer(bool activate); 516b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns true if the high resolution timer is both enabled and activated. 518b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // This is provided for testing only, and is not tracked in a thread-safe 519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // way. 520b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static bool IsHighResolutionTimerInUse(); 521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts an exploded structure representing either the local time or UTC 524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // into a Time class. 5250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // TODO(maksims): Get rid of these in favor of the methods below when 5260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // all the callers stop using these ones. 527b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time FromUTCExploded(const Exploded& exploded) { 5280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez base::Time time; 5290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ignore_result(FromUTCExploded(exploded, &time)); 5300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez return time; 531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 532b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static Time FromLocalExploded(const Exploded& exploded) { 5330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez base::Time time; 5340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ignore_result(FromLocalExploded(exploded, &time)); 5350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez return time; 5360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 5370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Converts an exploded structure representing either the local time or UTC 5390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // into a Time class. Returns false on a failure when, for example, a day of 5400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // month is set to 31 on a 28-30 day month. 5410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez static bool FromUTCExploded(const Exploded& exploded, 5420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez Time* time) WARN_UNUSED_RESULT { 5430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez return FromExploded(false, exploded, time); 5440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 5450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez static bool FromLocalExploded(const Exploded& exploded, 5460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez Time* time) WARN_UNUSED_RESULT { 5470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez return FromExploded(true, exploded, time); 548b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 549b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 550b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts a string representation of time to a Time object. 551b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // An example of a time string which is converted is as below:- 552b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified 553b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // in the input string, FromString assumes local time and FromUTCString 554b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // assumes UTC. A timezone that cannot be parsed (e.g. "UTC" which is not 555b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // specified in RFC822) is treated as if the timezone is not specified. 556b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TODO(iyengar) Move the FromString/FromTimeT/ToTimeT/FromFileTime to 557b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // a new time converter class. 558b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static bool FromString(const char* time_string, Time* parsed_time) { 559b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return FromStringInternal(time_string, true, parsed_time); 560b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 561b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static bool FromUTCString(const char* time_string, Time* parsed_time) { 562b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return FromStringInternal(time_string, false, parsed_time); 563b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Fills the given exploded structure with either the local time or UTC from 566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // this time structure (containing UTC). 567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void UTCExplode(Exploded* exploded) const { 568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return Explode(false, exploded); 569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void LocalExplode(Exploded* exploded) const { 571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return Explode(true, exploded); 572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Rounds this time down to the nearest day in local time. It will represent 575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // midnight on that day. 576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Time LocalMidnight() const; 577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat friend class time_internal::TimeBase<Time>; 580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5810d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko explicit Time(int64_t us) : TimeBase(us) {} 582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Explodes the given time to either local time |is_local = true| or UTC 584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // |is_local = false|. 585b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Explode(bool is_local, Exploded* exploded) const; 586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Unexplodes a given time assuming the source is either local time 5880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // |is_local = true| or UTC |is_local = false|. Function returns false on 5890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // failure and sets |time| to Time(0). Otherwise returns true and sets |time| 5900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // to non-exploded time. 5910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez static bool FromExploded(bool is_local, 5920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez const Exploded& exploded, 5930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez Time* time) WARN_UNUSED_RESULT; 594b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 595b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Converts a string representation of time to a Time object. 596b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // An example of a time string which is converted is as below:- 597b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified 598b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // in the input string, local time |is_local = true| or 599b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // UTC |is_local = false| is assumed. A timezone that cannot be parsed 600b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // (e.g. "UTC" which is not specified in RFC822) is treated as if the 601b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // timezone is not specified. 602b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static bool FromStringInternal(const char* time_string, 603b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool is_local, 604b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Time* parsed_time); 6050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 6060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Comparison does not consider |day_of_week| when doing the operation. 6070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez static bool ExplodedMostlyEquals(const Exploded& lhs, const Exploded& rhs); 608b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 609b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 610b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static 61194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconstexpr TimeDelta TimeDelta::FromDays(int days) { 61294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return days == std::numeric_limits<int>::max() 61394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ? Max() 61494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : TimeDelta(days * Time::kMicrosecondsPerDay); 615b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 616b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 617b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static 61894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconstexpr TimeDelta TimeDelta::FromHours(int hours) { 61994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return hours == std::numeric_limits<int>::max() 62094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ? Max() 62194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : TimeDelta(hours * Time::kMicrosecondsPerHour); 622b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 623b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 624b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static 62594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconstexpr TimeDelta TimeDelta::FromMinutes(int minutes) { 62694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return minutes == std::numeric_limits<int>::max() 62794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ? Max() 62894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : TimeDelta(minutes * Time::kMicrosecondsPerMinute); 629b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 630b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 631b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static 63294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconstexpr TimeDelta TimeDelta::FromSeconds(int64_t secs) { 63394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return FromProduct(secs, Time::kMicrosecondsPerSecond); 634b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 635b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 636b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static 63794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconstexpr TimeDelta TimeDelta::FromMilliseconds(int64_t ms) { 63894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return FromProduct(ms, Time::kMicrosecondsPerMillisecond); 639b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 640b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 641b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static 64294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconstexpr TimeDelta TimeDelta::FromSecondsD(double secs) { 6430d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko return FromDouble(secs * Time::kMicrosecondsPerSecond); 644b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 645b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 646b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static 64794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconstexpr TimeDelta TimeDelta::FromMillisecondsD(double ms) { 6480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko return FromDouble(ms * Time::kMicrosecondsPerMillisecond); 649b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 650b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 651b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static 65294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconstexpr TimeDelta TimeDelta::FromMicroseconds(int64_t us) { 653b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TimeDelta(us); 654b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 655b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 6560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// static 65794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconstexpr TimeDelta TimeDelta::FromDouble(double value) { 65894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // TODO(crbug.com/612601): Use saturated_cast<int64_t>(value) once we sort out 65994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // the Min() behavior. 66094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return value > std::numeric_limits<int64_t>::max() 66194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ? Max() 66294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : value < -std::numeric_limits<int64_t>::max() 66394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ? -Max() 66494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : TimeDelta(static_cast<int64_t>(value)); 66594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} 66694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 66794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// static 66894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconstexpr TimeDelta TimeDelta::FromProduct(int64_t value, 66994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez int64_t positive_value) { 6700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez return ( 6710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez#if !defined(_PREFAST_) || !defined(OS_WIN) 6720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Avoid internal compiler errors in /analyze builds with VS 2015 6730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // update 3. 6740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // https://connect.microsoft.com/VisualStudio/feedback/details/2870865 6750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez DCHECK(positive_value > 0), 6760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez#endif 67794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez value > std::numeric_limits<int64_t>::max() / positive_value 67894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ? Max() 67994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : value < -std::numeric_limits<int64_t>::max() / positive_value 68094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ? -Max() 68194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : TimeDelta(value * positive_value)); 6820d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} 6830d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 684b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// For logging use only. 685b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT std::ostream& operator<<(std::ostream& os, Time time); 686b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 687b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TimeTicks ------------------------------------------------------------------ 688b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 689b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Represents monotonically non-decreasing clock time. 690b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass BASE_EXPORT TimeTicks : public time_internal::TimeBase<TimeTicks> { 691b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 69294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // The underlying clock used to generate new TimeTicks. 69394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez enum class Clock { 69494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez LINUX_CLOCK_MONOTONIC, 69594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez IOS_CF_ABSOLUTE_TIME_MINUS_KERN_BOOTTIME, 69694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez MAC_MACH_ABSOLUTE_TIME, 69794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez WIN_QPC, 69894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez WIN_ROLLOVER_PROTECTED_TIME_GET_TIME 69994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez }; 70094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 701b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeTicks() : TimeBase(0) { 702b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 703b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 704b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Platform-dependent tick count representing "right now." When 705b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // IsHighResolution() returns false, the resolution of the clock could be 706b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // as coarse as ~15.6ms. Otherwise, the resolution should be no worse than one 707b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // microsecond. 708b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static TimeTicks Now(); 709b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 710b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns true if the high resolution clock is working on this system and 711b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Now() will return high resolution values. Note that, on systems where the 712b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // high resolution clock works but is deemed inefficient, the low resolution 713b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // clock will be used instead. 714b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static bool IsHighResolution(); 715b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 716b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 717b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Translates an absolute QPC timestamp into a TimeTicks value. The returned 718b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // value has the same origin as Now(). Do NOT attempt to use this if 719b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // IsHighResolution() returns false. 720b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static TimeTicks FromQPCValue(LONGLONG qpc_value); 721b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 722b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 7230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // Get an estimate of the TimeTick value at the time of the UnixEpoch. Because 7240d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // Time and TimeTicks respond differently to user-set time and NTP 7250d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // adjustments, this number is only an estimate. Nevertheless, this can be 7260d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // useful when you need to relate the value of TimeTicks to a real time and 7270d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // date. Note: Upon first invocation, this function takes a snapshot of the 7280d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // realtime clock to establish a reference point. This function will return 7290d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // the same value for the duration of the application, but will be different 7300d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // in future application runs. 731b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static TimeTicks UnixEpoch(); 732b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 733b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns |this| snapped to the next tick, given a |tick_phase| and 734b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // repeating |tick_interval| in both directions. |this| may be before, 735b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // after, or equal to the |tick_phase|. 736b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeTicks SnappedToNextTick(TimeTicks tick_phase, 737b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeDelta tick_interval) const; 738b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 73994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Returns an enum indicating the underlying clock being used to generate 74094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // TimeTicks timestamps. This function should only be used for debugging and 74194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // logging purposes. 74294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static Clock GetClock(); 74394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 744b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 745b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat protected: 746b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat typedef DWORD (*TickFunctionType)(void); 747b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static TickFunctionType SetMockTickFunction(TickFunctionType ticker); 748b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 749b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 750b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 751b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat friend class time_internal::TimeBase<TimeTicks>; 752b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 753b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Please use Now() to create a new object. This is for internal use 754b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // and testing. 7550d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko explicit TimeTicks(int64_t us) : TimeBase(us) {} 756b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 757b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 758b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// For logging use only. 759b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT std::ostream& operator<<(std::ostream& os, TimeTicks time_ticks); 760b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 761b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// ThreadTicks ---------------------------------------------------------------- 762b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 763b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Represents a clock, specific to a particular thread, than runs only while the 764b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// thread is running. 765b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass BASE_EXPORT ThreadTicks : public time_internal::TimeBase<ThreadTicks> { 766b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 767b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadTicks() : TimeBase(0) { 768b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 769b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 770b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns true if ThreadTicks::Now() is supported on this system. 771b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static bool IsSupported() { 772b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \ 773b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_ANDROID) 774b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return true; 7750d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#elif defined(OS_WIN) 7760d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko return IsSupportedWin(); 777b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#else 778b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return false; 779b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 780b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 781b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 7820d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // Waits until the initialization is completed. Needs to be guarded with a 7830d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // call to IsSupported(). 7840d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static void WaitUntilInitialized() { 7850d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_WIN) 7860d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko WaitUntilInitializedWin(); 7870d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif 7880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 7890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 790b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns thread-specific CPU-time on systems that support this feature. 791b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Needs to be guarded with a call to IsSupported(). Use this timer 792b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // to (approximately) measure how much time the calling thread spent doing 793b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // actual work vs. being de-scheduled. May return bogus results if the thread 7940d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // migrates to another CPU between two calls. Returns an empty ThreadTicks 7950d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // object until the initialization is completed. If a clock reading is 7960d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // absolutely needed, call WaitUntilInitialized() before this method. 797b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static ThreadTicks Now(); 798b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 79994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(OS_WIN) 80094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Similar to Now() above except this returns thread-specific CPU time for an 80194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // arbitrary thread. All comments for Now() method above apply apply to this 80294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // method as well. 80394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static ThreadTicks GetForThread(const PlatformThreadHandle& thread_handle); 80494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 80594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 806b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 807b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat friend class time_internal::TimeBase<ThreadTicks>; 808b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 80994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Please use Now() or GetForThread() to create a new object. This is for 81094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // internal use and testing. 8110d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko explicit ThreadTicks(int64_t us) : TimeBase(us) {} 812b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 8130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_WIN) 8140d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko FRIEND_TEST_ALL_PREFIXES(TimeTicks, TSCTicksPerSecond); 815b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 8160d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // Returns the frequency of the TSC in ticks per second, or 0 if it hasn't 8170d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // been measured yet. Needs to be guarded with a call to IsSupported(). 8180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // This method is declared here rather than in the anonymous namespace to 8190d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // allow testing. 8200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static double TSCTicksPerSecond(); 821b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 8220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static bool IsSupportedWin(); 8230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static void WaitUntilInitializedWin(); 824b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 825b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 826b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 827b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// For logging use only. 8280d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT std::ostream& operator<<(std::ostream& os, ThreadTicks time_ticks); 829b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 830b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 831b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 832b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // BASE_TIME_TIME_H_ 833