39 lines
1000 B
C++
39 lines
1000 B
C++
// File: crn_spinlock.h
|
|
// See Copyright Notice and license at the end of inc/crnlib.h
|
|
#pragma once
|
|
|
|
namespace crnlib
|
|
{
|
|
// Simple non-recursive spinlock.
|
|
class spinlock
|
|
{
|
|
public:
|
|
inline spinlock() : m_flag(0) { }
|
|
|
|
void lock(uint32 max_spins = 4096, bool yielding = true, bool memoryBarrier = true);
|
|
|
|
inline void lock_no_barrier(uint32 max_spins = 4096, bool yielding = true) { lock(max_spins, yielding, false); }
|
|
|
|
void unlock();
|
|
|
|
inline void unlock_no_barrier() { m_flag = CRNLIB_FALSE; }
|
|
|
|
private:
|
|
volatile int32 m_flag;
|
|
};
|
|
|
|
class scoped_spinlock
|
|
{
|
|
scoped_spinlock(const scoped_spinlock&);
|
|
scoped_spinlock& operator= (const scoped_spinlock&);
|
|
|
|
public:
|
|
inline scoped_spinlock(spinlock& lock) : m_lock(lock) { m_lock.lock(); }
|
|
inline ~scoped_spinlock() { m_lock.unlock(); }
|
|
|
|
private:
|
|
spinlock& m_lock;
|
|
};
|
|
|
|
} // namespace crnlib
|