From b27dc3a44fd74570aced0ca85619a5d9d5b23fc1 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 23 Jul 2015 10:58:47 -0400 Subject: [PATCH] lib/realtime: add a compatibility layer for OSX Signed-off-by: Jean Privat --- lib/realtime.nit | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/lib/realtime.nit b/lib/realtime.nit index dc24c99..ad64930 100644 --- a/lib/realtime.nit +++ b/lib/realtime.nit @@ -21,6 +21,28 @@ in "C header" `{ #include `} +in "C" `{ + +#ifdef __MACH__ +/* OS X does not have clock_gettime, mascarade it and use clock_get_time + * cf http://stackoverflow.com/questions/11680461/monotonic-clock-on-osx +*/ +#include +#include +#define CLOCK_REALTIME CALENDAR_CLOCK +#define CLOCK_MONOTONIC SYSTEM_CLOCK +void clock_gettime(clock_t clock_name, struct timespec *ts) { + clock_serv_t cclock; + mach_timespec_t mts; + host_get_clock_service(mach_host_self(), clock_name, &cclock); + clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + ts->tv_sec = mts.tv_sec; + ts->tv_nsec = mts.tv_nsec; +} +#endif +`} + # Elapsed time representation. extern class Timespec `{struct timespec*`} @@ -105,7 +127,18 @@ class Clock # Smallest time frame reported by clock fun resolution : Timespec `{ struct timespec* tv = malloc( sizeof(struct timespec) ); +#ifdef __MACH__ + clock_serv_t cclock; + int nsecs; + mach_msg_type_number_t count; + host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock); + clock_get_attributes(cclock, CLOCK_GET_TIME_RES, (clock_attr_t)&nsecs, &count); + mach_port_deallocate(mach_task_self(), cclock); + tv->tv_sec = 0; + tv->tv_nsec = nsecs; +#else clock_getres( CLOCK_MONOTONIC, tv ); +#endif return tv; `} -- 1.7.9.5