refactor thrd_sleep and nanosleep in terms of clock_nanosleep
authorRich Felker <dalias@aerifal.cx>
Sun, 21 Jul 2019 05:53:14 +0000 (01:53 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 27 Jul 2019 06:46:57 +0000 (02:46 -0400)
for namespace-safety with thrd_sleep, this requires an alias, which is
also added. this eliminates all but one direct call point for
nanosleep syscalls, and arranges that 64-bit time_t conversion logic
will only need to exist in one file rather than three.

as a bonus, clock_nanosleep with CLOCK_REALTIME and empty flags is now
implemented as SYS_nanosleep, thereby working on older kernels that
may lack POSIX clocks functionality.

src/include/time.h
src/thread/thrd_sleep.c
src/time/clock_nanosleep.c
src/time/nanosleep.c

index 24c87973a38a3c990f70903ffaa03d50ef22ff7c..cbabde476790e755cb85210b0194c320256ed027 100644 (file)
@@ -4,6 +4,7 @@
 #include "../../include/time.h"
 
 hidden int __clock_gettime(clockid_t, struct timespec *);
+hidden int __clock_nanosleep(clockid_t, int, const struct timespec *, struct timespec *);
 
 hidden char *__asctime_r(const struct tm *, char *);
 hidden struct tm *__gmtime_r(const time_t *restrict, struct tm *restrict);
index e8dfe400cb701f7ae470b192ec04c495a7bfbb18..97de53455ede450885fcd6bdd6bb6de09b97071a 100644 (file)
@@ -1,10 +1,11 @@
 #include <threads.h>
+#include <time.h>
 #include <errno.h>
 #include "syscall.h"
 
 int thrd_sleep(const struct timespec *req, struct timespec *rem)
 {
-       int ret = __syscall(SYS_nanosleep, req, rem);
+       int ret = -__clock_nanosleep(CLOCK_REALTIME, 0, req, rem);
        switch (ret) {
        case 0:      return 0;
        case -EINTR: return -1; /* value specified by C11 */
index 32f0c07e3dbe19ac99a216463f2fd5d774831457..1174f510f165409618b11182a8da2f0e6d611298 100644 (file)
@@ -2,8 +2,12 @@
 #include <errno.h>
 #include "syscall.h"
 
-int clock_nanosleep(clockid_t clk, int flags, const struct timespec *req, struct timespec *rem)
+int __clock_nanosleep(clockid_t clk, int flags, const struct timespec *req, struct timespec *rem)
 {
-       int r = -__syscall_cp(SYS_clock_nanosleep, clk, flags, req, rem);
-       return clk == CLOCK_THREAD_CPUTIME_ID ? EINVAL : r;
+       if (clk == CLOCK_THREAD_CPUTIME_ID) return EINVAL;
+       if (clk == CLOCK_REALTIME && !flags)
+               return -__syscall_cp(SYS_nanosleep, req, rem);
+       return -__syscall_cp(SYS_clock_nanosleep, clk, flags, req, rem);
 }
+
+weak_alias(__clock_nanosleep, clock_nanosleep);
index 1e6f39224a0324729d3ea837f1324d4a4a323534..bc9f7895fa0878be08bdfc01634eede6cbcf81b1 100644 (file)
@@ -3,5 +3,5 @@
 
 int nanosleep(const struct timespec *req, struct timespec *rem)
 {
-       return syscall_cp(SYS_nanosleep, req, rem);
+       return __syscall_ret(-__clock_nanosleep(CLOCK_REALTIME, 0, req, rem));
 }