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