From c98a8876cd2070d8789443f853f11a3ba45c794f Mon Sep 17 00:00:00 2001 From: Andrey Akinshin Date: Mon, 18 Jun 2018 13:11:32 -0400 Subject: [PATCH] mach_absolute_time as the primary clock source on macOS (corefxdotnet/coreclr#30391) (dotnet/coreclr#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. Commit migrated from https://github.com/dotnet/coreclr/commit/a88923778b841a51d9656f714f171115baf7ca80 --- src/coreclr/src/pal/src/misc/time.cpp | 40 +++++++++++++++++------------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/coreclr/src/pal/src/misc/time.cpp b/src/coreclr/src/pal/src/misc/time.cpp index d16fb58..b660cc0 100644 --- a/src/coreclr/src/pal/src/misc/time.cpp +++ b/src/coreclr/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); -- 2.7.4