#ifndef MRT_SPINLOCK_H
#define MRT_SPINLOCK_H
#include <pthread.h>
#include "Base/Macros.h"
namespace MapleRuntime {
class SpinLock {
public:
SpinLock() { pthread_spin_init(&spinlock, 0); }
~SpinLock() { pthread_spin_destroy(&spinlock); }
void Lock() { pthread_spin_lock(&spinlock); }
void Unlock() { pthread_spin_unlock(&spinlock); }
bool TryLock() { return pthread_spin_trylock(&spinlock) == 0; }
private:
pthread_spinlock_t spinlock;
DISABLE_CLASS_COPY_AND_ASSIGN(SpinLock);
};
class ScopedEnterSpinLock {
public:
explicit ScopedEnterSpinLock(SpinLock& lock) : spinLock(lock) { spinLock.Lock(); }
~ScopedEnterSpinLock() { spinLock.Unlock(); }
private:
SpinLock& spinLock;
};
}
#endif