From c154551d638cc016b5c3d615a32450dc38902098 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Sat, 6 Jul 2013 10:32:45 +0300 Subject: Don't use mach_absolute_time(), it gives time since boot Which definitely is not what we want here. Use clock_get_time() on a CALENDAR_CLOCK instead, that gives time since the Unix epoch. So our osl_getSystemTime() had been completely broken on OS X since May 19 (d8d55787b81cdc955b73c8befa4ab608f46e32aa) and no unit test had noticed... Fairly coincidentally, an assert() introduced yesterday in 4d220882b46d5f8edd4d09e5f66722cd296a092e caught it. Change-Id: Iad76a7aadc39159fdc80c99087bb527d6aa49c66 --- sal/osl/unx/time.c | 48 +++++++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 17 deletions(-) (limited to 'sal') diff --git a/sal/osl/unx/time.c b/sal/osl/unx/time.c index 38e8f36f1932..1afaaf6c33a9 100644 --- a/sal/osl/unx/time.c +++ b/sal/osl/unx/time.c @@ -26,8 +26,9 @@ #include #include -#if defined(MACOSX) || defined(IOS) -#include +#ifdef __MACH__ +#include +#include #endif /* FIXME: detection should be done in configure script */ @@ -39,9 +40,8 @@ #define HAS_ALTZONE 1 #endif -#if defined(MACOSX) || defined(IOS) -typedef sal_uInt64 osl_time_t; -static double adjust_time_factor; +#ifdef __MACH__ +typedef mach_timespec_t osl_time_t; #else #if defined(_POSIX_TIMERS) #define USE_CLOCK_GETTIME @@ -59,10 +59,16 @@ static osl_time_t startTime; sal_Bool SAL_CALL osl_getSystemTime(TimeValue* tv) { -#if defined(MACOSX) || defined(IOS) - double diff = (double)(mach_absolute_time() - startTime) * adjust_time_factor; - tv->Seconds = (sal_uInt32)diff; - tv->Nanosec = (sal_uInt32)((diff - tv->Seconds) * 1e9); +#ifdef __MACH__ + clock_serv_t cclock; + mach_timespec_t mts; + + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); + clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + + tv->Seconds = mts.tv_sec; + tv->Nanosec = mts.tv_nsec; #else int res; osl_time_t tp; @@ -274,11 +280,12 @@ sal_Bool SAL_CALL osl_getSystemTimeFromLocalTime( const TimeValue* pLocalTimeVal void sal_initGlobalTimer() { -#if defined(MACOSX) || defined(IOS) - mach_timebase_info_data_t timebase; - mach_timebase_info(&timebase); - adjust_time_factor = 1e-9 * (double)timebase.numer / (double)(timebase.denom); - startTime = mach_absolute_time(); +#ifdef __MACH__ + clock_serv_t cclock; + + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); + clock_get_time(cclock, &startTime); + mach_port_deallocate(mach_task_self(), cclock); #else /* ! (MACOSX || IOS) */ int res; #if defined(USE_CLOCK_GETTIME) @@ -295,9 +302,16 @@ sal_uInt32 SAL_CALL osl_getGlobalTimer() { sal_uInt32 nSeconds; -#if defined(MACOSX) || defined(IOS) - double diff = (double)(mach_absolute_time() - startTime) * adjust_time_factor * 1000; - nSeconds = (sal_uInt32)diff; +#ifdef __MACH__ + clock_serv_t cclock; + mach_timespec_t currentTime; + + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); + clock_get_time(cclock, ¤tTime); + mach_port_deallocate(mach_task_self(), cclock); + + nSeconds = ( currentTime.tv_sec - startTime.tv_sec ); + nSeconds = ( nSeconds * 1000 ) + (long) (( currentTime.tv_nsec - startTime.tv_nsec) / 1000000 ); #else osl_time_t currentTime; int res; -- cgit