forked from Bananymous/banan-os
Kernel: Add missing file for race condition fixes :)
This commit is contained in:
parent
5eefd98e1b
commit
56db0efe58
|
@ -0,0 +1,64 @@
|
|||
#pragma once
|
||||
|
||||
#include <kernel/Lock/SpinLock.h>
|
||||
#include <kernel/Lock/Mutex.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
// FIXME: These classes are HACKS to allow passing spinlock
|
||||
// to unblock functions. Write a better API that either
|
||||
// allows passing spinlocks or do something cleaner that
|
||||
// whatever shit this is
|
||||
|
||||
template<typename Lock>
|
||||
class SpinLockAsMutex : public BaseMutex
|
||||
{
|
||||
public:
|
||||
SpinLockAsMutex(Lock& lock, InterruptState state)
|
||||
: m_lock(lock)
|
||||
, m_lock_depth(lock.lock_depth())
|
||||
, m_state(state)
|
||||
, m_locker(Thread::current_tid())
|
||||
{
|
||||
ASSERT(m_lock.current_processor_has_lock());
|
||||
}
|
||||
|
||||
void lock() override
|
||||
{
|
||||
m_lock.lock();
|
||||
m_lock_depth++;
|
||||
}
|
||||
|
||||
bool try_lock() override
|
||||
{
|
||||
lock();
|
||||
return true;
|
||||
}
|
||||
|
||||
void unlock() override
|
||||
{
|
||||
m_lock.unlock(--m_lock_depth ? InterruptState::Disabled : m_state);
|
||||
}
|
||||
|
||||
pid_t locker() const override { return is_locked() ? m_locker : -1; }
|
||||
bool is_locked() const override { return m_lock_depth; }
|
||||
uint32_t lock_depth() const override { return m_lock_depth; }
|
||||
|
||||
private:
|
||||
SpinLock& m_lock;
|
||||
uint32_t m_lock_depth { 0 };
|
||||
InterruptState m_state;
|
||||
const pid_t m_locker;
|
||||
};
|
||||
|
||||
template<typename Lock>
|
||||
class SpinLockGuardAsMutex : public SpinLockAsMutex<Lock>
|
||||
{
|
||||
public:
|
||||
SpinLockGuardAsMutex(SpinLockGuard<Lock>& guard)
|
||||
: SpinLockAsMutex<Lock>(guard.m_lock, guard.m_state)
|
||||
{}
|
||||
};
|
||||
|
||||
}
|
Loading…
Reference in New Issue