From 534b3e6a9a6ecc762d5f5c1190a673b7a3713ddd Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 9 Feb 2024 15:13:54 +0200 Subject: [PATCH] Kernel: Add LockFreeGuard to LockGuard.h --- kernel/include/kernel/LockGuard.h | 28 ++++++++++++++++++++++++ kernel/include/kernel/SpinLock.h | 4 ++++ kernel/kernel/Networking/UNIX/Socket.cpp | 22 ------------------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/kernel/include/kernel/LockGuard.h b/kernel/include/kernel/LockGuard.h index 015ba71ed..b5a5b5914 100644 --- a/kernel/include/kernel/LockGuard.h +++ b/kernel/include/kernel/LockGuard.h @@ -2,6 +2,8 @@ #include +#include + namespace Kernel { @@ -27,4 +29,30 @@ namespace Kernel Lock& m_lock; }; + template + class LockFreeGuard + { + BAN_NON_COPYABLE(LockFreeGuard); + BAN_NON_MOVABLE(LockFreeGuard); + + public: + LockFreeGuard(Lock& lock) + : m_lock(lock) + , m_depth(lock.lock_depth()) + { + for (uint32_t i = 0; i < m_depth; i++) + m_lock.unlock(); + } + + ~LockFreeGuard() + { + for (uint32_t i = 0; i < m_depth; i++) + m_lock.lock(); + } + + private: + Lock& m_lock; + const uint32_t m_depth; + }; + } diff --git a/kernel/include/kernel/SpinLock.h b/kernel/include/kernel/SpinLock.h index f9b32585d..4585d3f32 100644 --- a/kernel/include/kernel/SpinLock.h +++ b/kernel/include/kernel/SpinLock.h @@ -19,6 +19,8 @@ namespace Kernel void unlock(); bool is_locked() const; + uint32_t lock_depth() const { return m_locker != -1; } + private: BAN::Atomic m_locker = -1; }; @@ -34,6 +36,8 @@ namespace Kernel void unlock(); bool is_locked() const; + uint32_t lock_depth() const { return m_lock_depth; } + private: BAN::Atomic m_locker = -1; BAN::Atomic m_lock_depth = 0; diff --git a/kernel/kernel/Networking/UNIX/Socket.cpp b/kernel/kernel/Networking/UNIX/Socket.cpp index 0c5347111..5c52b4132 100644 --- a/kernel/kernel/Networking/UNIX/Socket.cpp +++ b/kernel/kernel/Networking/UNIX/Socket.cpp @@ -227,28 +227,6 @@ namespace Kernel } } - // This to feels too hacky to expose out of here - struct LockFreeGuard - { - LockFreeGuard(RecursivePrioritySpinLock& lock) - : m_lock(lock) - , m_depth(lock.lock_depth()) - { - for (uint32_t i = 0; i < m_depth; i++) - m_lock.unlock(); - } - - ~LockFreeGuard() - { - for (uint32_t i = 0; i < m_depth; i++) - m_lock.lock(); - } - - private: - RecursivePrioritySpinLock& m_lock; - const uint32_t m_depth; - }; - BAN::ErrorOr UnixDomainSocket::add_packet(BAN::ConstByteSpan packet) { LockGuard _(m_lock);