From 28b873b9498aa7a512846680298e3f7b654836ab Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 15 May 2026 16:41:17 +0300 Subject: [PATCH] Kernel: Allow recursive rwlock write lock --- kernel/include/kernel/Lock/LockGuard.h | 2 +- kernel/include/kernel/Lock/RWLock.h | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/kernel/include/kernel/Lock/LockGuard.h b/kernel/include/kernel/Lock/LockGuard.h index e925d17e..ef122de2 100644 --- a/kernel/include/kernel/Lock/LockGuard.h +++ b/kernel/include/kernel/Lock/LockGuard.h @@ -7,7 +7,7 @@ namespace Kernel { - template + template requires requires(Lock& lock) { lock.lock(); lock.unlock(); } class LockGuard { BAN_NON_COPYABLE(LockGuard); diff --git a/kernel/include/kernel/Lock/RWLock.h b/kernel/include/kernel/Lock/RWLock.h index f0b61271..46ab8550 100644 --- a/kernel/include/kernel/Lock/RWLock.h +++ b/kernel/include/kernel/Lock/RWLock.h @@ -16,7 +16,7 @@ namespace Kernel void rd_lock() { LockGuard _(m_mutex); - while (m_writers_waiting > 0 || m_writer_active) + while (m_writers_waiting > 0 || m_writer != -1) m_thread_blocker.block_indefinite(&m_mutex); m_readers_active++; } @@ -30,19 +30,29 @@ namespace Kernel void wr_lock() { + if (m_writer == Thread::current_tid()) + { + m_writer_depth++; + return; + } + LockGuard _(m_mutex); + m_writers_waiting++; - while (m_readers_active > 0 || m_writer_active) + while (m_readers_active > 0 || m_writer != -1) m_thread_blocker.block_indefinite(&m_mutex); m_writers_waiting--; - m_writer_active = true; - } + m_writer = Thread::current_tid(); + m_writer_depth = 1; + } void wr_unlock() { + if (--m_writer_depth != 0) + return; LockGuard _(m_mutex); - m_writer_active = false; + m_writer = -1; m_thread_blocker.unblock(); } @@ -51,7 +61,8 @@ namespace Kernel ThreadBlocker m_thread_blocker; uint32_t m_readers_active { 0 }; uint32_t m_writers_waiting { 0 }; - bool m_writer_active { false }; + pid_t m_writer { -1 }; + uint32_t m_writer_depth { 0 }; }; class RWLockRDGuard