erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
1.1 KiB

5 년 전
  1. #ifndef C_SRC_CRITICAL_SECTION_H_
  2. #define C_SRC_CRITICAL_SECTION_H_
  3. #include "erl_nif.h"
  4. #include "macros.h"
  5. class CriticalSection
  6. {
  7. public:
  8. CriticalSection() { }
  9. virtual ~CriticalSection() {}
  10. virtual void Enter() = 0;
  11. virtual void Leave() = 0;
  12. };
  13. class NullCriticalSection : public CriticalSection
  14. {
  15. public:
  16. NullCriticalSection() {}
  17. ~NullCriticalSection() {}
  18. void Enter() override {}
  19. void Leave() override {}
  20. private:
  21. DISALLOW_COPY_AND_ASSIGN(NullCriticalSection);
  22. };
  23. class EnifCriticalSection : public CriticalSection
  24. {
  25. public:
  26. EnifCriticalSection() { mutex_ = enif_mutex_create(NULL);}
  27. ~EnifCriticalSection() {enif_mutex_destroy(mutex_);}
  28. void Enter() override {enif_mutex_lock(mutex_);}
  29. void Leave() override {enif_mutex_unlock(mutex_);}
  30. private:
  31. ErlNifMutex *mutex_;
  32. DISALLOW_COPY_AND_ASSIGN(EnifCriticalSection);
  33. };
  34. class CritScope
  35. {
  36. public:
  37. explicit CritScope(CriticalSection *pp) : pcrit_(pp) { pcrit_->Enter();}
  38. ~CritScope() {pcrit_->Leave();}
  39. private:
  40. CriticalSection *pcrit_;
  41. DISALLOW_COPY_AND_ASSIGN(CritScope);
  42. };
  43. #endif // C_SRC_CRITICAL_SECTION_H_