Kernel: Implement SpinLock unsafe that does not keep track of locker

This will be used in scheduler where thread ids are changing
This commit is contained in:
Bananymous 2024-03-01 15:48:08 +02:00
parent 02ad199138
commit 054b41383f
1 changed files with 31 additions and 0 deletions

View File

@ -40,6 +40,37 @@ namespace Kernel
uint32_t m_lock_depth { 0 };
};
class SpinLockUnsafe
{
BAN_NON_COPYABLE(SpinLockUnsafe);
BAN_NON_MOVABLE(SpinLockUnsafe);
public:
SpinLockUnsafe() = default;
InterruptState lock()
{
auto state = get_interrupt_state();
set_interrupt_state(InterruptState::Disabled);
while (!m_locked.compare_exchange(false, true))
__builtin_ia32_pause();
return state;
}
void unlock(InterruptState state)
{
m_locked.store(false);
set_interrupt_state(state);
}
bool is_locked() const { return m_locked; }
private:
BAN::Atomic<bool> m_locked;
};
template<typename Lock>
class SpinLockGuard
{