Kernel: Allow recursive rwlock write lock
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
LockGuard _(m_mutex);
|
if (m_writer == Thread::current_tid())
|
||||||
m_writers_waiting++;
|
{
|
||||||
while (m_readers_active > 0 || m_writer_active)
|
m_writer_depth++;
|
||||||
m_thread_blocker.block_indefinite(&m_mutex);
|
return;
|
||||||
m_writers_waiting--;
|
|
||||||
m_writer_active = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LockGuard _(m_mutex);
|
||||||
|
|
||||||
|
m_writers_waiting++;
|
||||||
|
while (m_readers_active > 0 || m_writer != -1)
|
||||||
|
m_thread_blocker.block_indefinite(&m_mutex);
|
||||||
|
m_writers_waiting--;
|
||||||
|
|
||||||
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user