1
0

clock_gettime.c 876 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #include <time.h>
  2. #include <errno.h>
  3. #include <stdint.h>
  4. #include "syscall.h"
  5. #include "libc.h"
  6. #include "atomic.h"
  7. static int sc_clock_gettime(clockid_t clk, struct timespec *ts)
  8. {
  9. int r = __syscall(SYS_clock_gettime, clk, ts);
  10. if (!r) return r;
  11. if (r == -ENOSYS) {
  12. if (clk == CLOCK_REALTIME) {
  13. __syscall(SYS_gettimeofday, ts, 0);
  14. ts->tv_nsec = (int)ts->tv_nsec * 1000;
  15. return 0;
  16. }
  17. r = -EINVAL;
  18. }
  19. errno = -r;
  20. return -1;
  21. }
  22. void *__vdsosym(const char *, const char *);
  23. int __clock_gettime(clockid_t clk, struct timespec *ts)
  24. {
  25. #ifdef VDSO_CGT_SYM
  26. static int (*volatile cgt)(clockid_t, struct timespec *);
  27. if (!cgt) {
  28. void *f = __vdsosym(VDSO_CGT_VER, VDSO_CGT_SYM);
  29. if (!f) f = (void *)sc_clock_gettime;
  30. a_cas_p(&cgt, 0, f);
  31. }
  32. return cgt(clk, ts);
  33. #else
  34. return sc_clock_gettime(clk, ts);
  35. #endif
  36. }
  37. weak_alias(__clock_gettime, clock_gettime);