diff options
Diffstat (limited to 'librt/clock_nanosleep.c')
| -rw-r--r-- | librt/clock_nanosleep.c | 35 | 
1 files changed, 30 insertions, 5 deletions
diff --git a/librt/clock_nanosleep.c b/librt/clock_nanosleep.c index 1515cf5b0..5537b0609 100644 --- a/librt/clock_nanosleep.c +++ b/librt/clock_nanosleep.c @@ -21,6 +21,9 @@  #include "kernel-posix-cpu-timers.h" +#if defined(__UCLIBC_USE_TIME64__) +#include "internal/time64_helpers.h" +#endif  /* We can simply use the syscall.  The CPU clocks are not supported     with this function.  */ @@ -36,18 +39,40 @@ clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,    if (clock_id == CLOCK_PROCESS_CPUTIME_ID)      clock_id = MAKE_PROCESS_CPUCLOCK (0, CPUCLOCK_SCHED); -#if defined(SINGLE_THREAD_P) -    r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req, rem); +  if (SINGLE_THREAD_P) { +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_clock_nanosleep_time64) +    struct __ts64_struct __req, __rem; +    __req.tv_sec = req->tv_sec; +    __req.tv_nsec = req->tv_nsec; +    r = INTERNAL_SYSCALL (clock_nanosleep_time64, err, 4, clock_id, flags, &__req, &__rem); +    if (rem) { +      rem->tv_sec = (time_t) __rem.tv_sec; +      rem->tv_nsec = __rem.tv_nsec; +    }  #else +    r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req, rem); +#endif +  } +  else      { +#ifdef __NEW_THREADS        int oldstate = LIBC_CANCEL_ASYNC (); - +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_clock_nanosleep_time64) +      struct __ts64_struct __req, __rem; +      __req.tv_sec = req->tv_sec; +      __req.tv_nsec = req->tv_nsec; +      r = INTERNAL_SYSCALL (clock_nanosleep_time64, err, 4, clock_id, flags, &__req, &__rem); +      if (rem) { +        rem->tv_sec = (time_t) __rem.tv_sec; +        rem->tv_nsec = __rem.tv_nsec; +      } +#else        r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req,  			    rem); - +#endif        LIBC_CANCEL_RESET (oldstate); -    }  #endif +    }    return (INTERNAL_SYSCALL_ERROR_P (r, err)  	  ? INTERNAL_SYSCALL_ERRNO (r, err) : 0);  | 
