diff options
Diffstat (limited to 'src/time')
-rw-r--r-- | src/time/clock_gettime.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/time/clock_gettime.c b/src/time/clock_gettime.c index ce9f2209..799251d8 100644 --- a/src/time/clock_gettime.c +++ b/src/time/clock_gettime.c @@ -3,6 +3,7 @@ #include <stdint.h> #include "syscall.h" #include "libc.h" +#include "atomic.h" static int sc_clock_gettime(clockid_t clk, struct timespec *ts) { @@ -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 (*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); |