1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #ifndef _DL_VDSO_CALLS_H
- #define _DL_VDSO_CALLS_H
- #include <sys/time.h>
- #include <sys/syscall.h>
- #include <errno.h>
- #include <time.h>
- void __attribute__((weak)) *_get__dl__vdso_clock_gettime(void);
- #if defined(__UCLIBC_USE_TIME64__)
- #include "internal/time64_helpers.h"
- void __attribute__((weak)) *_get__dl__vdso_clock_gettime64(void);
- typedef int (*clock_gettime_func)(clockid_t clock_id, struct __ts64_struct *tp);
- #else
- typedef int (*clock_gettime_func)(clockid_t clock_id, struct timespec *tp);
- #endif
- extern int __libc_clock_gettime(clockid_t clock_id, struct timespec *tp);
- static int __attribute__ ((used)) __generic_vdso_clock_gettime(clockid_t clock_id, struct timespec *tp);
- static int __attribute__ ((used)) __generic_vdso_clock_gettime(clockid_t clock_id, struct timespec *tp)
- {
- void *impl = NULL;
- #if defined(__UCLIBC_USE_TIME64__)
- if (&_get__dl__vdso_clock_gettime64 && (impl = _get__dl__vdso_clock_gettime64())) {
- struct __ts64_struct __ts64;
- int __ret = ((clock_gettime_func)impl)(clock_id, &__ts64);
- if (__ret != 0) {
- __set_errno(-__ret);
- return -1;
- }
- if (tp) {
- tp->tv_sec = __ts64.tv_sec;
- tp->tv_nsec = __ts64.tv_nsec;
- }
- return 0;
- }
- /* fallback to syscall */
- return __libc_clock_gettime(clock_id, tp);
- #else
- if (&_get__dl__vdso_clock_gettime && (impl = _get__dl__vdso_clock_gettime())) {
- int __ret = ((clock_gettime_func)impl)(clock_id, tp);
- if (__ret != 0) {
- __set_errno(-__ret);
- return -1;
- }
- return 0;
- }
- /* fallback to syscall */
- return __libc_clock_gettime(clock_id, tp);
- #endif
- }
- static int __attribute__ ((used)) __generic_vdso_gettimeofday(struct timeval *tv, __timezone_ptr_t tz)
- {
- struct timespec ts;
- int __res = __generic_vdso_clock_gettime(CLOCK_REALTIME, &ts);
- tv->tv_sec = ts.tv_sec;
- tv->tv_usec = (suseconds_t)ts.tv_nsec / 1000;
- return __res;
- }
- #endif /* _DL_VDSO_CALLS_H */
|