#include #include #include #include "syscall.h" #include "libc.h" #include "atomic.h" static int sc_clock_gettime(clockid_t clk, struct timespec *ts) { return __syscall(SYS_clock_gettime, clk, ts); } static int sc_gettimeofday(clockid_t clk, struct timespec *ts) { if (clk != CLOCK_REALTIME) return EINVAL; __syscall(SYS_gettimeofday, ts, 0); ts->tv_nsec = (int)ts->tv_nsec * 1000; return 0; } void *__vdsosym(const char *, const char *); int __clock_gettime(clockid_t clk, struct timespec *ts) { static int (*cgt)(clockid_t, struct timespec *); if (!cgt) { int (*f)(clockid_t, struct timespec *) = 0; #ifdef VDSO_CGT_SYM f = __vdsosym(VDSO_CGT_VER, VDSO_CGT_SYM); #endif if (!f) { int r = sc_clock_gettime(clk, ts); if (r == -ENOSYS) { f = sc_gettimeofday; } else { a_cas_p(&cgt, 0, sc_clock_gettime); return r; } } a_cas_p(&cgt, 0, f); } return cgt(clk, ts); }