diff options
author | Andrey Akinshin <andrey.akinshin@gmail.com> | 2018-06-18 13:11:32 -0400 |
---|---|---|
committer | Stephen Toub <stoub@microsoft.com> | 2018-06-18 13:11:32 -0400 |
commit | a88923778b841a51d9656f714f171115baf7ca80 (patch) | |
tree | bfa77cc2d83c0a22bddacb0e81e0cd672a00f6d9 | |
parent | 71f4199f7dd043c4901a187b9bd88ab40e2b87e2 (diff) | |
download | coreclr-a88923778b841a51d9656f714f171115baf7ca80.tar.gz coreclr-a88923778b841a51d9656f714f171115baf7ca80.tar.bz2 coreclr-a88923778b841a51d9656f714f171115baf7ca80.zip |
mach_absolute_time as the primary clock source on macOS (corefx#30391) (#18505)
macOS 10.12+ supports clock_gettime (HAVE_CLOCK_MONOTONIC is defined)
However, mach_absolute_time has better resolution and should be used
as the primary clock source.
-rw-r--r-- | src/pal/src/misc/time.cpp | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/src/pal/src/misc/time.cpp b/src/pal/src/misc/time.cpp index d16fb587ba..b660cc0a56 100644 --- a/src/pal/src/misc/time.cpp +++ b/src/pal/src/misc/time.cpp @@ -202,7 +202,11 @@ QueryPerformanceCounter( PERF_ENTRY(QueryPerformanceCounter); ENTRY("QueryPerformanceCounter()\n"); do -#if HAVE_CLOCK_MONOTONIC +#if HAVE_MACH_ABSOLUTE_TIME + { + lpPerformanceCount->QuadPart = (LONGLONG)mach_absolute_time(); + } +#elif HAVE_CLOCK_MONOTONIC { struct timespec ts; if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) @@ -214,10 +218,6 @@ QueryPerformanceCounter( lpPerformanceCount->QuadPart = (LONGLONG)ts.tv_sec * (LONGLONG)tccSecondsToNanoSeconds + (LONGLONG)ts.tv_nsec; } -#elif HAVE_MACH_ABSOLUTE_TIME - { - lpPerformanceCount->QuadPart = (LONGLONG)mach_absolute_time(); - } #elif HAVE_GETHRTIME { lpPerformanceCount->QuadPart = (LONGLONG)gethrtime(); @@ -264,9 +264,7 @@ QueryPerformanceFrequency( BOOL retval = TRUE; PERF_ENTRY(QueryPerformanceFrequency); ENTRY("QueryPerformanceFrequency()\n"); -#if HAVE_GETHRTIME || HAVE_READ_REAL_TIME || HAVE_CLOCK_MONOTONIC - lpFrequency->QuadPart = (LONGLONG)tccSecondsToNanoSeconds; -#elif HAVE_MACH_ABSOLUTE_TIME +#if HAVE_MACH_ABSOLUTE_TIME // use denom == 0 to indicate that s_TimebaseInfo is uninitialised. if (s_TimebaseInfo.denom == 0) { @@ -277,9 +275,11 @@ QueryPerformanceFrequency( { lpFrequency->QuadPart = (LONGLONG)tccSecondsToNanoSeconds * ((LONGLONG)s_TimebaseInfo.denom / (LONGLONG)s_TimebaseInfo.numer); } +#elif HAVE_GETHRTIME || HAVE_READ_REAL_TIME || HAVE_CLOCK_MONOTONIC + lpFrequency->QuadPart = (LONGLONG)tccSecondsToNanoSeconds; #else lpFrequency->QuadPart = (LONGLONG)tccSecondsToMicroSeconds; -#endif // HAVE_GETHRTIME || HAVE_READ_REAL_TIME || HAVE_CLOCK_MONOTONIC +#endif // HAVE_MACH_ABSOLUTE_TIME LOGEXIT("QueryPerformanceFrequency\n"); PERF_EXIT(QueryPerformanceFrequency); return retval; @@ -338,7 +338,17 @@ GetTickCount64() { ULONGLONG retval = 0; -#if HAVE_CLOCK_MONOTONIC_COARSE || HAVE_CLOCK_MONOTONIC +#if HAVE_MACH_ABSOLUTE_TIME + { + // use denom == 0 to indicate that s_TimebaseInfo is uninitialised. + if (s_TimebaseInfo.denom == 0) + { + ASSERT("s_TimebaseInfo is uninitialized.\n"); + goto EXIT; + } + retval = (mach_absolute_time() * s_TimebaseInfo.numer / s_TimebaseInfo.denom) / tccMillieSecondsToNanoSeconds; + } +#elif HAVE_CLOCK_MONOTONIC_COARSE || HAVE_CLOCK_MONOTONIC { clockid_t clockType = #if HAVE_CLOCK_MONOTONIC_COARSE @@ -354,16 +364,6 @@ GetTickCount64() } retval = (ts.tv_sec * tccSecondsToMillieSeconds)+(ts.tv_nsec / tccMillieSecondsToNanoSeconds); } -#elif HAVE_MACH_ABSOLUTE_TIME - { - // use denom == 0 to indicate that s_TimebaseInfo is uninitialised. - if (s_TimebaseInfo.denom == 0) - { - ASSERT("s_TimebaseInfo is uninitialized.\n"); - goto EXIT; - } - retval = (mach_absolute_time() * s_TimebaseInfo.numer / s_TimebaseInfo.denom) / tccMillieSecondsToNanoSeconds; - } #elif HAVE_GETHRTIME { retval = (ULONGLONG)(gethrtime() / tccMillieSecondsToNanoSeconds); |