diff options
Diffstat (limited to 'clock_gettime.c')
-rw-r--r-- | clock_gettime.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/clock_gettime.c b/clock_gettime.c new file mode 100644 index 00000000..b6b7dff1 --- /dev/null +++ b/clock_gettime.c @@ -0,0 +1,47 @@ +/* + * Simulate ANSI/POSIX conformance on platforms that don't have it + * + * This file is Copyright (c) 2010 by the GPSD project + * BSD terms apply: see the file COPYING in the distribution root for details. + */ +#include <time.h> +#include <sys/time.h> + +#include "compiler.h" + +#ifdef __MACH__ +#include <mach/clock.h> +#include <mach/mach.h> +#endif + +#ifndef HAVE_CLOCK_GETTIME +int clock_gettime(clockid_t clk_id UNUSED, struct timespec *tp) +{ +#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time + 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); + ts.tv_sec = mts.tv_sec; + ts.tv_nsec = mts.tv_nsec; +#else + struct timeval tv; + if (gettimeofday(&tv, NULL) < 0) + return -1; + tp->ts_sec = tv.tv_sec; + tp->ts_nsec = tv.tv_usec * 1000; + /* paranoid programming */ + if (1000000 <= (tv)->tv_usec) { + (tv)->tv_usec -= 1000000; + (tv)->tv_sec++; + } else if (0 > (tv)->tv_usec) { + (tv)->tv_usec += 1000000; + (tv)->tv_sec--; + } + return 0; +#endif /* __MACH__ */ +} +#endif /* HAVE_CLOCK_GETTIME */ + +/* end */ |