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, ×truct, 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(×truct, 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(×truct, is_local); 2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) timestruct = timestruct0; 2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) timestruct.tm_isdst = 1; 2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int64 seconds_isdst1 = SysTimeFromTimeStruct(×truct, 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