kernel/lock: Adjust KDEBUG_RW_LOCK_DEBUG logic in _rw_lock_read_unlock.

We need to always decrement the count by 1 even if we own the lock.
Seems to fix some intermittent hangs with KDEBUG_RW_LOCK_DEBUG.
This commit is contained in:
Augustin Cavalier
2024-09-10 17:24:57 -04:00
parent 1705e9761a
commit dd45194d37
+9 -5
View File
@@ -669,22 +669,26 @@ _rw_lock_read_lock_with_timeout(rw_lock* lock, uint32 timeoutFlags,
void
_rw_lock_read_unlock(rw_lock* lock)
{
#if KDEBUG_RW_LOCK_DEBUG
int32 oldCount = atomic_add(&lock->count, -1);
if (oldCount < RW_LOCK_WRITER_COUNT_BASE) {
_rw_lock_unset_read_locked(lock);
return;
}
#endif
InterruptsSpinLocker locker(lock->lock);
// If we're still holding the write lock or if there are other readers,
// no-one can be woken up.
if (lock->holder == thread_get_current_thread_id()) {
ASSERT(lock->owner_count % RW_LOCK_WRITER_COUNT_BASE > 0);
ASSERT((lock->owner_count % RW_LOCK_WRITER_COUNT_BASE) > 0);
lock->owner_count--;
return;
}
#if KDEBUG_RW_LOCK_DEBUG
_rw_lock_unset_read_locked(lock);
int32 oldCount = atomic_add(&lock->count, -1);
if (oldCount < RW_LOCK_WRITER_COUNT_BASE)
return;
#endif
if (--lock->active_readers > 0)