summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Akinshin <andrey.akinshin@gmail.com>2018-06-18 13:11:32 -0400
committerStephen Toub <stoub@microsoft.com>2018-06-18 13:11:32 -0400
commita88923778b841a51d9656f714f171115baf7ca80 (patch)
treebfa77cc2d83c0a22bddacb0e81e0cd672a00f6d9
parent71f4199f7dd043c4901a187b9bd88ab40e2b87e2 (diff)
downloadcoreclr-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.cpp40
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);