summaryrefslogtreecommitdiff
path: root/src/time
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-08-07 15:48:16 -0400
committerRich Felker <dalias@aerifal.cx>2011-08-07 15:48:16 -0400
commitcdfb725ca3e20e14c64ca8695496e430b89b3b2c (patch)
tree180bf3dc28f20bd7b9d50495a745eb7b11af6ea3 /src/time
parentb3c08a16c0a085e8de01cdc9de106aaa332d27d5 (diff)
downloadmusl-cdfb725ca3e20e14c64ca8695496e430b89b3b2c.tar.gz
use weak aliase rather than weak reference for vdso clock_gettime
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.
Diffstat (limited to 'src/time')
-rw-r--r--src/time/clock_gettime.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/time/clock_gettime.c b/src/time/clock_gettime.c
index 9fef54a4..ad5c09de 100644
--- a/src/time/clock_gettime.c
+++ b/src/time/clock_gettime.c
@@ -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);