summaryrefslogtreecommitdiff
path: root/sal
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2013-07-06 10:32:45 +0300
committerTor Lillqvist <tml@iki.fi>2013-07-06 10:41:51 +0300
commitc154551d638cc016b5c3d615a32450dc38902098 (patch)
tree31713764fcf1d822f4377805cde8e160aa58085e /sal
parent06c5c7f0d353ffc6c7012a9827f82d5c60499049 (diff)
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
Diffstat (limited to 'sal')
-rw-r--r--sal/osl/unx/time.c48
1 files changed, 31 insertions, 17 deletions
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 <assert.h>
#include <unistd.h>
-#if defined(MACOSX) || defined(IOS)
-#include <mach/mach_time.h>
+#ifdef __MACH__
+#include <mach/clock.h>
+#include <mach/mach.h>
#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, &currentTime);
+ 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;