From a1ef046ad7730d36a223124b86f01920fb5ba381 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Fri, 17 Oct 2025 15:29:31 -0400 Subject: [PATCH] kernel/locks: Dump reader threads in "rwlock" command under RW_LOCK_DEBUG. This makes debugging rwlock deadlocks easier (under kernels with this option enabled, anyway, which it isn't by default.) --- src/system/kernel/locks/lock.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/system/kernel/locks/lock.cpp b/src/system/kernel/locks/lock.cpp index 9ec4466bef..968b6ed993 100644 --- a/src/system/kernel/locks/lock.cpp +++ b/src/system/kernel/locks/lock.cpp @@ -828,6 +828,22 @@ dump_rw_lock_info(int argc, char** argv) kprintf(" owner count: %#" B_PRIx32 "\n", lock->owner_count); kprintf(" flags: %#" B_PRIx32 "\n", lock->flags); +#if KDEBUG_RW_LOCK_DEBUG + kprintf(" reader threads:"); + if (lock->active_readers > 0) { + ThreadListIterator iterator; + while (Thread* thread = iterator.Next()) { + for (size_t i = 0; i < B_COUNT_OF(Thread::held_read_locks); i++) { + if (thread->held_read_locks[i] == lock) { + kprintf(" %" B_PRId32, thread->id); + break; + } + } + } + } + kprintf("\n"); +#endif + kprintf(" waiting threads:"); rw_lock_waiter* waiter = lock->waiters; while (waiter != NULL) {