github.com/platonnetwork/platon-go@v0.7.6/cases/tool/win/bls_win/include/cybozu/critical_section.hpp (about) 1 #pragma once 2 /** 3 @file 4 @brief critical section 5 6 @author MITSUNARI Shigeo(@herumi) 7 @author MITSUNARI Shigeo 8 */ 9 #include <cybozu/mutex.hpp> 10 11 namespace cybozu { 12 13 class ConditionVariableCs; 14 15 namespace thread { 16 17 #ifdef _WIN32 18 typedef CRITICAL_SECTION CsHandle; 19 inline void CsInit(CsHandle& cs) { InitializeCriticalSection(&cs); } 20 inline void CsLock(CsHandle& cs) { EnterCriticalSection(&cs); } 21 inline void CsUnlock(CsHandle& cs) { LeaveCriticalSection(&cs); } 22 inline void CsTerm(CsHandle& cs) { DeleteCriticalSection(&cs); } 23 #else 24 typedef pthread_mutex_t CsHandle; 25 inline void CsInit(CsHandle& cs) { pthread_mutex_init(&cs, NULL); } 26 inline void CsLock(CsHandle& cs) { pthread_mutex_lock(&cs); } 27 inline void CsUnlock(CsHandle& cs) { pthread_mutex_unlock(&cs); } 28 inline void CsTerm(CsHandle& cs) { pthread_mutex_destroy(&cs); } 29 #endif 30 31 } // cybozu::thread 32 33 class CriticalSection { 34 friend class cybozu::ConditionVariableCs; 35 public: 36 CriticalSection() 37 { 38 thread::CsInit(hdl_); 39 } 40 ~CriticalSection() 41 { 42 thread::CsTerm(hdl_); 43 } 44 inline void lock() 45 { 46 thread::CsLock(hdl_); 47 } 48 inline void unlock() 49 { 50 thread::CsUnlock(hdl_); 51 } 52 private: 53 CriticalSection(const CriticalSection&); 54 CriticalSection& operator=(const CriticalSection&); 55 thread::CsHandle hdl_; 56 }; 57 58 typedef cybozu::thread::AutoLockT<cybozu::CriticalSection> AutoLockCs; //!< auto lock critical section 59 60 } // cybozu