1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- #ifndef _AUTOLOCK_H
- #define _AUTOLOCK_H
- #include <winpr/synch.h>
- #include <winpr/thread.h>
- #include <winpr/sysinfo.h>
- class CLockObject
- {
- private:
- CRITICAL_SECTION m_Section;
- bool m_bInit;
- public:
- inline CLockObject():m_bInit(false){Init();}
- inline ~CLockObject(){if(m_bInit)::DeleteCriticalSection(&m_Section);}
- inline void Init(){if(!m_bInit)::InitializeCriticalSection(&m_Section);m_bInit=true;}
- inline void Clear(){if(m_bInit)::DeleteCriticalSection(&m_Section);m_bInit=false;}
- inline void Lock(){::EnterCriticalSection(&m_Section);}
- inline void Unlock(){::LeaveCriticalSection(&m_Section);}
- inline bool Trylock(){return ::TryEnterCriticalSection(&m_Section)==TRUE;}
- };
- class CAutoLock
- {
- private:
- CLockObject *m_pObject;
- public:
- inline CAutoLock(CLockObject *pObject,DWORD nTimeOut=0):m_pObject(pObject)
- {
- if(m_pObject==NULL)
- return;
- if(nTimeOut==0)
- m_pObject->Lock();
- else
- {
- DWORD nBegin(::GetTickCount());
- while(!m_pObject->Trylock())
- {
- if(!SwitchToThread())
- Sleep(100);
- if(GetTimeDistance(nBegin)>=nTimeOut)
- {
- m_pObject=NULL;
- //assert(false);
- break;
- }
- }
- }
- }
- inline ~CAutoLock()
- {
- if(m_pObject)
- m_pObject->Unlock();
- }
- inline DWORD GetTimeDistance(DWORD nBegin)
- {
- DWORD nEnd(::GetTickCount());
- if(nEnd>=nBegin)
- return nEnd-nBegin;
- else
- return nEnd+!nBegin+1;
- }
- };
- #endif//_AUTOLOCK_H
|