瀏覽代碼

HPCC-14577 OSX builds warn about missing CLOCK_MONOTONIC

Also improve accuracy of timers on OSX.

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 9 年之前
父節點
當前提交
99d41a3bf5
共有 3 個文件被更改,包括 32 次插入1 次删除
  1. 6 1
      system/jlib/jdebug.cpp
  2. 20 0
      system/jlib/jutil.cpp
  3. 6 0
      system/jlib/jutil.hpp

+ 6 - 1
system/jlib/jdebug.cpp

@@ -364,7 +364,9 @@ cycle_t jlib_decl get_cycles_now()
     if (useRDTSC)
         return getTSC();
 #endif
-#ifndef __APPLE__
+#ifdef __APPLE__
+    return mach_absolute_time();
+#elif defined(CLOCK_MONOTONIC)
     if (!use_gettimeofday) {
         timespec tm;
         if (clock_gettime(CLOCK_MONOTONIC, &tm)>=0)
@@ -383,6 +385,9 @@ __int64 jlib_decl cycle_to_nanosec(cycle_t cycles)
 #if defined(_ARCH_X86_) || defined(_ARCH_X86_64_)
     if (useRDTSC)
         return (__int64)((double)cycles * cycleToNanoScale);
+#ifdef __APPLE__
+    return cycles * (uint64_t) timebase_info.numer / (uint64_t)timebase_info.denom;
+#endif
 #endif
     return cycles;
 }

+ 20 - 0
system/jlib/jutil.cpp

@@ -60,6 +60,8 @@ static CriticalSection * protectedGeneratorCs;
 
 #if defined (__APPLE__)
 #include <mach-o/dyld.h>
+#include <mach/mach_time.h> /* mach_absolute_time */
+mach_timebase_info_data_t timebase_info  = { 1,1 };
 #endif
 
 MODULE_INIT(INIT_PRIORITY_SYSTEM)
@@ -69,6 +71,10 @@ MODULE_INIT(INIT_PRIORITY_SYSTEM)
     protectedGenerator = createRandomNumberGenerator();
     protectedGeneratorCs = new CriticalSection;
 #endif
+#if defined (__APPLE__)
+    if (mach_timebase_info(&timebase_info) != KERN_SUCCESS)
+        return false;
+#endif
     return true;
 }
 
@@ -1483,6 +1489,20 @@ unsigned usTick()
     gettimeofday(&tm,NULL);
     return tm.tv_sec*1000000+tm.tv_usec; 
 }
+#elif __APPLE__
+
+unsigned usTick()
+{
+    __uint64 nano = mach_absolute_time() * (uint64_t)timebase_info.numer / (uint64_t)timebase_info.denom;
+    return nano / 1000;
+}
+
+unsigned msTick()
+{
+    __uint64 nano = mach_absolute_time() * (uint64_t)timebase_info.numer / (uint64_t)timebase_info.denom;
+    return nano / 1000000;
+}
+
 #else
 #warning "clock_gettime(CLOCK_MONOTONIC) not supported"
 unsigned msTick() 

+ 6 - 0
system/jlib/jutil.hpp

@@ -24,6 +24,12 @@
 #include "jarray.hpp"
 #include "jbuff.hpp"
 
+#if defined (__APPLE__)
+#include <mach-o/dyld.h>
+#include <mach/mach_time.h>
+extern mach_timebase_info_data_t timebase_info;   // Calibration for nanosecond timer
+#endif
+
 //#define NAMEDCOUNTS
 
 interface IPropertyTree;