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

模拟服务器

开发平台:

C/C++

  1. #include "stdafx.h"
  2. #include "IOCompletionPort.h"
  3. #include "Win32Exception.h"
  4. #include "Macro.h"
  5. /*
  6.  * namespace OnlineGameLib::Win32
  7.  */
  8. namespace OnlineGameLib {
  9. namespace Win32 {
  10. CIOCompletionPort::CIOCompletionPort( size_t maxConcurrency )
  11. : m_iocp( ::CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, maxConcurrency ) )
  12. {
  13. if ( m_iocp == 0 )
  14. {
  15. throw CWin32Exception( _T("CIOCompletionPort::CIOCompletionPort() - CreateIoCompletionPort"), ::GetLastError() );
  16. }
  17. }
  18. CIOCompletionPort::~CIOCompletionPort() 
  19. {
  20. SAFE_CLOSEHANDLE( m_iocp );
  21. }
  22. void CIOCompletionPort::AssociateDevice( HANDLE hDevice, ULONG_PTR completionKey )
  23. {
  24. if ( m_iocp != ::CreateIoCompletionPort( hDevice,
  25. m_iocp, 
  26. completionKey, 
  27. 0 ) )
  28. {
  29. throw CWin32Exception( _T("CIOCompletionPort::AssociateDevice() - CreateIoCompletionPort"), ::GetLastError() );
  30. }
  31. }
  32. void CIOCompletionPort::PostStatus( ULONG_PTR completionKey, 
  33. DWORD dwNumBytes /* = 0 */, 
  34. OVERLAPPED *pOverlapped /* = 0 */) 
  35. {
  36. if ( 0 == ::PostQueuedCompletionStatus( m_iocp, 
  37. dwNumBytes, 
  38. completionKey, 
  39. pOverlapped ) )
  40. {
  41. throw CWin32Exception( _T("CIOCompletionPort::PostStatus() - PostQueuedCompletionStatus"), ::GetLastError() );
  42. }
  43. }
  44. DWORD CIOCompletionPort::GetStatus( ULONG_PTR *pCompletionKey, 
  45. PDWORD pdwNumBytes,
  46. OVERLAPPED **ppOverlapped )
  47. {
  48. if ( 0 == ::GetQueuedCompletionStatus( m_iocp, 
  49. pdwNumBytes, 
  50. pCompletionKey, 
  51. ppOverlapped, 
  52. INFINITE ) )
  53. {
  54. return ::GetLastError();
  55. }
  56. return S_OK;
  57. }
  58. DWORD CIOCompletionPort::GetStatus( ULONG_PTR *pCompletionKey, 
  59. PDWORD pdwNumBytes,
  60. OVERLAPPED **ppOverlapped, 
  61. DWORD dwMilliseconds)
  62. {
  63. if ( 0 == ::GetQueuedCompletionStatus( m_iocp, 
  64. pdwNumBytes, 
  65. pCompletionKey, 
  66. ppOverlapped, 
  67. dwMilliseconds ) )
  68. {
  69. DWORD lastError = ::GetLastError();
  70. if ( lastError != WAIT_TIMEOUT )
  71. {
  72. return lastError;
  73. }
  74. return S_FALSE;
  75. }
  76. return S_OK;
  77. }
  78. } // End of namespace OnlineGameLib
  79. } // End of namespace Win32