mirror of https://git.musl-libc.org/git/musl
Browse Source
these changes also make it so clock_gettime(CLOCK_REALTIME, &ts) works even on pre-2.6 kernels, emulated via the gettimeofday syscall. there is no cost for the fallback check, as it falls under the error case that already must be checked for storing the error code in errno, but which would normally be hidden inside __syscall_ret.rs-1.0
3 changed files with 35 additions and 7 deletions
@ -1,7 +1,28 @@ |
|||
#include <time.h> |
|||
#include <errno.h> |
|||
#include <stdint.h> |
|||
#include "syscall.h" |
|||
#include "libc.h" |
|||
|
|||
int clock_gettime(clockid_t clk, struct timespec *ts) |
|||
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) |
|||
{ |
|||
return syscall(SYS_clock_gettime, clk, ts); |
|||
int r; |
|||
if (cgt) return cgt(clk, ts); |
|||
r = __syscall(SYS_clock_gettime, clk, ts); |
|||
if (!r) return r; |
|||
if (r == -ENOSYS) { |
|||
if (clk == CLOCK_REALTIME) { |
|||
__syscall(SYS_gettimeofday, clk, ts, 0); |
|||
ts->tv_nsec = (int)ts->tv_nsec * 1000; |
|||
return 0; |
|||
} |
|||
r = -EINVAL; |
|||
} |
|||
errno = -r; |
|||
return -1; |
|||
} |
|||
|
|||
weak_alias(__clock_gettime, clock_gettime); |
|||
|
|||
@ -1,8 +1,13 @@ |
|||
#include <time.h> |
|||
#include <sys/time.h> |
|||
#include "syscall.h" |
|||
|
|||
int gettimeofday(struct timeval *tv, void *tz) |
|||
{ |
|||
__syscall(SYS_gettimeofday, tv, 0); |
|||
struct timespec ts; |
|||
if (!tv) return 0; |
|||
clock_gettime(CLOCK_REALTIME, &ts); |
|||
tv->tv_sec = ts.tv_sec; |
|||
tv->tv_usec = (int)ts.tv_nsec / 1000; |
|||
return 0; |
|||
} |
|||
|
|||
Loading…
Reference in new issue