erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

62 Zeilen
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_