Kernel: Allow recursive rwlock write lock

This commit is contained in:
2026-05-15 16:41:17 +03:00
parent c352fb600f
commit 28b873b949
2 changed files with 18 additions and 7 deletions

View File

@@ -7,7 +7,7 @@
namespace Kernel namespace Kernel
{ {
template<typename Lock> template<typename Lock> requires requires(Lock& lock) { lock.lock(); lock.unlock(); }
class LockGuard class LockGuard
{ {
BAN_NON_COPYABLE(LockGuard); BAN_NON_COPYABLE(LockGuard);

View File

@@ -16,7 +16,7 @@ namespace Kernel
void rd_lock() void rd_lock()
{ {
LockGuard _(m_mutex); 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_thread_blocker.block_indefinite(&m_mutex);
m_readers_active++; m_readers_active++;
} }
@@ -30,19 +30,29 @@ namespace Kernel
void wr_lock() void wr_lock()
{ {
if (m_writer == Thread::current_tid())
{
m_writer_depth++;
return;
}
LockGuard _(m_mutex); LockGuard _(m_mutex);
m_writers_waiting++; 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_thread_blocker.block_indefinite(&m_mutex);
m_writers_waiting--; m_writers_waiting--;
m_writer_active = true;
}
m_writer = Thread::current_tid();
m_writer_depth = 1;
}
void wr_unlock() void wr_unlock()
{ {
if (--m_writer_depth != 0)
return;
LockGuard _(m_mutex); LockGuard _(m_mutex);
m_writer_active = false; m_writer = -1;
m_thread_blocker.unblock(); m_thread_blocker.unblock();
} }
@@ -51,7 +61,8 @@ namespace Kernel
ThreadBlocker m_thread_blocker; ThreadBlocker m_thread_blocker;
uint32_t m_readers_active { 0 }; uint32_t m_readers_active { 0 };
uint32_t m_writers_waiting { 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 class RWLockRDGuard