Преглед изворни кода

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.
Ali Mohammad Pur пре 3 година
родитељ
комит
b63ea3bad1
1 измењених фајлова са 2 додато и 2 уклоњено
  1. 2 2
      Userland/Libraries/LibPthread/pthread.cpp

+ 2 - 2
Userland/Libraries/LibPthread/pthread.cpp

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