AutoLock.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #ifndef _AUTOLOCK_H
  2. #define _AUTOLOCK_H
  3. #include <winpr/synch.h>
  4. #include <winpr/thread.h>
  5. #include <winpr/sysinfo.h>
  6. class CLockObject
  7. {
  8. private:
  9. CRITICAL_SECTION m_Section;
  10. bool m_bInit;
  11. public:
  12. inline CLockObject():m_bInit(false){Init();}
  13. inline ~CLockObject(){if(m_bInit)::DeleteCriticalSection(&m_Section);}
  14. inline void Init(){if(!m_bInit)::InitializeCriticalSection(&m_Section);m_bInit=true;}
  15. inline void Clear(){if(m_bInit)::DeleteCriticalSection(&m_Section);m_bInit=false;}
  16. inline void Lock(){::EnterCriticalSection(&m_Section);}
  17. inline void Unlock(){::LeaveCriticalSection(&m_Section);}
  18. inline bool Trylock(){return ::TryEnterCriticalSection(&m_Section)==TRUE;}
  19. };
  20. class CAutoLock
  21. {
  22. private:
  23. CLockObject *m_pObject;
  24. public:
  25. inline CAutoLock(CLockObject *pObject,DWORD nTimeOut=0):m_pObject(pObject)
  26. {
  27. if(m_pObject==NULL)
  28. return;
  29. if(nTimeOut==0)
  30. m_pObject->Lock();
  31. else
  32. {
  33. DWORD nBegin(::GetTickCount());
  34. while(!m_pObject->Trylock())
  35. {
  36. if(!SwitchToThread())
  37. Sleep(100);
  38. if(GetTimeDistance(nBegin)>=nTimeOut)
  39. {
  40. m_pObject=NULL;
  41. //assert(false);
  42. break;
  43. }
  44. }
  45. }
  46. }
  47. inline ~CAutoLock()
  48. {
  49. if(m_pObject)
  50. m_pObject->Unlock();
  51. }
  52. inline DWORD GetTimeDistance(DWORD nBegin)
  53. {
  54. DWORD nEnd(::GetTickCount());
  55. if(nEnd>=nBegin)
  56. return nEnd-nBegin;
  57. else
  58. return nEnd+!nBegin+1;
  59. }
  60. };
  61. #endif//_AUTOLOCK_H