15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Time represents an absolute point in time, internally represented as 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// microseconds (s/1,000,000) since the Windows epoch (1601-01-01 00:00:00 UTC) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (See http://crbug.com/14734). System-dependent clock interface routines are 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// defined in time_PLATFORM.cc. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TimeDelta represents a duration of time, internally represented in 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// microseconds. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TimeTicks represents an abstract time that is most of the time incrementing 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for use in measuring time durations. It is internally represented in 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// microseconds. It can not be converted to a human-readable time, but is 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// guaranteed not to decrease (if the user changes the computer clock, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Time::Now() may actually decrease or jump). But note that TimeTicks may 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "stand still", for example if the computer suspended. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These classes are represented as only a 64-bit value, so they can be 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// efficiently passed by value. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef BASE_TIME_TIME_H_ 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define BASE_TIME_TIME_H_ 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <time.h> 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <CoreFoundation/CoreFoundation.h> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Avoid Mac system header macro leak. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef TYPE_BOOL 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <unistd.h> 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/time.h> 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For FILETIME in FromFileTime, until it moves to a new converter class. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See TODO(iyengar) below. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits> 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Time; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TimeTicks; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TimeDelta ------------------------------------------------------------------ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT TimeDelta { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta() : delta_(0) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts units of time to TimeDeltas. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeDelta FromDays(int64 days); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeDelta FromHours(int64 hours); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeDelta FromMinutes(int64 minutes); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeDelta FromSeconds(int64 secs); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeDelta FromMilliseconds(int64 ms); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeDelta FromMicroseconds(int64 us); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeDelta FromQPCValue(LONGLONG qpc_value); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts an integer value representing TimeDelta to a class. This is used 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when deserializing a |TimeDelta| structure, using a value known to be 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compatible. It is not provided as a constructor because the integer type 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may be unclear from the perspective of a caller. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeDelta FromInternalValue(int64 delta) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(delta); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the internal numeric value of the TimeDelta object. Please don't 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use this and do arithmetic on it, as it is more error prone than using the 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provided operators. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For serializing, use FromInternalValue to reconstitute. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 ToInternalValue() const { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delta_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct timespec ToTimeSpec() const; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the time delta in some unit. The F versions return a floating 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // point value, the "regular" versions return a rounded-down value. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InMillisecondsRoundedUp() instead returns an integer that is rounded up 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the next full millisecond. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int InDays() const; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int InHours() const; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int InMinutes() const; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double InSecondsF() const; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 InSeconds() const; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double InMillisecondsF() const; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 InMilliseconds() const; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 InMillisecondsRoundedUp() const; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 InMicroseconds() const; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta& operator=(TimeDelta other) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_ = other.delta_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Computations with other deltas. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta operator+(TimeDelta other) const { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(delta_ + other.delta_); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta operator-(TimeDelta other) const { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(delta_ - other.delta_); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta& operator+=(TimeDelta other) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_ += other.delta_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta& operator-=(TimeDelta other) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_ -= other.delta_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta operator-() const { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(-delta_); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Computations with ints, note that we only allow multiplicative operations 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with ints, and additive operations with other deltas. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta operator*(int64 a) const { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(delta_ * a); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta operator/(int64 a) const { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(delta_ / a); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta& operator*=(int64 a) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_ *= a; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta& operator/=(int64 a) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_ /= a; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 operator/(TimeDelta a) const { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delta_ / a.delta_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defined below because it depends on the definition of the other classes. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time operator+(Time t) const; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks operator+(TimeTicks t) const; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Comparison operators. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(TimeDelta other) const { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delta_ == other.delta_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator!=(TimeDelta other) const { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delta_ != other.delta_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<(TimeDelta other) const { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delta_ < other.delta_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<=(TimeDelta other) const { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delta_ <= other.delta_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator>(TimeDelta other) const { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delta_ > other.delta_; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator>=(TimeDelta other) const { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delta_ >= other.delta_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Time; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class TimeTicks; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend TimeDelta operator*(int64 a, TimeDelta td); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructs a delta given the duration in microseconds. This is private 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to avoid confusion by callers with an integer constructor. Use 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FromSeconds, FromMilliseconds, etc. instead. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TimeDelta(int64 delta_us) : delta_(delta_us) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delta in microseconds. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 delta_; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta operator*(int64 a, TimeDelta td) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(a * td.delta_); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Time ----------------------------------------------------------------------- 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents a wall clock time. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT Time { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kMillisecondsPerSecond = 1000; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kMicrosecondsPerMillisecond = 1000; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kMicrosecondsPerSecond = kMicrosecondsPerMillisecond * 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMillisecondsPerSecond; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kMicrosecondsPerMinute = kMicrosecondsPerSecond * 60; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kMicrosecondsPerHour = kMicrosecondsPerMinute * 60; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kMicrosecondsPerDay = kMicrosecondsPerHour * 24; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kMicrosecondsPerWeek = kMicrosecondsPerDay * 7; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kNanosecondsPerMicrosecond = 1000; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kNanosecondsPerSecond = kNanosecondsPerMicrosecond * 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMicrosecondsPerSecond; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Mac & Linux, this value is the delta from the Windows epoch of 1601 to 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the Posix delta of 1970. This is used for migrating between the old 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1970-based epochs to the new 1601-based ones. It should be removed from 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this global header and put in the platform-specific ones when we remove the 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // migration code. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kWindowsEpochDeltaMicroseconds; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Represents an exploded time that can be formatted nicely. This is kind of 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // like the Win32 SYSTEMTIME structure or the Unix "struct tm" with a few 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // additions and changes to prevent errors. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct BASE_EXPORT Exploded { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int year; // Four digit year "2007" 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int month; // 1-based month (values 1 = January, etc.) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int day_of_week; // 0-based day of week (0 = Sunday, etc.) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int day_of_month; // 1-based day of month (1-31) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int hour; // Hour within the current day (0-23) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int minute; // Minute within the current hour (0-59) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int second; // Second within the current minute (0-59 plus leap 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // seconds which may take it up to 60). 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int millisecond; // Milliseconds within the current second (0-999) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A cursory test for whether the data members are within their 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // respective ranges. A 'true' return value does not guarantee the 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exploded value can be successfully converted to a Time value. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasValidValues() const; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Contains the NULL time. Use Time::Now() to get the current time. 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time() : us_(0) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the time object has not been initialized. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_null() const { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return us_ == 0; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the time object is the maximum time. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_max() const { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return us_ == std::numeric_limits<int64>::max(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the time for epoch in Unix-like system (Jan 1, 1970). 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time UnixEpoch(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the current time. Watch out, the system might adjust its clock 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case time will actually go backwards. We don't guarantee that 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // times are increasing, or that two calls to Now() won't be the same. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time Now(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the maximum time, which should be greater than any reasonable time 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with which we might compare it. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time Max(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the current time. Same as Now() except that this function always 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // uses system time so that there are no discrepancies between the returned 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time and system time even on virtual environments including our test bot. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For timing sensitive unittests, this function should be used. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time NowFromSystemTime(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts to/from time_t in UTC and a Time class. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this should be removed once everybody starts using the |Time| 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // class. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time FromTimeT(time_t tt); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_t ToTimeT() const; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts time to/from a double which is the number of seconds since epoch 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (Jan 1, 1970). Webkit uses this format to represent time. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because WebKit initializes double time value to 0 to indicate "not 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialized", we map it to empty Time object that also means "not 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialized". 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time FromDoubleT(double dt); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double ToDoubleT() const; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_POSIX) 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Converts the timespec structure to time. MacOS X 10.8.3 (and tentatively, 291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // earlier versions) will have the |ts|'s tv_nsec component zeroed out, 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // having a 1 second resolution, which agrees with 293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // https://developer.apple.com/legacy/library/#technotes/tn/tn1150.html#HFSPlusDates. 294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static Time FromTimeSpec(const timespec& ts); 295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts to/from the Javascript convention for times, a number of 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // milliseconds since the epoch: 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/getTime. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time FromJsTime(double ms_since_epoch); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double ToJsTime() const; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time FromTimeVal(struct timeval t); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct timeval ToTimeVal() const; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time FromCFAbsoluteTime(CFAbsoluteTime t); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFAbsoluteTime ToCFAbsoluteTime() const; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time FromFileTime(FILETIME ft); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILETIME ToFileTime() const; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The minimum time of a low resolution timer. This is basically a windows 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constant of ~15.6ms. While it does vary on some older OS versions, we'll 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // treat it as static across all windows versions. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMinLowResolutionThresholdMs = 16; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable or disable Windows high resolution timer. If the high resolution 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // timer is not enabled, calls to ActivateHighResolutionTimer will fail. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When disabling the high resolution timer, this function will not cause 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the high resolution timer to be deactivated, but will prevent future 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // activations. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called from the main thread. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more details see comments in time_win.cc. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void EnableHighResolutionTimer(bool enable); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Activates or deactivates the high resolution timer based on the |activate| 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // flag. If the HighResolutionTimer is not Enabled (see 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EnableHighResolutionTimer), this function will return false. Otherwise 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returns true. Each successful activate call must be paired with a 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subsequent deactivate call. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All callers to activate the high resolution timer must eventually call 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this function to deactivate the high resolution timer. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ActivateHighResolutionTimer(bool activate); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the high resolution timer is both enabled and activated. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is provided for testing only, and is not tracked in a thread-safe 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // way. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsHighResolutionTimerInUse(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts an exploded structure representing either the local time or UTC 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // into a Time class. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time FromUTCExploded(const Exploded& exploded) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FromExploded(false, exploded); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time FromLocalExploded(const Exploded& exploded) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FromExploded(true, exploded); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts an integer value representing Time to a class. This is used 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when deserializing a |Time| structure, using a value known to be 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compatible. It is not provided as a constructor because the integer type 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may be unclear from the perspective of a caller. 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time FromInternalValue(int64 us) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Time(us); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts a string representation of time to a Time object. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An example of a time string which is converted is as below:- 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the input string, FromString assumes local time and FromUTCString 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // assumes UTC. A timezone that cannot be parsed (e.g. "UTC" which is not 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified in RFC822) is treated as if the timezone is not specified. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(iyengar) Move the FromString/FromTimeT/ToTimeT/FromFileTime to 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a new time converter class. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool FromString(const char* time_string, Time* parsed_time) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FromStringInternal(time_string, true, parsed_time); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool FromUTCString(const char* time_string, Time* parsed_time) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FromStringInternal(time_string, false, parsed_time); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For serializing, use FromInternalValue to reconstitute. Please don't use 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this and do arithmetic on it, as it is more error prone than using the 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provided operators. 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 ToInternalValue() const { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return us_; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fills the given exploded structure with either the local time or UTC from 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this time structure (containing UTC). 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UTCExplode(Exploded* exploded) const { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Explode(false, exploded); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LocalExplode(Exploded* exploded) const { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Explode(true, exploded); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rounds this time down to the nearest day in local time. It will represent 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // midnight on that day. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time LocalMidnight() const; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time& operator=(Time other) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us_ = other.us_; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute the difference between two times. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta operator-(Time other) const { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(us_ - other.us_); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modify by some time delta. 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time& operator+=(TimeDelta delta) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us_ += delta.delta_; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time& operator-=(TimeDelta delta) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) us_ -= delta.delta_; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return a new time modified by some delta. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time operator+(TimeDelta delta) const { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Time(us_ + delta.delta_); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time operator-(TimeDelta delta) const { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Time(us_ - delta.delta_); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Comparison operators 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(Time other) const { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return us_ == other.us_; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator!=(Time other) const { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return us_ != other.us_; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<(Time other) const { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return us_ < other.us_; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<=(Time other) const { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return us_ <= other.us_; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator>(Time other) const { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return us_ > other.us_; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator>=(Time other) const { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return us_ >= other.us_; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class TimeDelta; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit Time(int64 us) : us_(us) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explodes the given time to either local time |is_local = true| or UTC 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |is_local = false|. 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Explode(bool is_local, Exploded* exploded) const; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unexplodes a given time assuming the source is either local time 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |is_local = true| or UTC |is_local = false|. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Time FromExploded(bool is_local, const Exploded& exploded); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts a string representation of time to a Time object. 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An example of a time string which is converted is as below:- 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the input string, local time |is_local = true| or 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UTC |is_local = false| is assumed. A timezone that cannot be parsed 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. "UTC" which is not specified in RFC822) is treated as if the 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // timezone is not specified. 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool FromStringInternal(const char* time_string, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_local, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time* parsed_time); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The representation of Jan 1, 1970 UTC in microseconds since the 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // platform-dependent epoch. 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int64 kTimeTToMicrosecondsOffset; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates whether fast timers are usable right now. For instance, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when using battery power, we might elect to prevent high speed timers 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which would draw more power. 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool high_resolution_timer_enabled_; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Count of activations on the high resolution timer. Only use in tests 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which are single threaded. 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int high_resolution_timer_activated_; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time in microseconds in UTC. 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 us_; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Inline the TimeDelta factory methods, for fast TimeDelta construction. 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromDays(int64 days) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(days * Time::kMicrosecondsPerDay); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromHours(int64 hours) { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(hours * Time::kMicrosecondsPerHour); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromMinutes(int64 minutes) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(minutes * Time::kMicrosecondsPerMinute); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromSeconds(int64 secs) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(secs * Time::kMicrosecondsPerSecond); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromMilliseconds(int64 ms) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(ms * Time::kMicrosecondsPerMillisecond); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromMicroseconds(int64 us) { 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(us); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Time TimeDelta::operator+(Time t) const { 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Time(t.us_ + delta_); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TimeTicks ------------------------------------------------------------------ 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT TimeTicks { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks() : ticks_(0) { 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Platform-dependent tick count representing "right now." 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resolution of this clock is ~1-15ms. Resolution varies depending 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on hardware/operating system configuration. 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeTicks Now(); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a platform-dependent high-resolution tick count. Implementation 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is hardware dependent and may or may not return sub-millisecond 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resolution. THIS CALL IS GENERALLY MUCH MORE EXPENSIVE THAN Now() AND 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SHOULD ONLY BE USED WHEN IT IS REALLY NEEDED. 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeTicks HighResNow(); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 543a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Returns true if ThreadNow() is supported on this system. 544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static bool IsThreadNowSupported() { 545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0) 546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else 548a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Returns thread-specific CPU-time on systems that support this feature. 553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Needs to be guarded with a call to IsThreadNowSupported(). Use this timer 554a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // to (approximately) measure how much time the calling thread spent doing 555a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // actual work vs. being de-scheduled. May return bogus results if the thread 556a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // migrates to another CPU between two calls. 557a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static TimeTicks ThreadNow(); 558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the current system trace time or, if none is defined, the current 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // high-res time (i.e. HighResNow()). On systems where a global trace clock 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is defined, timestamping TraceEvents's with this value guarantees 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synchronization between events collected inside chrome and events 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // collected outside (e.g. kernel, X server). 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeTicks NowFromSystemTraceTime(); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the absolute value of QPC time drift. For testing. 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int64 GetQPCDriftMicroseconds(); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeTicks FromQPCValue(LONGLONG qpc_value); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the high resolution clock is working on this system. 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is only for testing. 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsHighResClockWorking(); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this object has not been initialized. 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_null() const { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ticks_ == 0; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts an integer value representing TimeTicks to a class. This is used 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when deserializing a |TimeTicks| structure, using a value known to be 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compatible. It is not provided as a constructor because the integer type 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may be unclear from the perspective of a caller. 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TimeTicks FromInternalValue(int64 ticks) { 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeTicks(ticks); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the internal numeric value of the TimeTicks object. 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For serializing, use FromInternalValue to reconstitute. 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 ToInternalValue() const { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ticks_; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks& operator=(TimeTicks other) { 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ticks_ = other.ticks_; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute the difference between two times. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta operator-(TimeTicks other) const { 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeDelta(ticks_ - other.ticks_); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modify by some time delta. 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks& operator+=(TimeDelta delta) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ticks_ += delta.delta_; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks& operator-=(TimeDelta delta) { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ticks_ -= delta.delta_; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return a new TimeTicks modified by some delta. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks operator+(TimeDelta delta) const { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeTicks(ticks_ + delta.delta_); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks operator-(TimeDelta delta) const { 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeTicks(ticks_ - delta.delta_); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Comparison operators 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(TimeTicks other) const { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ticks_ == other.ticks_; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator!=(TimeTicks other) const { 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ticks_ != other.ticks_; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<(TimeTicks other) const { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ticks_ < other.ticks_; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<=(TimeTicks other) const { 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ticks_ <= other.ticks_; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator>(TimeTicks other) const { 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ticks_ > other.ticks_; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator>=(TimeTicks other) const { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ticks_ >= other.ticks_; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class TimeDelta; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Please use Now() to create a new object. This is for internal use 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and testing. Ticks is in microseconds. 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TimeTicks(int64 ticks) : ticks_(ticks) { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tick count in microseconds. 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 ticks_; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef DWORD (*TickFunctionType)(void); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TickFunctionType SetMockTickFunction(TickFunctionType ticker); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeTicks TimeDelta::operator+(TimeTicks t) const { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TimeTicks(t.ticks_ + delta_); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // BASE_TIME_TIME_H_ 668