]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: Implement monotonically increasing clock for Darwin.
authorHasso Tepper <hasso.tepper@gmail.com>
Thu, 11 Oct 2012 11:31:54 +0000 (11:31 +0000)
committerDavid Lamparter <equinox@opensourcerouting.org>
Mon, 5 Nov 2012 20:16:53 +0000 (15:16 -0500)
There is no Posix CLOCK_MONOTONIC in Darwin, but monotonically
increasing clock can be implemented using mach_absolute_time().

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
lib/thread.c

index 6341dfd77cb8c9a9f16ab66f1d323c64e3e9f34b..16c92c2467779f68543573d01d6456f3c68c6726 100644 (file)
 extern int agentx_enabled;
 #endif
 
+#if defined(__APPLE__)
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+#endif
+
 \f
 /* Recent absolute time of day */
 struct timeval recent_time;
@@ -103,7 +108,7 @@ timeval_elapsed (struct timeval a, struct timeval b)
          + (a.tv_usec - b.tv_usec));
 }
 \f
-#ifndef HAVE_CLOCK_MONOTONIC
+#if !defined(HAVE_CLOCK_MONOTONIC) && !defined(__APPLE__)
 static void
 quagga_gettimeofday_relative_adjust (void)
 {
@@ -122,7 +127,7 @@ quagga_gettimeofday_relative_adjust (void)
     }
   last_recent_time = recent_time;
 }
-#endif /* !HAVE_CLOCK_MONOTONIC */
+#endif /* !HAVE_CLOCK_MONOTONIC && !__APPLE__ */
 
 /* gettimeofday wrapper, to keep recent_time updated */
 static int
@@ -162,7 +167,23 @@ quagga_get_relative (struct timeval *tv)
         relative_time.tv_usec = tp.tv_nsec / 1000;
       }
   }
-#else /* !HAVE_CLOCK_MONOTONIC */
+#elif defined(__APPLE__)
+  {
+    uint64_t ticks;
+    uint64_t useconds;
+    static mach_timebase_info_data_t timebase_info;
+
+    ticks = mach_absolute_time();
+    if (timebase_info.denom == 0)
+      mach_timebase_info(&timebase_info);
+
+    useconds = ticks * timebase_info.numer / timebase_info.denom / 1000;
+    relative_time.tv_sec = useconds / 1000000;
+    relative_time.tv_usec = useconds % 1000000;
+
+    return 0;
+  }
+#else /* !HAVE_CLOCK_MONOTONIC && !__APPLE__ */
   if (!(ret = quagga_gettimeofday (&recent_time)))
     quagga_gettimeofday_relative_adjust();
 #endif /* HAVE_CLOCK_MONOTONIC */