1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 07:37:46 +00:00

Kernel: Tidy up SpinLock and related classes a little bit

This commit is contained in:
Andreas Kling 2020-07-06 11:36:07 +02:00
parent 163c9d5f8f
commit e83c36d053

View file

@ -26,24 +26,20 @@
#pragma once #pragma once
#include <AK/Types.h>
#include <AK/Atomic.h> #include <AK/Atomic.h>
#include <Kernel/Forward.h> #include <AK/Types.h>
#include <Kernel/Arch/i386/CPU.h> #include <Kernel/Arch/i386/CPU.h>
#include <Kernel/Forward.h>
namespace Kernel { namespace Kernel {
template <typename BaseType = u32> template<typename BaseType = u32>
class SpinLock class SpinLock {
{ AK_MAKE_NONCOPYABLE(SpinLock);
AK::Atomic<BaseType> m_lock{0}; AK_MAKE_NONMOVABLE(SpinLock);
public: public:
SpinLock() = default; SpinLock() = default;
SpinLock(const SpinLock&) = delete;
SpinLock(SpinLock&&) = delete;
SpinLock& operator=(const SpinLock&) = delete;
SpinLock& operator=(SpinLock&&) = delete;
ALWAYS_INLINE u32 lock() ALWAYS_INLINE u32 lock()
{ {
@ -54,7 +50,6 @@ public:
expected = 0; expected = 0;
} while (!m_lock.compare_exchange_strong(expected, 1, AK::memory_order_acq_rel)); } while (!m_lock.compare_exchange_strong(expected, 1, AK::memory_order_acq_rel));
return prev_flags; return prev_flags;
} }
ALWAYS_INLINE void unlock(u32 prev_flags) ALWAYS_INLINE void unlock(u32 prev_flags)
@ -73,19 +68,17 @@ public:
{ {
m_lock.store(0, AK::memory_order_release); m_lock.store(0, AK::memory_order_release);
} }
private:
AK::Atomic<BaseType> m_lock { 0 };
}; };
class RecursiveSpinLock class RecursiveSpinLock {
{ AK_MAKE_NONCOPYABLE(RecursiveSpinLock);
AK::Atomic<FlatPtr> m_lock{0}; AK_MAKE_NONMOVABLE(RecursiveSpinLock);
u32 m_recursions{0};
public: public:
RecursiveSpinLock() = default; RecursiveSpinLock() = default;
RecursiveSpinLock(const RecursiveSpinLock&) = delete;
RecursiveSpinLock(RecursiveSpinLock&&) = delete;
RecursiveSpinLock& operator=(const RecursiveSpinLock&) = delete;
RecursiveSpinLock& operator=(RecursiveSpinLock&&) = delete;
ALWAYS_INLINE u32 lock() ALWAYS_INLINE u32 lock()
{ {
@ -121,33 +114,32 @@ public:
{ {
m_lock.store(0, AK::memory_order_release); m_lock.store(0, AK::memory_order_release);
} }
private:
AK::Atomic<FlatPtr> m_lock { 0 };
u32 m_recursions { 0 };
}; };
template <typename BaseType = u32, typename LockType = SpinLock<BaseType>> template<typename BaseType = u32, typename LockType = SpinLock<BaseType>>
class ScopedSpinLock class ScopedSpinLock {
{ AK_MAKE_NONCOPYABLE(ScopedSpinLock);
LockType* m_lock;
u32 m_prev_flags{0};
bool m_have_lock{false};
public: public:
ScopedSpinLock() = delete; ScopedSpinLock() = delete;
ScopedSpinLock(const ScopedSpinLock&) = delete;
ScopedSpinLock& operator=(const ScopedSpinLock&) = delete;
ScopedSpinLock& operator=(ScopedSpinLock&&) = delete; ScopedSpinLock& operator=(ScopedSpinLock&&) = delete;
ScopedSpinLock(LockType& lock): ScopedSpinLock(LockType& lock)
m_lock(&lock) : m_lock(&lock)
{ {
ASSERT(m_lock); ASSERT(m_lock);
m_prev_flags = m_lock->lock(); m_prev_flags = m_lock->lock();
m_have_lock = true; m_have_lock = true;
} }
ScopedSpinLock(ScopedSpinLock&& from): ScopedSpinLock(ScopedSpinLock&& from)
m_lock(from.m_lock), : m_lock(from.m_lock)
m_prev_flags(from.m_prev_flags), , m_prev_flags(from.m_prev_flags)
m_have_lock(from.m_have_lock) , m_have_lock(from.m_have_lock)
{ {
from.m_lock = nullptr; from.m_lock = nullptr;
from.m_prev_flags = 0; from.m_prev_flags = 0;
@ -182,6 +174,11 @@ public:
{ {
return m_have_lock; return m_have_lock;
} }
private:
LockType* m_lock { nullptr };
u32 m_prev_flags { 0 };
bool m_have_lock { false };
}; };
} }