summaryrefslogtreecommitdiff
path: root/clock_gettime.c
blob: 67a2d21e746b24a57e76e0e63d134fbdc57717a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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);
    tp->tv_sec = mts.tv_sec;
    tp->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--;
    }
#endif /* __MACH__ */
    return 0;
}
#endif /* HAVE_CLOCK_GETTIME */

/* end */