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)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <stdint.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/time.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <time.h>
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_ANDROID) && !defined(__LP64__)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <time64.h>
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <unistd.h>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits>
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <ostream>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/port.h"
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "build/build_config.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/os_compat_android.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_NACL)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/os_compat_nacl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_MACOSX)
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/lazy_instance.h"
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/synchronization/lock.h"
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_MACOSX)
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// This prevents a crash on traversing the environment global and looking up
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// the 'TZ' variable in libc. See: crbug.com/390567.
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)base::LazyInstance<base::Lock>::Leaky
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    g_sys_time_to_time_struct_lock = LAZY_INSTANCE_INITIALIZER;
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Define a system-specific SysTime that wraps either to a time_t or
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a time64_t depending on the host system, and associated convertion.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// See crbug.com/162007
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_ANDROID) && !defined(__LP64__)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef time64_t SysTime;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SysTime SysTimeFromTimeStruct(struct tm* timestruct, bool is_local) {
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::AutoLock locked(g_sys_time_to_time_struct_lock.Get());
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_local)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return mktime64(timestruct);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return timegm64(timestruct);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SysTimeToTimeStruct(SysTime t, struct tm* timestruct, bool is_local) {
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::AutoLock locked(g_sys_time_to_time_struct_lock.Get());
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_local)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    localtime64_r(&t, timestruct);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gmtime64_r(&t, timestruct);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#else  // OS_ANDROID && !__LP64__
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef time_t SysTime;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SysTime SysTimeFromTimeStruct(struct tm* timestruct, bool is_local) {
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::AutoLock locked(g_sys_time_to_time_struct_lock.Get());
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_local)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return mktime(timestruct);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return timegm(timestruct);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SysTimeToTimeStruct(SysTime t, struct tm* timestruct, bool is_local) {
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::AutoLock locked(g_sys_time_to_time_struct_lock.Get());
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_local)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    localtime_r(&t, timestruct);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gmtime_r(&t, timestruct);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // OS_ANDROID
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Helper function to get results from clock_gettime() as TimeTicks object.
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Minimum requirement is MONOTONIC_CLOCK to be supported on the system.
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// FreeBSD 6 has CLOCK_MONOTONIC but defines _POSIX_MONOTONIC_CLOCK to -1.
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if (defined(OS_POSIX) &&                                               \
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)     defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0) || \
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    defined(OS_BSD) || defined(OS_ANDROID)
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::TimeTicks ClockNow(clockid_t clk_id) {
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  uint64_t absolute_micro;
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  struct timespec ts;
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (clock_gettime(clk_id, &ts) != 0) {
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    NOTREACHED() << "clock_gettime(" << clk_id << ") failed.";
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return base::TimeTicks();
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  absolute_micro =
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      (static_cast<int64>(ts.tv_sec) * base::Time::kMicrosecondsPerSecond) +
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      (static_cast<int64>(ts.tv_nsec) / base::Time::kNanosecondsPerMicrosecond);
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return base::TimeTicks::FromInternalValue(absolute_micro);
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else  // _POSIX_MONOTONIC_CLOCK
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#error No usable tick clock function on this platform.
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif  // _POSIX_MONOTONIC_CLOCK
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif  // !defined(OS_MACOSX)
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct timespec TimeDelta::ToTimeSpec() const {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 microseconds = InMicroseconds();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  time_t seconds = 0;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (microseconds >= Time::kMicrosecondsPerSecond) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    seconds = InSeconds();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    microseconds -= seconds * Time::kMicrosecondsPerSecond;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct timespec result =
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {seconds,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       static_cast<long>(microseconds * Time::kNanosecondsPerMicrosecond)};
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Time routines in this file use standard POSIX routines, or almost-
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// standard routines in the case of timegm.  We need to use a Mach-specific
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function for TimeTicks::Now() on Mac OS X.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Time -----------------------------------------------------------------------
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows uses a Gregorian epoch of 1601.  We need to match this internally
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so that our time representations match across all platforms.  See bug 14734.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   irb(main):010:0> Time.at(0).getutc()
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   => Thu Jan 01 00:00:00 UTC 1970
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   irb(main):011:0> Time.at(-11644473600).getutc()
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   => Mon Jan 01 00:00:00 UTC 1601
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int64 kWindowsEpochDeltaSeconds = GG_INT64_C(11644473600);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 Time::kWindowsEpochDeltaMicroseconds =
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kWindowsEpochDeltaSeconds * Time::kMicrosecondsPerSecond;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Some functions in time.cc use time_t directly, so we provide an offset
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to convert from time_t (Unix epoch) and internal (Windows epoch).
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 Time::kTimeTToMicrosecondsOffset = kWindowsEpochDeltaMicroseconds;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Time Time::Now() {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct timeval tv;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct timezone tz = { 0, 0 };  // UTC
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gettimeofday(&tv, &tz) != 0) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(0) << "Could not determine time of day";
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PLOG(ERROR) << "Call to gettimeofday failed.";
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Return null instead of uninitialized |tv| value, which contains random
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // garbage data. This may result in the crash seen in crbug.com/147570.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Time();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Combine seconds and microseconds in a 64-bit field containing microseconds
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since the epoch.  That's enough for nearly 600 centuries.  Adjust from
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unix (1970) to Windows (1601) epoch.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Time((tv.tv_sec * kMicrosecondsPerSecond + tv.tv_usec) +
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWindowsEpochDeltaMicroseconds);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Time Time::NowFromSystemTime() {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just use Now() because Now() returns the system time.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Now();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Time::Explode(bool is_local, Exploded* exploded) const {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Time stores times with microsecond resolution, but Exploded only carries
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // millisecond resolution, so begin by being lossy.  Adjust from Windows
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // epoch (1601) to Unix epoch (1970);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 microseconds = us_ - kWindowsEpochDeltaMicroseconds;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following values are all rounded towards -infinity.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 milliseconds;  // Milliseconds since epoch.
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SysTime seconds;  // Seconds since epoch.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int millisecond;  // Exploded millisecond value (0-999).
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (microseconds >= 0) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Rounding towards -infinity <=> rounding towards 0, in this case.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    milliseconds = microseconds / kMicrosecondsPerMillisecond;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    seconds = milliseconds / kMillisecondsPerSecond;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    millisecond = milliseconds % kMillisecondsPerSecond;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Round these *down* (towards -infinity).
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    milliseconds = (microseconds - kMicrosecondsPerMillisecond + 1) /
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   kMicrosecondsPerMillisecond;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    seconds = (milliseconds - kMillisecondsPerSecond + 1) /
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kMillisecondsPerSecond;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make this nonnegative (and between 0 and 999 inclusive).
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    millisecond = milliseconds % kMillisecondsPerSecond;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (millisecond < 0)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      millisecond += kMillisecondsPerSecond;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct tm timestruct;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SysTimeToTimeStruct(seconds, &timestruct, is_local);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exploded->year         = timestruct.tm_year + 1900;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exploded->month        = timestruct.tm_mon + 1;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exploded->day_of_week  = timestruct.tm_wday;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exploded->day_of_month = timestruct.tm_mday;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exploded->hour         = timestruct.tm_hour;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exploded->minute       = timestruct.tm_min;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exploded->second       = timestruct.tm_sec;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exploded->millisecond  = millisecond;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Time Time::FromExploded(bool is_local, const Exploded& exploded) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct tm timestruct;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_sec    = exploded.second;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_min    = exploded.minute;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_hour   = exploded.hour;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_mday   = exploded.day_of_month;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_mon    = exploded.month - 1;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_year   = exploded.year - 1900;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_wday   = exploded.day_of_week;  // mktime/timegm ignore this
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_yday   = 0;     // mktime/timegm ignore this
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_isdst  = -1;    // attempt to figure it out
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_NACL) && !defined(OS_SOLARIS)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_gmtoff = 0;     // not a POSIX field, so mktime/timegm ignore
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestruct.tm_zone   = NULL;  // not a POSIX field, so mktime/timegm ignore
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 milliseconds;
2338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  SysTime seconds;
2348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Certain exploded dates do not really exist due to daylight saving times,
2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // and this causes mktime() to return implementation-defined values when
2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // tm_isdst is set to -1. On Android, the function will return -1, while the
2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // C libraries of other platforms typically return a liberally-chosen value.
2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Handling this requires the special code below.
2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // SysTimeFromTimeStruct() modifies the input structure, save current value.
2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  struct tm timestruct0 = timestruct;
2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  seconds = SysTimeFromTimeStruct(&timestruct, is_local);
2458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (seconds == -1) {
2468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // Get the time values with tm_isdst == 0 and 1, then select the closest one
2478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // to UTC 00:00:00 that isn't -1.
2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    timestruct = timestruct0;
2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    timestruct.tm_isdst = 0;
2508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    int64 seconds_isdst0 = SysTimeFromTimeStruct(&timestruct, is_local);
2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    timestruct = timestruct0;
2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    timestruct.tm_isdst = 1;
2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    int64 seconds_isdst1 = SysTimeFromTimeStruct(&timestruct, is_local);
2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // seconds_isdst0 or seconds_isdst1 can be -1 for some timezones.
2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // E.g. "CLST" (Chile Summer Time) returns -1 for 'tm_isdt == 1'.
2588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (seconds_isdst0 < 0)
2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      seconds = seconds_isdst1;
2608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    else if (seconds_isdst1 < 0)
2618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      seconds = seconds_isdst0;
2628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    else
2638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      seconds = std::min(seconds_isdst0, seconds_isdst1);
2648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handle overflow.  Clamping the range to what mktime and timegm might
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return is the best that can be done here.  It's not ideal, but it's better
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // than failing here or ignoring the overflow case and treating each time
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // overflow as one second prior to the epoch.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (seconds == -1 &&
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (exploded.year < 1969 || exploded.year > 1970)) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If exploded.year is 1969 or 1970, take -1 as correct, with the
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // time indicating 1 second prior to the epoch.  (1970 is allowed to handle
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // time zone and DST offsets.)  Otherwise, return the most future or past
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // time representable.  Assumes the time_t epoch is 1970-01-01 00:00:00 UTC.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The minimum and maximum representible times that mktime and timegm could
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // return are used here instead of values outside that range to allow for
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // proper round-tripping between exploded and counter-type time
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // representations in the presence of possible truncation to time_t by
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // division and use with other functions that accept time_t.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When representing the most distant time in the future, add in an extra
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 999ms to avoid the time being less than any other possible value that
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // this function can return.
2868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // On Android, SysTime is int64, special care must be taken to avoid
2888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // overflows.
2898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const int64 min_seconds = (sizeof(SysTime) < sizeof(int64))
2908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                  ? std::numeric_limits<SysTime>::min()
2918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                  : std::numeric_limits<int32_t>::min();
2928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const int64 max_seconds = (sizeof(SysTime) < sizeof(int64))
2938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                  ? std::numeric_limits<SysTime>::max()
2948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                  : std::numeric_limits<int32_t>::max();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exploded.year < 1969) {
2968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      milliseconds = min_seconds * kMillisecondsPerSecond;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      milliseconds = max_seconds * kMillisecondsPerSecond;
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      milliseconds += (kMillisecondsPerSecond - 1);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    milliseconds = seconds * kMillisecondsPerSecond + exploded.millisecond;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adjust from Unix (1970) to Windows (1601) epoch.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Time((milliseconds * kMicrosecondsPerMillisecond) +
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWindowsEpochDeltaMicroseconds);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TimeTicks ------------------------------------------------------------------
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TimeTicks TimeTicks::Now() {
313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return ClockNow(CLOCK_MONOTONIC);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TimeTicks TimeTicks::HighResNow() {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Now();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// static
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool TimeTicks::IsHighResNowFastAndReliable() {
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return true;
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static
327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TimeTicks TimeTicks::ThreadNow() {
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    defined(OS_ANDROID)
330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return ClockNow(CLOCK_THREAD_CPUTIME_ID);
331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else
332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  NOTREACHED();
333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return TimeTicks();
334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use the Chrome OS specific system-wide clock.
338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_CHROMEOS)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TimeTicks TimeTicks::NowFromSystemTraceTime() {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64_t absolute_micro;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct timespec ts;
34446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (clock_gettime(kClockSystemTrace, &ts) != 0) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NB: fall-back for a chrome os build running on linux
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HighResNow();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  absolute_micro =
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (static_cast<int64>(ts.tv_sec) * Time::kMicrosecondsPerSecond) +
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (static_cast<int64>(ts.tv_nsec) / Time::kNanosecondsPerMicrosecond);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeTicks(absolute_micro);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else  // !defined(OS_CHROMEOS)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TimeTicks TimeTicks::NowFromSystemTraceTime() {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HighResNow();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !OS_MACOSX
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Time Time::FromTimeVal(struct timeval t) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LT(t.tv_usec, static_cast<int>(Time::kMicrosecondsPerSecond));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GE(t.tv_usec, 0);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (t.tv_usec == 0 && t.tv_sec == 0)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Time();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (t.tv_usec == static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1 &&
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      t.tv_sec == std::numeric_limits<time_t>::max())
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Max();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Time(
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (static_cast<int64>(t.tv_sec) * Time::kMicrosecondsPerSecond) +
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      t.tv_usec +
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTimeTToMicrosecondsOffset);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct timeval Time::ToTimeVal() const {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct timeval result;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_null()) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.tv_sec = 0;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.tv_usec = 0;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_max()) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.tv_sec = std::numeric_limits<time_t>::max();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.tv_usec = static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 us = us_ - kTimeTToMicrosecondsOffset;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.tv_sec = us / Time::kMicrosecondsPerSecond;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.tv_usec = us % Time::kMicrosecondsPerSecond;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
401