mirror of
https://github.com/RGBCube/serenity
synced 2025-06-01 06:28:13 +00:00
LibPthread: Calculate the correct lock value in RWLock {rd,un}lock
The previous version was putting the old count in the control bits, which is all kinds of wrong.
This commit is contained in:
parent
ca7bb812f6
commit
b63ea3bad1
1 changed files with 2 additions and 2 deletions
|
@ -618,7 +618,7 @@ static int rwlock_rdlock_maybe_timed(u32* lockp, const struct timespec* timeout
|
|||
auto count = (u16)current;
|
||||
if (!(current & writer_intent_mask) || count > 1) {
|
||||
++count;
|
||||
auto desired = (current << 16) | count;
|
||||
auto desired = (current & 0xffff0000u) | count;
|
||||
auto did_exchange = AK::atomic_compare_exchange_strong(lockp, current, desired, AK::MemoryOrder::memory_order_acquire);
|
||||
if (!did_exchange)
|
||||
continue; // tough luck, try again.
|
||||
|
@ -779,7 +779,7 @@ int pthread_rwlock_unlock(pthread_rwlock_t* lockval_p)
|
|||
return EINVAL;
|
||||
}
|
||||
--count;
|
||||
auto desired = (current << 16) | count;
|
||||
auto desired = (current & 0xffff0000u) | count;
|
||||
auto did_exchange = AK::atomic_compare_exchange_strong(lockp, current, desired, AK::MemoryOrder::memory_order_release);
|
||||
if (!did_exchange)
|
||||
continue; // tough luck, try again.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue