Hi Adhemerval, > The only different is how to issue the syscall. > > Checked on x86_64-linux-gnu and i686-linux-gnu. > --- > sysdeps/nptl/futex-internal.c | 111 > +++++++++++----------------------- 1 file changed, 35 insertions(+), > 76 deletions(-) > > diff --git a/sysdeps/nptl/futex-internal.c > b/sysdeps/nptl/futex-internal.c index e4a14b477c..f9a2e28ee6 100644 > --- a/sysdeps/nptl/futex-internal.c > +++ b/sysdeps/nptl/futex-internal.c > @@ -24,10 +24,10 @@ > > #ifndef __ASSUME_TIME64_SYSCALLS > static int > -__futex_abstimed_wait_cancelable32 (unsigned int* futex_word, > - unsigned int expected, int op, > - const struct __timespec64* > abstime, > - int private) > +__futex_abstimed_wait_common32 (unsigned int* futex_word, > + unsigned int expected, int op, > + const struct __timespec64* abstime, > + int private, bool cancel) > { > struct timespec ts32, *pts32 = NULL; > if (abstime != NULL) > @@ -39,34 +39,16 @@ __futex_abstimed_wait_cancelable32 (unsigned int* > futex_word, pts32 = &ts32; > } > > - return INTERNAL_SYSCALL_CANCEL (futex, futex_word, op, expected, > + if (cancel) > + return INTERNAL_SYSCALL_CANCEL (futex, futex_word, op, expected, > + pts32, NULL /* Unused. */, > + FUTEX_BITSET_MATCH_ANY); > + else > + return INTERNAL_SYSCALL_CALL (futex, futex_word, op, expected, > pts32, NULL /* Unused. */, > FUTEX_BITSET_MATCH_ANY); > } > > -static int > -__futex_abstimed_wait32 (unsigned int* futex_word, > - unsigned int expected, clockid_t clockid, > - const struct __timespec64* abstime, > - int private) > -{ > - struct timespec ts32; > - > - if (abstime != NULL && ! in_time_t_range (abstime->tv_sec)) > - return -EOVERFLOW; > - > - unsigned int clockbit = (clockid == CLOCK_REALTIME) ? > - FUTEX_CLOCK_REALTIME : 0; > - int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit, > private); - > - if (abstime != NULL) > - ts32 = valid_timespec64_to_timespec (*abstime); > - > - return INTERNAL_SYSCALL_CALL (futex, futex_word, op, expected, > - abstime != NULL ? &ts32 : NULL, > - NULL /* Unused. */, > FUTEX_BITSET_MATCH_ANY); -} > - > static int > __futex_clock_wait_bitset32 (int *futexp, int val, clockid_t clockid, > const struct __timespec64 *abstime, int > private) @@ -89,11 +71,11 @@ __futex_clock_wait_bitset32 (int > *futexp, int val, clockid_t clockid, } > #endif /* ! __ASSUME_TIME64_SYSCALLS */ > > -int > -__futex_abstimed_wait_cancelable64 (unsigned int* futex_word, > - unsigned int expected, clockid_t > clockid, > - const struct __timespec64* > abstime, > - int private) > +static int > +__futex_abstimed_wait_common64 (unsigned int* futex_word, > + unsigned int expected, clockid_t > clockid, > + const struct __timespec64* abstime, > + int private, bool cancel) > { > unsigned int clockbit; > int err; > @@ -109,13 +91,18 @@ __futex_abstimed_wait_cancelable64 (unsigned > int* futex_word, clockbit = (clockid == CLOCK_REALTIME) ? > FUTEX_CLOCK_REALTIME : 0; int op = __lll_private_flag > (FUTEX_WAIT_BITSET | clockbit, private); > - err = INTERNAL_SYSCALL_CANCEL (futex_time64, futex_word, op, > expected, > - abstime, NULL /* Unused. */, > + if (cancel) > + err = INTERNAL_SYSCALL_CANCEL (futex_time64, futex_word, op, > expected, > + abstime, NULL /* Unused. */, > + FUTEX_BITSET_MATCH_ANY); > + else > + err = INTERNAL_SYSCALL_CALL (futex_time64, futex_word, op, > expected, > + abstime, NULL /* Ununsed. */, > FUTEX_BITSET_MATCH_ANY); > #ifndef __ASSUME_TIME64_SYSCALLS > if (err == -ENOSYS) > - err = __futex_abstimed_wait_cancelable32 (futex_word, expected, > - op, abstime, private); > + err = __futex_abstimed_wait_common32 (futex_word, expected, op, > abstime, > + private, cancel); > #endif > > switch (err) > @@ -145,46 +132,18 @@ __futex_abstimed_wait64 (unsigned int* > futex_word, unsigned int expected, clockid_t clockid, > const struct __timespec64* abstime, int > private) { > - unsigned int clockbit; > - int err; > - > - /* Work around the fact that the kernel rejects negative timeout > values > - despite them being valid. */ > - if (__glibc_unlikely ((abstime != NULL) && (abstime->tv_sec < 0))) > - return ETIMEDOUT; > - > - if (! lll_futex_supported_clockid (clockid)) > - return EINVAL; > - > - clockbit = (clockid == CLOCK_REALTIME) ? FUTEX_CLOCK_REALTIME : 0; > - int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit, > private); - > - err = INTERNAL_SYSCALL_CALL (futex_time64, futex_word, op, > expected, > - abstime, NULL /* Unused. */, > - FUTEX_BITSET_MATCH_ANY); > -#ifndef __ASSUME_TIME64_SYSCALLS > - if (err == -ENOSYS) > - err = __futex_abstimed_wait32 (futex_word, expected, > - clockid, abstime, private); > -#endif > - switch (err) > - { > - case 0: > - case -EAGAIN: > - case -EINTR: > - case -ETIMEDOUT: > - return -err; > + return __futex_abstimed_wait_common64 (futex_word, expected, > clockid, > + abstime, private, false); > +} > > - case -EFAULT: /* Must have been caused by a glibc or application > bug. */ > - case -EINVAL: /* Either due to wrong alignment, unsupported > - clockid or due to the timeout not being > - normalized. Must have been caused by a glibc or > - application bug. */ > - case -ENOSYS: /* Must have been caused by a glibc bug. */ > - /* No other errors are documented at this time. */ > - default: > - futex_fatal_error (); > - } > +int > +__futex_abstimed_wait_cancelable64 (unsigned int* futex_word, > + unsigned int expected, clockid_t > clockid, > + const struct __timespec64* > abstime, > + int private) > +{ > + return __futex_abstimed_wait_common64 (futex_word, expected, > clockid, > + abstime, private, true); > } > > int Thanks for making this consolidation. Indeed there is now only difference in issuing the syscall. Reviewed-by: Lukasz Majewski Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de