[4/4] nptl: Add default cancellable futex calls
Commit Message
This patch adds default cancellable futex calls used in cancellation
entrypoints in NPTL code.
--
* sysdeps/unix/sysv/linux/lowlevellock-futex.h
(lll_futex_wait_cancel): New define: cancellable wait futex call.
(lll_futex_timed_wait_cancel): New define: cancellable timed wait
futex call.
(lll_futex_timed_wait_bitset_cancel): New define: cancellable timed
wait bitsel futex call.
(lll_futex_wait_requeue_pi_cancel): New define: cancellable wait
requeue PI futex call.
(lll_futex_timed_wait_requeue_pi_cancel): New define: cancellable
timed wait requeue PI futex call.
---
Comments
On Fri, 19 Sep 2014, Adhemerval Zanella wrote:
> diff --git a/sysdeps/unix/sysv/linux/lowlevellock-futex.h b/sysdeps/unix/sysv/linux/lowlevellock-futex.h
> index 343afd6..2967ebb 100644
> --- a/sysdeps/unix/sysv/linux/lowlevellock-futex.h
> +++ b/sysdeps/unix/sysv/linux/lowlevellock-futex.h
> @@ -97,6 +97,49 @@
> val, timeout, NULL /* Unused. */, \
> FUTEX_BITSET_MATCH_ANY)
>
> +#define lll_futex_wait_cancel(futexp, val, private) \
> + lll_futex_timed_wait_cancel (futexp, val, NULL, private)
> +
> +#define lll_futex_timed_wait_cancel(futexp, val, timespec, private) \
> + ({ \
> + long int __ret; \
> + int __op = FUTEX_WAIT; \
> + \
> + __ret = __syscall_cancel (__NR_futex, (long int) (futexp), \
> + (long int)__lll_private_flag (__op, private), \
> + (long int)(val), (long int)(timespec), 0, 0); \
As with other patches, do not hardcode the use of "long" for syscall
arguments.
Hi Joseph, thanks for the review.
On 19-09-2014 14:02, Joseph S. Myers wrote:
> On Fri, 19 Sep 2014, Adhemerval Zanella wrote:
>
>> diff --git a/sysdeps/unix/sysv/linux/lowlevellock-futex.h b/sysdeps/unix/sysv/linux/lowlevellock-futex.h
>> index 343afd6..2967ebb 100644
>> --- a/sysdeps/unix/sysv/linux/lowlevellock-futex.h
>> +++ b/sysdeps/unix/sysv/linux/lowlevellock-futex.h
>> @@ -97,6 +97,49 @@
>> val, timeout, NULL /* Unused. */, \
>> FUTEX_BITSET_MATCH_ANY)
>>
>> +#define lll_futex_wait_cancel(futexp, val, private) \
>> + lll_futex_timed_wait_cancel (futexp, val, NULL, private)
>> +
>> +#define lll_futex_timed_wait_cancel(futexp, val, timespec, private) \
>> + ({ \
>> + long int __ret; \
>> + int __op = FUTEX_WAIT; \
>> + \
>> + __ret = __syscall_cancel (__NR_futex, (long int) (futexp), \
>> + (long int)__lll_private_flag (__op, private), \
>> + (long int)(val), (long int)(timespec), 0, 0); \
> As with other patches, do not hardcode the use of "long" for syscall
> arguments.
Right, I will adjust it.
>
@@ -97,6 +97,49 @@
val, timeout, NULL /* Unused. */, \
FUTEX_BITSET_MATCH_ANY)
+#define lll_futex_wait_cancel(futexp, val, private) \
+ lll_futex_timed_wait_cancel (futexp, val, NULL, private)
+
+#define lll_futex_timed_wait_cancel(futexp, val, timespec, private) \
+ ({ \
+ long int __ret; \
+ int __op = FUTEX_WAIT; \
+ \
+ __ret = __syscall_cancel (__NR_futex, (long int) (futexp), \
+ (long int)__lll_private_flag (__op, private), \
+ (long int)(val), (long int)(timespec), 0, 0); \
+ __ret; \
+ })
+
+#define lll_futex_timed_wait_bitset_cancel(futexp, val, timespec, clockbit, \
+ private) \
+ ({ \
+ long int __ret; \
+ int __op = FUTEX_WAIT_BITSET | clockbit; \
+ \
+ __ret = __syscall_cancel (__NR_futex, (long int) (futexp), \
+ (long int)__lll_private_flag (__op, private), \
+ (long int)(val), (long int)(timespec), 0, \
+ FUTEX_BITSET_MATCH_ANY); \
+ __ret; \
+ })
+
+#define lll_futex_wait_requeue_pi_cancel(futexp, val, mutex, private) \
+ lll_futex_timed_wait_requeue_pi_cancel (futexp, val, NULL, 0, mutex, private)
+
+#define lll_futex_timed_wait_requeue_pi_cancel(futexp, val, timespec, \
+ clockbit, mutex, private) \
+ ({ \
+ long int __ret; \
+ int __op = FUTEX_WAIT_REQUEUE_PI | clockbit; \
+ \
+ __ret = __syscall_cancel (__NR_futex, (long int) (futexp), \
+ (long int) __lll_private_flag (__op, private), \
+ (long int )(val), (long int) (timespec), \
+ (long int ) mutex, 0); \
+ __ret; \
+ })
+
#define lll_futex_wake(futexp, nr, private) \
lll_futex_syscall (4, futexp, \
__lll_private_flag (FUTEX_WAKE, private), nr, 0)