#ifndef SESSION_MANAGER_CPP #define SESSION_MANAGER_CPP #include "SessionManager.h" template CHandlerManagerEx::CHandlerManagerEx(void) :m_uiInitSize(0), m_pHandlers(NULL), m_uiLastHandlerIndex(0),m_uiLastSessionID(CHandlerManagerEx::SESSION_ID_START) { } template CHandlerManagerEx::~CHandlerManagerEx(void) { if(NULL != m_pHandlers) delete []m_pHandlers; } template int CHandlerManagerEx::Open(unsigned int uiInitSize) { m_pHandlers = NEW SVC_HANDLER[uiInitSize]; if(NULL == m_pHandlers) return -1; m_uiInitSize = uiInitSize; return 0; } template SVC_HANDLER * CHandlerManagerEx::GetHandler(unsigned int uiSessionID) { // 是否已初始化? if(NULL == m_pHandlers) return NULL; // 获取一个处理器 bool bFindValidHandler = false; SVC_HANDLER *pHandler = NULL; for(unsigned int i = m_uiLastHandlerIndex + 1; i < m_uiInitSize; i++) { if(!(m_pHandlers[i].IsUsed())) { ACE_GUARD_RETURN(ACE_LOCK, mon, m_mutex, NULL); if(!(m_pHandlers[i].IsUsed())) { m_pHandlers[i].IsUsed(true); bFindValidHandler = true; m_uiLastHandlerIndex = i; pHandler = &(m_pHandlers[i]); if(uiSessionID == 0) { pHandler->SessionID(m_uiLastSessionID + 1); m_uiLastSessionID++; } else pHandler->SessionID(uiSessionID); //m_handlerSet.insert(pHandler); break; } } } if(!bFindValidHandler) { for(unsigned int i = 0; i < m_uiInitSize; i++) { if(!(m_pHandlers[i].IsUsed())) { ACE_GUARD_RETURN(ACE_LOCK, mon, m_mutex, NULL); if(!(m_pHandlers[i].IsUsed())) { m_pHandlers[i].IsUsed(true); bFindValidHandler = true; m_uiLastHandlerIndex = i; pHandler = &(m_pHandlers[i]); if(uiSessionID == 0) { pHandler->SessionID(m_uiLastSessionID + 1); m_uiLastSessionID++; } else pHandler->SessionID(uiSessionID); //m_handlerSet.insert(pHandler); break; } } } } return pHandler; } template void CHandlerManagerEx::Handlers(std::set& handlers) { handlers.clear(); ACE_GUARD(ACE_LOCK, mon, m_mutex); for(unsigned int i = 0; i < m_uiInitSize; i++ ) { if(m_pHandlers[i].IsUsed()) handlers.insert(&(m_pHandlers[i])); } return; } //template //CAcceptorEx::CAcceptorEx(void) //:m_pReadQueue(NULL), m_pSendQueue(NULL) //{ // //} template CAcceptorEx::CAcceptorEx(IBufQueue *pReadQueue, IBufQueue *pSendQueue, unsigned int uiPeerBufferSize, CHandlerManagerEx *pHandlerManager) : m_pReadQueue(pReadQueue), m_pSendQueue(pSendQueue),m_uiPeerBufferSize(uiPeerBufferSize), m_pHandlerManager(pHandlerManager) { } template CAcceptorEx::~CAcceptorEx(void) { } template int CAcceptorEx::open(const ACE_PEER_ACCEPTOR_ADDR &local_addr, ACE_Reactor *reactor,int flags, int use_select, int reuse_addr ) { if(parent::open(local_addr, reactor, flags, use_select, reuse_addr) == -1) return -1; // 设置recvbuf,sendbuf int iOldBuf = 0; int iNewbuf = 512* 1024; int optLen = sizeof(iOldBuf); int i = this->acceptor().get_option(SOL_SOCKET, SO_SNDBUF, &iOldBuf, &optLen); i = this->acceptor().set_option(SOL_SOCKET, SO_RCVBUF, &iNewbuf, sizeof(iNewbuf)); i = this->acceptor().set_option(SOL_SOCKET, SO_SNDBUF, &iNewbuf, sizeof(iNewbuf)); i = this->acceptor().get_option(SOL_SOCKET, SO_SNDBUF, &iOldBuf, &optLen); return 0; } template int CAcceptorEx::make_svc_handler(SVC_HANDLER *&sh) { if((m_pReadQueue == NULL)|| (m_pSendQueue == NULL)) return -1; if(sh == 0) { sh = m_pHandlerManager->GetHandler(); if(NULL == sh) return -1; } sh->reactor (this->reactor ()); // 设置队列 sh->ReadQueue(this->ReadQueue()); sh->SendQueue(this->SendQueue()); return 0; } template IBufQueue * CAcceptorEx::ReadQueue(void) { return m_pReadQueue; } template void CAcceptorEx::ReadQueue(IBufQueue *pReadQueue) { m_pReadQueue = pReadQueue; } template IBufQueue * CAcceptorEx::SendQueue(void) { return m_pSendQueue; } template void CAcceptorEx::SendQueue(IBufQueue *pSendQueue) { m_pSendQueue = pSendQueue; } //template //CConnectorEx::CConnectorEx(void) //:m_pReadQueue(NULL), m_pSendQueue(NULL) //{ // //} template CConnectorEx::CConnectorEx(IBufQueue *pReadQueue, IBufQueue *pSendQueue, unsigned int uiPeerBufferSize, CHandlerManagerEx *pHandlerManager) : m_pReadQueue(pReadQueue), m_pSendQueue(pSendQueue),m_uiPeerBufferSize(uiPeerBufferSize), m_pHandlerManager(pHandlerManager) { } template CConnectorEx::~CConnectorEx(void) { } template int CConnectorEx::make_svc_handler(SVC_HANDLER *&sh) { if((m_pReadQueue == NULL)|| (m_pSendQueue == NULL)) return -1; if(sh == 0) { sh = m_pHandlerManager->GetHandler(); if(NULL == sh) return -1; } sh->reactor (this->reactor ()); // 设置队列 sh->ReadQueue(this->ReadQueue()); sh->SendQueue(this->SendQueue()); return 0; } template IBufQueue * CConnectorEx::ReadQueue(void) { return m_pReadQueue; } template void CConnectorEx::ReadQueue(IBufQueue *pReadQueue) { m_pReadQueue = pReadQueue; } template IBufQueue * CConnectorEx::SendQueue(void) { return m_pSendQueue; } template void CConnectorEx::SendQueue(IBufQueue *pSendQueue) { m_pSendQueue = pSendQueue; } #endif/*SESSION_MANAGER_CPP*/