IOCPThreadPoolQueue.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:4k
源码类别:

CA认证

开发平台:

Visual C++

  1. /*
  2. Module : IOCPThreadPoolQueue.cpp
  3. Purpose: Implementation for an MFC class which implements a queue for CThreadPoolServer using an SDK IO Completion port
  4. Created: PJN / 18-08-2002
  5. History: PJN / 10-11-2002 1. Fixed an unreferrenced variable in the function CIOCPThreadPoolQueue::GetRequest, Thanks to
  6.                           Michael K. O'Neill for reporting this issue.
  7. Copyright (c) 2002 - 2005 by PJ Naughter.  (Web: www.naughter.com, Email: pjna@naughter.com)
  8. All rights reserved.
  9. Copyright / Usage Details:
  10. You are allowed to include the source code in any product (commercial, shareware, freeware or otherwise) 
  11. when your product is released in binary form. You are allowed to modify the source code in any way you want 
  12. except you cannot modify the copyright details at the top of each module. If you want to distribute source 
  13. code with your application, then you are only allowed to distribute versions released by the author. This is 
  14. to maintain a single distribution point for the source code. 
  15. */
  16. /////////////////// Includes //////////////////////////////////////////////////
  17. #include "stdafx.h"
  18. #include "IOCPThreadPoolQueue.h"
  19. /////////////////// Macros / Defines //////////////////////////////////////////
  20. #ifdef _DEBUG
  21. #define new DEBUG_NEW
  22. #undef THIS_FILE
  23. static char THIS_FILE[] = __FILE__;
  24. #endif
  25. ///////////////// Implementation //////////////////////////////////////////////
  26. IMPLEMENT_DYNCREATE(CIOCPThreadPoolQueue, CThreadPoolQueue)
  27. CIOCPThreadPoolQueue::CIOCPThreadPoolQueue()
  28. {
  29.   m_hIOCP = NULL;
  30. }
  31. CIOCPThreadPoolQueue::~CIOCPThreadPoolQueue()
  32. {
  33.   Close();
  34. }
  35. BOOL CIOCPThreadPoolQueue::Create(DWORD dwMaxQSize)
  36. {
  37.   //Close if already created
  38.   Close();
  39.   //Create the IOCP
  40.   m_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, dwMaxQSize);
  41.   if (m_hIOCP == NULL)
  42.   {
  43.     TRACE(_T("CIOCPThreadPoolQueue::Create, Failed to create a IOCP, Error:%dn"), GetLastError());
  44.     Close();
  45.     return FALSE;
  46.   }
  47.   return TRUE;
  48. }
  49. BOOL CIOCPThreadPoolQueue::PostRequest(const CThreadPoolRequest& request, DWORD /*dwMilliseconds*/)
  50. {
  51.   ASSERT(IsCreated()); //Must have been created
  52.   //An IOCP does not support directed requests
  53.   if (request.m_bDirectedRequest)
  54.   {
  55.     TRACE(_T("CIOCPThreadPoolQueue::PostRequest, An IOCP based thread pool queue does not support directed requestsn"));
  56.     return FALSE;
  57.   }
  58.   else
  59.   {
  60.     if (!PostQueuedCompletionStatus(m_hIOCP, request.m_dwID, NULL, (LPOVERLAPPED) request.m_pData))
  61.     {
  62.       TRACE(_T("CIOCPThreadPoolQueue::PostRequest, Failed in call to PostQueuedCompletionStatus, Error:%dn"), GetLastError());
  63.       return FALSE;
  64.     }
  65.   }
  66.   return TRUE;
  67. }
  68. BOOL CIOCPThreadPoolQueue::GetRequest(CThreadPoolRequest& request, int /*nThreadIndexForDirectedRequest*/, DWORD dwMilliseconds)
  69. {
  70.   ASSERT(IsCreated()); //Must have been created
  71.   //Pull of a request from the IOCP
  72.   DWORD dwBytesTransferred = 0;
  73.   DWORD dwCompletionKey = 0;
  74.   LPOVERLAPPED lpOverlapped = NULL;
  75.   if (!GetQueuedCompletionStatus(m_hIOCP, &dwBytesTransferred, &dwCompletionKey, &lpOverlapped, dwMilliseconds))
  76.   {
  77.     TRACE(_T("CIOCPThreadPoolQueue::GetRequest, Failed while waiting for the item on the Q, Error:%dn"), GetLastError());
  78.     return FALSE;
  79.   }
  80.   request.m_bDirectedRequest = FALSE; //Always will be a non-directed request from an IOCP queue
  81.   request.m_nDirectedRequestIndex = -1; 
  82.   request.m_dwID = dwBytesTransferred;
  83.   request.m_pData = lpOverlapped;
  84.   return TRUE;
  85. }
  86. BOOL CIOCPThreadPoolQueue::Close()
  87. {
  88.   //Free up the IOCP
  89.   if (m_hIOCP)
  90.   {
  91.     CloseHandle(m_hIOCP);
  92.     m_hIOCP = NULL;
  93.   }
  94.   return TRUE;
  95. }
  96. BOOL CIOCPThreadPoolQueue::IsCreated() const
  97. {
  98.   return (m_hIOCP != NULL);
  99. }