X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Ftime%2Fclock_gettime.c;h=1572de0ef0029eb94b53a9928cd0a9fc57684d6a;hb=6fef8cafbd0f6f185897bc87feb1ff66e2e204e1;hp=ad5c09de9e79bcb684eac6ee08f253326584d9dc;hpb=cdfb725ca3e20e14c64ca8695496e430b89b3b2c;p=musl diff --git a/src/time/clock_gettime.c b/src/time/clock_gettime.c index ad5c09de..1572de0e 100644 --- a/src/time/clock_gettime.c +++ b/src/time/clock_gettime.c @@ -3,6 +3,7 @@ #include #include "syscall.h" #include "libc.h" +#include "atomic.h" static int sc_clock_gettime(clockid_t clk, struct timespec *ts) { @@ -10,7 +11,7 @@ static int sc_clock_gettime(clockid_t clk, struct timespec *ts) if (!r) return r; if (r == -ENOSYS) { if (clk == CLOCK_REALTIME) { - __syscall(SYS_gettimeofday, clk, ts, 0); + __syscall(SYS_gettimeofday, ts, 0); ts->tv_nsec = (int)ts->tv_nsec * 1000; return 0; } @@ -20,14 +21,21 @@ static int sc_clock_gettime(clockid_t clk, struct timespec *ts) return -1; } -weak_alias(sc_clock_gettime, __vdso_clock_gettime); - -int (*__cgt)(clockid_t, struct timespec *) = __vdso_clock_gettime; +void *__vdsosym(const char *, const char *); int __clock_gettime(clockid_t clk, struct timespec *ts) { - /* Conditional is to make this work prior to dynamic linking */ - return __cgt ? __cgt(clk, ts) : sc_clock_gettime(clk, ts); +#ifdef VDSO_CGT_SYM + static int (*volatile cgt)(clockid_t, struct timespec *); + if (!cgt) { + void *f = __vdsosym(VDSO_CGT_VER, VDSO_CGT_SYM); + if (!f) f = (void *)sc_clock_gettime; + a_cas_p(&cgt, 0, f); + } + return cgt(clk, ts); +#else + return sc_clock_gettime(clk, ts); +#endif } weak_alias(__clock_gettime, clock_gettime);