|
|
- #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_
|