#ifndef C_SRC_CRITICAL_SECTION_H_
|
|
#define C_SRC_CRITICAL_SECTION_H_
|
|
|
|
#include "erl_nif.h"
|
|
#include "macros.h"
|
|
|
|
class CriticalSection
|
|
{
|
|
public:
|
|
|
|
CriticalSection() { }
|
|
virtual ~CriticalSection() {}
|
|
|
|
virtual void Enter() = 0;
|
|
virtual void Leave() = 0;
|
|
};
|
|
|
|
class NullCriticalSection : public CriticalSection
|
|
{
|
|
public:
|
|
|
|
NullCriticalSection() {}
|
|
~NullCriticalSection() {}
|
|
|
|
void Enter() override {}
|
|
void Leave() override {}
|
|
|
|
private:
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(NullCriticalSection);
|
|
};
|
|
|
|
class EnifCriticalSection : public CriticalSection
|
|
{
|
|
public:
|
|
|
|
EnifCriticalSection() { mutex_ = enif_mutex_create(NULL);}
|
|
~EnifCriticalSection() {enif_mutex_destroy(mutex_);}
|
|
|
|
void Enter() override {enif_mutex_lock(mutex_);}
|
|
void Leave() override {enif_mutex_unlock(mutex_);}
|
|
|
|
private:
|
|
|
|
ErlNifMutex *mutex_;
|
|
DISALLOW_COPY_AND_ASSIGN(EnifCriticalSection);
|
|
};
|
|
|
|
class CritScope
|
|
{
|
|
public:
|
|
|
|
explicit CritScope(CriticalSection *pp) : pcrit_(pp) { pcrit_->Enter();}
|
|
~CritScope() {pcrit_->Leave();}
|
|
|
|
private:
|
|
|
|
CriticalSection *pcrit_;
|
|
DISALLOW_COPY_AND_ASSIGN(CritScope);
|
|
};
|
|
|
|
#endif // C_SRC_CRITICAL_SECTION_H_
|