erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

62 lines
1.1 KiB

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