]> granicus.if.org Git - musl/commitdiff
use weak aliase rather than weak reference for vdso clock_gettime
authorRich Felker <dalias@aerifal.cx>
Sun, 7 Aug 2011 19:48:16 +0000 (15:48 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 7 Aug 2011 19:48:16 +0000 (15:48 -0400)
this works around pcc's lack of working support for weak references,
and in principle is nice because it gets us back to the stage where
the only weak symbol feature we use is weak aliases, nothing else.

having fewer dependencies on fancy linker features is a good thing.

src/time/clock_gettime.c

index 9fef54a497b980e1ea121b584e1ed0c6fe83e044..ad5c09de9e79bcb684eac6ee08f253326584d9dc 100644 (file)
@@ -4,17 +4,11 @@
 #include "syscall.h"
 #include "libc.h"
 
-int __vdso_clock_gettime(clockid_t, struct timespec *) __attribute__((weak));
-static int (*cgt)(clockid_t, struct timespec *) = __vdso_clock_gettime;
-
-int __clock_gettime(clockid_t clk, struct timespec *ts)
+static int sc_clock_gettime(clockid_t clk, struct timespec *ts)
 {
-       int r;
-       if (cgt) return cgt(clk, ts);
-       r = __syscall(SYS_clock_gettime, clk, ts);
+       int r = __syscall(SYS_clock_gettime, clk, ts);
        if (!r) return r;
        if (r == -ENOSYS) {
-               cgt = 0;
                if (clk == CLOCK_REALTIME) {
                        __syscall(SYS_gettimeofday, clk, ts, 0);
                        ts->tv_nsec = (int)ts->tv_nsec * 1000;
@@ -26,4 +20,14 @@ int __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;
+
+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);
+}
+
 weak_alias(__clock_gettime, clock_gettime);