Mutex.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:2k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "stdafx.h"
  2. #include "Mutex.h"
  3. #include "Win32Exception.h"
  4. /*
  5.  * namespace OnlineGameLib::Win32
  6.  */
  7. namespace OnlineGameLib {
  8. namespace Win32 {
  9. static HANDLE Create(
  10. LPSECURITY_ATTRIBUTES lpMutexAttributes,
  11. BOOL bInitialOwner,
  12. BOOL bNeedOnlyOne,
  13. LPCTSTR lpName)
  14. {
  15. HANDLE hMutex = ::CreateMutex( lpMutexAttributes, bInitialOwner, lpName );
  16. if ( NULL == hMutex )
  17. {
  18. throw CWin32Exception( _T("hMutex::Create()"), ::GetLastError() );
  19. }
  20. if ( bNeedOnlyOne && ERROR_ALREADY_EXISTS == ::GetLastError() )
  21. {
  22. throw CWin32Exception( _T("hMutex::Create()"), ::GetLastError() );
  23. }
  24. return hMutex;
  25. }
  26. CMutex::CMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes,
  27. BOOL bInitialOwner,
  28. BOOL bNeedOnlyOne,
  29. LPCTSTR lpName )
  30. : m_hMutex( Create( lpMutexAttributes, bInitialOwner, bNeedOnlyOne, lpName ) )
  31. , m_sName( lpName ? lpName : "" )
  32. {
  33. }
  34. HANDLE CMutex::GetMutex() const
  35. {
  36. return m_hMutex;
  37. }
  38. const char *CMutex::GetName() const
  39. {
  40. return m_sName.c_str();
  41. }
  42. void CMutex::Wait() const
  43. {
  44. if ( !Wait( INFINITE ) )
  45. {
  46. throw CException( _T("CMutex::Wait()"), _T("Unexpected timeout on infinite wait") );
  47. }
  48. }
  49. bool CMutex::Wait( DWORD timeoutMillis ) const
  50. {
  51. bool ok;
  52. DWORD result = ::WaitForSingleObject( m_hMutex, timeoutMillis );
  53. if ( result == WAIT_TIMEOUT )
  54. {
  55. ok = false;
  56. }
  57. else if ( result == WAIT_OBJECT_0 )
  58. {
  59. ok = true;
  60. }
  61. else
  62. {
  63. throw CWin32Exception( _T("CMutex::Wait() - WaitForSingleObject"), ::GetLastError() );
  64. }
  65.     
  66. return ok;
  67. }
  68. CMutex::~CMutex()
  69. {
  70. ::CloseHandle( m_hMutex );
  71. }
  72. } // End of namespace OnlineGameLib
  73. } // End of namespace Win32