📄 nwiocompletionport.cpp
字号:
#include "StdAfx.h"
#include "NWIOCompletionPort.h"
#include "NWException.h"
CIOCompletionPort CIOCompletionPort::m_Instance ;
CIOCompletionPort::CIOCompletionPort( size_t maxConcurrency )
: m_iocp( ::CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, maxConcurrency ) )
{
if ( m_iocp == 0 )
{
Trace("CIOCompletionPort::CIOCompletionPort() - CreateIoCompletionPort(%d)" , ::GetLastError() );
}
}
CIOCompletionPort::~CIOCompletionPort(void)
{
try
{
if (m_iocp)
{
PostQueuedCompletionStatus(m_iocp, 0, (DWORD) NULL, NULL);
CloseHandle(m_iocp);
m_iocp= NULL;
}
}
catch(...)
{
Trace("SAFE_CLOSEHANDLE error\n");
}
}
int CIOCompletionPort::BindDevice( HANDLE hDevice, ULONG_PTR completionKey )
{
MYEXCEPTIONFUNC_START();
if ( m_iocp != ::CreateIoCompletionPort( hDevice,
m_iocp,
completionKey,
0 ) )
{
throw_NWExceptionC("CIOCompletionPort::AssociateDevice() - CreateIoCompletionPort", ::GetLastError() );
}
iRetCode = 0 ;
MYEXCEPTIONFUNC_END("CIOCompletionPort::AssociateDevice()");
}
void CIOCompletionPort::PostStatus( ULONG_PTR completionKey,
DWORD dwNumBytes /* = 0 */,
OVERLAPPED *pOverlapped /* = 0 */)
{
MYEXCEPTIONFUNC_START();
if ( 0 == ::PostQueuedCompletionStatus( m_iocp,
dwNumBytes,
completionKey,
pOverlapped ) )
{
throw_NWExceptionC("CIOCompletionPort::PostStatus() - PostQueuedCompletionStatus", ::GetLastError() );
}
iRetCode = 0 ;
MYEXCEPTIONFUNC_NOREV_END("CIOCompletionPort::PostStatus( )");
}
DWORD CIOCompletionPort::GetStatus( ULONG_PTR *pCompletionKey,
PDWORD pdwNumBytes,
OVERLAPPED **ppOverlapped )
{
MYEXCEPTIONFUNC_START();
if ( 0 == ::GetQueuedCompletionStatus( m_iocp,
pdwNumBytes,
pCompletionKey,
ppOverlapped,
INFINITE ) )
{
throw_NWExceptionC("GetQueuedCompletionStatus Error", ::GetLastError());
}
iRetCode = S_OK;
MYEXCEPTIONFUNC_END("CIOCompletionPort::GetStatus");
}
DWORD CIOCompletionPort::GetStatus( ULONG_PTR *pCompletionKey,
PDWORD pdwNumBytes,
OVERLAPPED **ppOverlapped,
DWORD dwMilliseconds)
{
MYEXCEPTIONFUNC_START();
iRetCode = ::GetQueuedCompletionStatus( m_iocp,
pdwNumBytes,
pCompletionKey,
ppOverlapped,
dwMilliseconds ) ;
if ( iRetCode != 0 )
{
DWORD lastError = ::GetLastError();
if ( lastError != WAIT_TIMEOUT )
{
throw_NWExceptionC("GetQueuedCompletionStatus Error", lastError);
}
return S_FALSE;
}
iRetCode = S_OK;
MYEXCEPTIONFUNC_END("CIOCompletionPort::GetStatus");
}
int CIOCompletionPort::InitWorkerThreads(int nThreadNumber,IMessageProcess * pcMessageProccess,CSocketServer * pcSockServer)
{
MYEXCEPTIONFUNC_START();
pNWWorkerThread pWorkerThread;
for (int nIndex = 0 ; nIndex < nThreadNumber; nIndex ++)
{
pWorkerThread = new NWWorkerThread ;
pWorkerThread->m_pcMessageProccess = pcMessageProccess;
pWorkerThread->m_pcSocketServer = pcSockServer;
m_lsWorkerThreadList.AddTail(pWorkerThread);
}
iRetCode = 0 ;
MYEXCEPTIONFUNC_END("CIOCompletionPort::StartWorkerThreads()");
}
int CIOCompletionPort::StartWorkerThreads()
{
MYEXCEPTIONFUNC_START();
if (m_lsWorkerThreadList.GetCount() <= 0)
{
throw_NWException("m_lsWorkerThreadList.GetCount() <= 0");
}
if (m_lsWorkerThreadList.GotoHead() != NULL)
{
throw_NWException("m_lsWorkerThreadList.GotoHead() != NULL");
}
pNWWorkerThread pWorkerThread = NULL;
do
{
pWorkerThread = m_lsWorkerThreadList.GetCur();
if (pWorkerThread)
{
pWorkerThread->Start();
}
} while (m_lsWorkerThreadList.GotoNext() == NULL);
iRetCode = 0 ;
MYEXCEPTIONFUNC_END("CIOCompletionPort::StartWorkerThreads()");
}
int CIOCompletionPort::StopWorkerThreads()
{
MYEXCEPTIONFUNC_START();
if (m_lsWorkerThreadList.GetCount() <= 0)
{
throw_NWException("m_lsWorkerThreadList.GetCount() <= 0");
}
if (m_lsWorkerThreadList.GotoHead() != NULL)
{
throw_NWException("m_lsWorkerThreadList.GotoHead() != NULL");
}
pNWWorkerThread pWorkerThread = NULL;
do
{
pWorkerThread = m_lsWorkerThreadList.GetCur();
if (pWorkerThread)
{
pWorkerThread->DoStopRun();
}
} while (m_lsWorkerThreadList.GotoNext() == NULL);
iRetCode = 0 ;
MYEXCEPTIONFUNC_END("CIOCompletionPort::StopWorkerThreads()");
}
int CIOCompletionPort::UninitWorkerThreads()
{
MYEXCEPTIONFUNC_START();
pNWWorkerThread pWorkerThread = NULL;
while (m_lsWorkerThreadList.GetCount() > 0)
{
m_lsWorkerThreadList.RemoveHead(pWorkerThread);
if (pWorkerThread != NULL)
{
delete pWorkerThread ;
pWorkerThread = NULL;
}
}
iRetCode = 0 ;
MYEXCEPTIONFUNC_END("CIOCompletionPort::StopWorkerThreads()");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -