/* These macros are also in sys/time.h. */
#if !defined(CLOCK_REALTIME) && __POSIX_VISIBLE >= 200112
-#define CLOCK_REALTIME 0
+#define CLOCK_REALTIME 0
#ifdef __BSD_VISIBLE
-#define CLOCK_VIRTUAL 1
-#define CLOCK_PROF 2
+#define CLOCK_VIRTUAL 1
+#define CLOCK_PROF 2
#endif
-#define CLOCK_MONOTONIC 4
+#define CLOCK_MONOTONIC 4 /* from freebsd */
+#define CLOCK_UPTIME 5 /* from freebsd */
+#define CLOCK_UPTIME_PRECISE 7 /* from freebsd */
+#define CLOCK_UPTIME_FAST 8 /* from freebsd */
+#define CLOCK_REALTIME_PRECISE 9 /* from freebsd */
+#define CLOCK_REALTIME_FAST 10 /* from freebsd */
+#define CLOCK_MONOTONIC_PRECISE 11 /* from freebsd */
+#define CLOCK_MONOTONIC_FAST 12 /* from freebsd */
+#define CLOCK_SECOND 13 /* from freebsd */
+
#endif /* !defined(CLOCK_REALTIME) && __POSIX_VISIBLE >= 200112 */
#if !defined(TIMER_ABSTIME) && __POSIX_VISIBLE >= 200112
kern_clock_gettime(clockid_t clock_id, struct timespec *ats)
{
int error = 0;
+ struct proc *p;
switch(clock_id) {
case CLOCK_REALTIME:
+ case CLOCK_REALTIME_PRECISE:
nanotime(ats);
break;
+ case CLOCK_REALTIME_FAST:
+ getnanotime(ats);
+ break;
case CLOCK_MONOTONIC:
+ case CLOCK_MONOTONIC_PRECISE:
+ case CLOCK_UPTIME:
+ case CLOCK_UPTIME_PRECISE:
nanouptime(ats);
break;
+ case CLOCK_MONOTONIC_FAST:
+ case CLOCK_UPTIME_FAST:
+ getnanouptime(ats);
+ break;
+ case CLOCK_VIRTUAL:
+ p = curproc;
+ ats->tv_sec = p->p_timer[ITIMER_VIRTUAL].it_value.tv_sec;
+ ats->tv_nsec = p->p_timer[ITIMER_VIRTUAL].it_value.tv_usec *
+ 1000;
+ break;
+ case CLOCK_PROF:
+ p = curproc;
+ ats->tv_sec = p->p_timer[ITIMER_PROF].it_value.tv_sec;
+ ats->tv_nsec = p->p_timer[ITIMER_PROF].it_value.tv_usec *
+ 1000;
+ break;
+ case CLOCK_SECOND:
+ ats->tv_sec = time_second;
+ ats->tv_nsec = 0;
+ break;
default:
error = EINVAL;
break;
switch(clock_id) {
case CLOCK_REALTIME:
+ case CLOCK_REALTIME_FAST:
+ case CLOCK_REALTIME_PRECISE:
case CLOCK_MONOTONIC:
+ case CLOCK_MONOTONIC_FAST:
+ case CLOCK_MONOTONIC_PRECISE:
+ case CLOCK_UPTIME:
+ case CLOCK_UPTIME_FAST:
+ case CLOCK_UPTIME_PRECISE:
/*
* Round up the result of the division cheaply
* by adding 1. Rounding up is especially important
ts->tv_nsec = 1000000000 / sys_cputimer->freq + 1;
error = 0;
break;
+ case CLOCK_VIRTUAL:
+ case CLOCK_PROF:
+ /* Accurately round up here because we can do so cheaply. */
+ ts->tv_sec = 0;
+ ts->tv_nsec = (1000000000 + hz - 1) / hz;
+ error = 0;
+ break;
+ case CLOCK_SECOND:
+ ts->tv_sec = 1;
+ ts->tv_nsec = 0;
+ error = 0;
+ break;
default:
error = EINVAL;
break;
/* CLOCK_REALTIME and TIMER_ABSTIME are supposed to be in time.h */
#ifndef CLOCK_REALTIME
-#define CLOCK_REALTIME 0
+#define CLOCK_REALTIME 0
#endif
-#define CLOCK_VIRTUAL 1
-#define CLOCK_PROF 2
-#define CLOCK_MONOTONIC 4
+#define CLOCK_VIRTUAL 1
+#define CLOCK_PROF 2
+#define CLOCK_MONOTONIC 4
+
+#define CLOCK_UPTIME 5 /* from freebsd */
+#define CLOCK_UPTIME_PRECISE 7 /* from freebsd */
+#define CLOCK_UPTIME_FAST 8 /* from freebsd */
+#define CLOCK_REALTIME_PRECISE 9 /* from freebsd */
+#define CLOCK_REALTIME_FAST 10 /* from freebsd */
+#define CLOCK_MONOTONIC_PRECISE 11 /* from freebsd */
+#define CLOCK_MONOTONIC_FAST 12 /* from freebsd */
+#define CLOCK_SECOND 13 /* from freebsd */
#define TIMER_RELTIME 0x0 /* relative timer */
#ifndef TIMER_ABSTIME