1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===------------------------- chrono.cpp ---------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9103f80d81815358e21f0d5f9ba5087eb36ab041bEric Fiselier 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "chrono" 118c42c8cb467154027d88e8df6648dde0f70edac4Marshall Clow#include "cerrno" // errno 128c42c8cb467154027d88e8df6648dde0f70edac4Marshall Clow#include "system_error" // __throw_system_error 138c42c8cb467154027d88e8df6648dde0f70edac4Marshall Clow#include <time.h> // clock_gettime, CLOCK_MONOTONIC and CLOCK_REALTIME 1422a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten 15ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#if (__APPLE__) 16ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) 17ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101200 18ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#define _LIBCXX_USE_CLOCK_GETTIME 19ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#endif 20ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#elif defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) 21ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#if __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 100000 22ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#define _LIBCXX_USE_CLOCK_GETTIME 23ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#endif 24ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#elif defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) 25ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#if __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ >= 100000 26ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#define _LIBCXX_USE_CLOCK_GETTIME 27ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#endif 28ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#elif defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) 29ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#if __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ >= 30000 30ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#define _LIBCXX_USE_CLOCK_GETTIME 31ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#endif 32ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#endif // __ENVIRONMENT_.*_VERSION_MIN_REQUIRED__ 33ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#else 34ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#define _LIBCXX_USE_CLOCK_GETTIME 35ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#endif // __APPLE__ 36ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes 37e34f9d5ef356cced5f05d9a06a7e4de9442ddfc7Saleem Abdulrasool#if defined(_LIBCPP_WIN32API) 3867372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#define WIN32_LEAN_AND_MEAN 3967372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#define VC_EXTRA_LEAN 40c79549b70e66c251c15dd145c964edb70fa2e2b3Dan Albert#include <windows.h> 4167372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 4267372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#include <winapifamily.h> 4367372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#endif 4467372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#else 45f7dbfec9d32c452ad45a61589063c96a026ea229Bruno Cardoso Lopes#if !defined(CLOCK_REALTIME) || !defined(_LIBCXX_USE_CLOCK_GETTIME) 4622a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten#include <sys/time.h> // for gettimeofday and timeval 47e34f9d5ef356cced5f05d9a06a7e4de9442ddfc7Saleem Abdulrasool#endif // !defined(CLOCK_REALTIME) 48e34f9d5ef356cced5f05d9a06a7e4de9442ddfc7Saleem Abdulrasool#endif // defined(_LIBCPP_WIN32API) 4922a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten 5075748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool#if !defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) 5122a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten#if __APPLE__ 5222a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten#include <mach/mach_time.h> // mach_absolute_time, mach_timebase_info_data_t 53e34f9d5ef356cced5f05d9a06a7e4de9442ddfc7Saleem Abdulrasool#elif !defined(_LIBCPP_WIN32API) && !defined(CLOCK_MONOTONIC) 5422a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten#error "Monotonic clock not implemented" 5522a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten#endif 5622a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten#endif 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace chrono 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// system_clock 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 650a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst bool system_clock::is_steady; 660a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantsystem_clock::time_point 68756a1763d1a57d7d3439bb7c83b411c8f6dc4da8Howard Hinnantsystem_clock::now() _NOEXCEPT 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 70e34f9d5ef356cced5f05d9a06a7e4de9442ddfc7Saleem Abdulrasool#if defined(_LIBCPP_WIN32API) 71864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool // FILETIME is in 100ns units 72864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool using filetime_duration = 73864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool _VSTD::chrono::duration<__int64, 74864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool _VSTD::ratio_multiply<_VSTD::ratio<100, 1>, 75864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool nanoseconds::period>>; 7667372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool 77864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool // The Windows epoch is Jan 1 1601, the Unix epoch Jan 1 1970. 78b3f4bdf5491bec5ea4c85cb113c5f2c5845bf722Saleem Abdulrasool static _LIBCPP_CONSTEXPR const seconds nt_to_unix_epoch{11644473600}; 79864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool 80864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool FILETIME ft; 8167372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 8267372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) 83864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool GetSystemTimePreciseAsFileTime(&ft); 8467372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#else 85864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool GetSystemTimeAsFileTime(&ft); 8667372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#endif 8767372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#else 88864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool GetSystemTimeAsFileTime(&ft); 8967372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#endif 90864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool 91864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool filetime_duration d{(static_cast<__int64>(ft.dwHighDateTime) << 32) | 92864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool static_cast<__int64>(ft.dwLowDateTime)}; 93864ad6d129a89a474c8fb1350df41d0008019677Saleem Abdulrasool return time_point(duration_cast<duration>(d - nt_to_unix_epoch)); 9467372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#else 95ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#if defined(_LIBCXX_USE_CLOCK_GETTIME) && defined(CLOCK_REALTIME) 9622a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten struct timespec tp; 9722a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten if (0 != clock_gettime(CLOCK_REALTIME, &tp)) 9822a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten __throw_system_error(errno, "clock_gettime(CLOCK_REALTIME) failed"); 9922a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten return time_point(seconds(tp.tv_sec) + microseconds(tp.tv_nsec / 1000)); 100ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#else 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant timeval tv; 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant gettimeofday(&tv, 0); 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return time_point(seconds(tv.tv_sec) + microseconds(tv.tv_usec)); 104ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#endif // _LIBCXX_USE_CLOCK_GETTIME && CLOCK_REALTIME 10567372ee77e659747b97e6a5d1eb6219b2292f0d0Saleem Abdulrasool#endif 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttime_t 109756a1763d1a57d7d3439bb7c83b411c8f6dc4da8Howard Hinnantsystem_clock::to_time_t(const time_point& t) _NOEXCEPT 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return time_t(duration_cast<seconds>(t.time_since_epoch()).count()); 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantsystem_clock::time_point 115756a1763d1a57d7d3439bb7c83b411c8f6dc4da8Howard Hinnantsystem_clock::from_time_t(time_t t) _NOEXCEPT 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return system_clock::time_point(seconds(t)); 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 120c5780651c3a02a39812d961cb49fe47994b1fcafJonathan Roelofs#ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK 121f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnant// steady_clock 12222a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten// 12322a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten// Warning: If this is not truly steady, then it is non-conforming. It is 12422a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten// better for it to not exist and have the rest of libc++ use system_clock 12522a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten// instead. 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 1270a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst bool steady_clock::is_steady; 1280a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant 12975748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool#if defined(__APPLE__) 13022a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten 131ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes// Darwin libc versions >= 1133 provide ns precision via CLOCK_UPTIME_RAW 132ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#if defined(_LIBCXX_USE_CLOCK_GETTIME) && defined(CLOCK_UPTIME_RAW) 133ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopessteady_clock::time_point 134ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopessteady_clock::now() _NOEXCEPT 135ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes{ 136ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes struct timespec tp; 137ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes if (0 != clock_gettime(CLOCK_UPTIME_RAW, &tp)) 138ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes __throw_system_error(errno, "clock_gettime(CLOCK_UPTIME_RAW) failed"); 139ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes return time_point(seconds(tp.tv_sec) + nanoseconds(tp.tv_nsec)); 140ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes} 141ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes 142ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#else 143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// mach_absolute_time() * MachInfo.numer / MachInfo.denom is the number of 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// nanoseconds since the computer booted up. MachInfo.numer and MachInfo.denom 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// are run time constants supplied by the OS. This clock has no relationship 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// to the Gregorian calendar. It's main use is as a high resolution timer. 147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// MachInfo.numer / MachInfo.denom is often 1 on the latest equipment. Specialize 149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// for that case as an optimization. 150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic 152f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnantsteady_clock::rep 153f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnantsteady_simplified() 154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 155ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant return static_cast<steady_clock::rep>(mach_absolute_time()); 156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic 159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantdouble 160f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnantcompute_steady_factor() 161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant mach_timebase_info_data_t MachInfo; 163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant mach_timebase_info(&MachInfo); 164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return static_cast<double>(MachInfo.numer) / MachInfo.denom; 165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic 168f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnantsteady_clock::rep 169f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnantsteady_full() 170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 171f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnant static const double factor = compute_steady_factor(); 172f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnant return static_cast<steady_clock::rep>(mach_absolute_time() * factor); 173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 175f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnanttypedef steady_clock::rep (*FP)(); 176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic 178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantFP 179f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnantinit_steady_clock() 180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant mach_timebase_info_data_t MachInfo; 182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant mach_timebase_info(&MachInfo); 183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (MachInfo.numer == MachInfo.denom) 184f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnant return &steady_simplified; 185f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnant return &steady_full; 186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 188f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnantsteady_clock::time_point 189756a1763d1a57d7d3439bb7c83b411c8f6dc4da8Howard Hinnantsteady_clock::now() _NOEXCEPT 190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 191f8f852138f86e4588916021e1afedfcab25298c0Howard Hinnant static FP fp = init_steady_clock(); 192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return time_point(duration(fp())); 193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 194ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#endif // defined(_LIBCXX_USE_CLOCK_GETTIME) && defined(CLOCK_UPTIME_RAW) 195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 196e34f9d5ef356cced5f05d9a06a7e4de9442ddfc7Saleem Abdulrasool#elif defined(_LIBCPP_WIN32API) 19775748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool 19875748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasoolsteady_clock::time_point 19975748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasoolsteady_clock::now() _NOEXCEPT 20075748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool{ 2014ed4bca5f3000e2ed68f81b35fbe8d586a6e67f1Saleem Abdulrasool static LARGE_INTEGER freq; 2024ed4bca5f3000e2ed68f81b35fbe8d586a6e67f1Saleem Abdulrasool static BOOL initialized = FALSE; 2034ed4bca5f3000e2ed68f81b35fbe8d586a6e67f1Saleem Abdulrasool if (!initialized) 2044ed4bca5f3000e2ed68f81b35fbe8d586a6e67f1Saleem Abdulrasool initialized = QueryPerformanceFrequency(&freq); // always succceeds 2054ed4bca5f3000e2ed68f81b35fbe8d586a6e67f1Saleem Abdulrasool 2064ed4bca5f3000e2ed68f81b35fbe8d586a6e67f1Saleem Abdulrasool LARGE_INTEGER counter; 2074ed4bca5f3000e2ed68f81b35fbe8d586a6e67f1Saleem Abdulrasool QueryPerformanceCounter(&counter); 2084ed4bca5f3000e2ed68f81b35fbe8d586a6e67f1Saleem Abdulrasool return time_point(duration(counter.QuadPart * nano::den / freq.QuadPart)); 20975748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool} 21075748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool 21175748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool#elif defined(CLOCK_MONOTONIC) 21275748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool 213ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes// On Apple platforms only CLOCK_UPTIME_RAW or mach_absolute_time are able to 214ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes// time functions in the nanosecond range. Thus, they are the only acceptable 215ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes// implementations of steady_clock. 216ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#ifdef __APPLE__ 217ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#error "Never use CLOCK_MONOTONIC for steady_clock::now on Apple platforms" 218ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes#endif 219ac7fc6cf28ac6fb256e46b7e815cf78fdce53905Bruno Cardoso Lopes 22075748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasoolsteady_clock::time_point 22175748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasoolsteady_clock::now() _NOEXCEPT 22275748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool{ 22375748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool struct timespec tp; 22475748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool if (0 != clock_gettime(CLOCK_MONOTONIC, &tp)) 22575748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool __throw_system_error(errno, "clock_gettime(CLOCK_MONOTONIC) failed"); 22675748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool return time_point(seconds(tp.tv_sec) + nanoseconds(tp.tv_nsec)); 22775748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool} 22875748cde64db21597955e84e43a30d607a4a14beSaleem Abdulrasool 22922a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten#else 23022a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten#error "Monotonic clock not implemented" 23122a6d5aedea6cf18abe31c303b94cf69c3be460bEd Schouten#endif 232adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant 233c5780651c3a02a39812d961cb49fe47994b1fcafJonathan Roelofs#endif // !_LIBCPP_HAS_NO_MONOTONIC_CLOCK 234c5780651c3a02a39812d961cb49fe47994b1fcafJonathan Roelofs 235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD 238