AutoLock.h 1.4 KB

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