1
Fork 0
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:
Ali Mohammad Pur 2021-09-28 12:32:46 +03:30
parent ca7bb812f6
commit b63ea3bad1

View file

@ -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.