X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Ftime%2Fclock_gettime.c;h=799251d8a7c7cab612dc620fb0ceabd10797b4c2;hb=6e89210669dfc93302a181a80ed440132e41f0dd;hp=ce9f22090a8eff4be06e01b8769fce098a79a49e;hpb=805698401dbac7ce3079fa97eaad5ba0508377f4;p=oweals%2Fmusl.git 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 #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);