[PATCH][BZ #20973] Robust mutexes: Fix lost wake-up.
Florian Weimer
fweimer@redhat.com
Mon Dec 19 19:47:00 GMT 2016
On 12/16/2016 11:13 PM, Torvald Riegel wrote:
> On Fri, 2016-12-16 at 15:11 +0100, Florian Weimer wrote:
>> On 12/15/2016 11:29 PM, Torvald Riegel wrote:
>>> diff --git a/nptl/pthread_mutex_lock.c b/nptl/pthread_mutex_lock.c
>>> index bdfa529..01ac75e 100644
>>> --- a/nptl/pthread_mutex_lock.c
>>> +++ b/nptl/pthread_mutex_lock.c
>>> @@ -182,6 +182,11 @@ __pthread_mutex_lock_full (pthread_mutex_t *mutex)
>>> &mutex->__data.__list.__next);
>>>
>>> oldval = mutex->__data.__lock;
>>> + /* This is set to FUTEX_WAITERS iff we might have shared the
>>
>> âiffâ doesn't seem to be correct here because it's not an exact
>> equivalence, âifâ is sufficient.
>
> No, I think the iff is correct. We do only set it if we may have shared
> the flag.
Then please change it to âThis is set to FUTEX_WAITERS iff we have
sharedâ (i.e. drop the âmightâ). Based on the source code, I'm still
not sure if this is an exact equivalence.
The part which confuses me is the unconditional assignment
assume_other_futex_waiters = FUTEX_WAITERS further below. But I think
lll_robust_lock returns 0 if we did not share FUTEX_WAITERS, and the
code never retries with the assigned assume_other_futex_waiters value,
ensuring the equivalence. I think it would be clearer if you switched
from a do-while loop to a loop with an exit condition in the middle,
right after the call to lll_robust_lock.
Putting the FUTEX_WAITERS into the ID passed to lll_robust_lock is a
violation of its precondition documented in sysdeps/nptl/lowlevellock.h,
so please update the comment.
Thanks,
Florian
More information about the Libc-alpha
mailing list