#include "StdAfx.h" #include "Singleton.h" #include "Thread.h" #include "SocketContext.h" #include "IocpManager.h" #include "SocketContextMgr.h" #include "Log.h" #ifdef _USE_ACCEPTEX CSocketContextMgr::CSocketContextMgr( CIocpManager* pIOCP ) : Thread( "SocketContextMgr" ), m_pIOCP( pIOCP ) { } CSocketContextMgr::~CSocketContextMgr() { Thread::m_bRunning = false; Thread::WaitForTerminate(); for each( CSocketContext* pContext in m_vSocketContext ) delete pContext; m_vSocketContext.clear(); } bool CSocketContextMgr::bInitialize() { if( !Thread::Start() ) return false; return true; } CSocketContext* CSocketContextMgr::pGetSocketContext() { CSocketContext* pSocketContext = new (std::nothrow) CSocketContext(); if( pSocketContext ) { ScopeLock Lock( m_Lock ); m_vSocketContext.push_back( pSocketContext ); } return pSocketContext; } void CSocketContextMgr::OnDisconnect( CSocketContext* pSocketContext ) { ScopeLock Lock( m_Lock ); pSocketContext->OnDisconnect(); m_listCloseSocketContext.push_back( pSocketContext ); } void CSocketContextMgr::Run() { while( m_bRunning ) { std::list aList; { ScopeLock Lock( m_Lock ); std::copy(m_listCloseSocketContext.begin(), m_listCloseSocketContext.end(), std::back_inserter(aList)); } if (!aList.empty()) { std::list::iterator aIt = aList.begin(); while (aList.end() != aIt) { CSocketContext* pSocketContext = (*aIt); DN_ASSERT(NULL != pSocketContext, "Invalid!"); if((1) > ::timeGetTime() - pSocketContext->dwGetCloseTime()) { break; } if( m_pIOCP ) { bool bRetVal = m_pIOCP->bOnReUse(pSocketContext); if (!bRetVal) { aIt = aList.erase(aIt); continue; } } ++aIt; } } if (!aList.empty()) { ScopeLock Lock( m_Lock ); std::list::iterator aIt1 = aList.begin(); for (; aList.end() != aIt1 ; ++aIt1) { CSocketContext* pSocketContext = (*aIt1); DN_ASSERT(NULL != pSocketContext, "Invalid!"); std::list::iterator aIt2 = std::find(m_listCloseSocketContext.begin(), m_listCloseSocketContext.end(), pSocketContext); if (aIt2 != m_listCloseSocketContext.end()) { m_listCloseSocketContext.erase(aIt2); } } } Sleep( 1000 ); } } #endif // #ifdef _USE_ACCEPTEX