[PATCH]: Fix blocking pthread_join.
Stefan Liebler
stli@linux.vnet.ibm.com
Fri May 4 08:07:00 GMT 2018
On 05/02/2018 06:27 AM, Carlos O'Donell wrote:
> On 04/30/2018 11:19 AM, Stefan Liebler wrote:
>> diff --git a/sysdeps/nptl/lowlevellock.h b/sysdeps/nptl/lowlevellock.h
>> index 8326e2805c..bfbda99940 100644
>> --- a/sysdeps/nptl/lowlevellock.h
>> +++ b/sysdeps/nptl/lowlevellock.h
>> @@ -181,11 +181,14 @@ extern int __lll_timedlock_wait (int *futex, const struct timespec *,
>> thread ID while the clone is running and is reset to zero by the kernel
>> afterwards. The kernel up to version 3.16.3 does not use the private futex
>> operations for futex wake-up when the clone terminates. */
>> -#define lll_wait_tid(tid) \
>> - do { \
>> - __typeof (tid) __tid; \
>> - while ((__tid = (tid)) != 0) \
>> - lll_futex_wait (&(tid), __tid, LLL_SHARED);\
>> +#define lll_wait_tid(tid) \
>> + do { \
>> + __typeof (tid) __tid; \
>> + /* We need acquire MO here so that we synchronize \
>> + with the kernel's store to 0 when the clone \
>> + terminates. (see above) */ \
>> + while ((__tid = atomic_load_acquire (&(tid))) != 0) \
>> + lll_futex_wait (&(tid), __tid, LLL_SHARED); \
>> } while (0)
>>
>> extern int __lll_timedwait_tid (int *, const struct timespec *)
>
> This looks good to me, and improves the situation.
>
> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
>
I've just committed this part and opened the
"Bug 23137 - s390: pthread_join sometimes block indefinitely (on 31bit
and libc build with -Os)"
(https://sourceware.org/bugzilla/show_bug.cgi?id=23137)
> I haven't had a chance to review the other P&C issues discussed by Torvald,
> but we should probably raise them in a new thread related to tid reloading
> and the consequences.
>
More information about the Libc-alpha
mailing list