From 43ac1bff7374a572d3bb0a8341ab3d167e3ac07d Mon Sep 17 00:00:00 2001
From: Jeff Muizelaar <jmuizelaar@mozilla.com>
Date: Wed, 29 Feb 2012 09:58:32 -0500
Subject: [PATCH] Implement getTime for OS X

mach_absolute_time lowest level timing function on OS X

Signed-off-by: Jose Fonseca <jose.r.fonseca@gmail.com>
---
 common/os_posix.cpp |  4 ++++
 common/os_time.hpp  | 21 +++++++++++++++------
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/common/os_posix.cpp b/common/os_posix.cpp
index 261fe88..3eebbd8 100644
--- a/common/os_posix.cpp
+++ b/common/os_posix.cpp
@@ -158,6 +158,10 @@ log(const char *format, ...)
     logging = false;
 }
 
+#if defined(__APPLE__)
+long long timeFrequency = 0LL;
+#endif
+
 void
 abort(void)
 {
diff --git a/common/os_time.hpp b/common/os_time.hpp
index a4f5209..75175d8 100644
--- a/common/os_time.hpp
+++ b/common/os_time.hpp
@@ -35,6 +35,8 @@
 #include <windows.h>
 #elif defined(__linux__)
 #include <time.h>
+#elif defined(__APPLE__)
+#include <mach/mach_time.h>
 #else
 #include <sys/time.h>
 #endif
@@ -43,15 +45,15 @@
 namespace os {
 
     // OS dependent time frequency
-#if defined(_WIN32)
-    // runtime variable on Windows
+#if defined(_WIN32) || defined(__APPLE__)
+    // runtime variable on Windows and MacOSX
     extern long long timeFrequency;
 #elif defined(__linux__)
-    // nanoseconds
-    static const long long timeFrequency = 1000000000;
+    // nanoseconds on Linux
+    static const long long timeFrequency = 1000000000LL;
 #else
-    // microseconds on
-    static const long long timeFrequency = 1000000;
+    // microseconds on Unices
+    static const long long timeFrequency = 1000000LL;
 #endif
 
     // Time from an unknown base in a unit determined by timeFrequency
@@ -72,6 +74,13 @@ namespace os {
             return 0;
         }
         return tp.tv_sec * 1000000000LL + tp.tv_nsec;
+#elif defined(__APPLE__)
+        if (!timeFrequency) {
+            mach_timebase_info_data_t timebaseInfo;
+            mach_timebase_info(&timebaseInfo);
+            timeFrequency = 1000000000LL * timebaseInfo.denom / timebaseInfo.numer;
+        }
+        return mach_absolute_time();
 #else
         struct timeval tv;
         gettimeofday(&tv, NULL);
-- 
2.45.2