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:
parent
163c9d5f8f
commit
e83c36d053
1 changed files with 31 additions and 34 deletions
|
@ -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 };
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue