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

模拟服务器

开发平台:

C/C++

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