Files
Sun1602/Server/Shop/ClientStub/WBANetwork/net/SessionManager.cpp
T
2022-10-26 12:25:11 +08:00

226 lines
3.9 KiB
C++

#include "stdafx.h"
#include <WBANetwork/Common.h>
#include <WBANetwork/WBANetwork.h>
#include <WBANetwork/Net/SessionManager.h>
#include <WBANetwork/util/Guard.h>
namespace WBANetwork
{
SessionManager::SessionManager()
: m_pServerNetwork( NULL )
{
}
SessionManager::~SessionManager()
{
}
bool SessionManager::Create( int sessionCnt )
{
Guard < Mutex > guard( m_MutexPool );
ServerSession* session = NULL;
for(int i = 0 ; i < sessionCnt ; i++ )
{
session = CreateSession();
session->m_pServerNetwork = m_pServerNetwork;
m_Pool.push_back( session );
}
return true;
}
void SessionManager::Destroy()
{
ServerSession* session = NULL;
{
Guard < Mutex > guard( m_MutexPool );
while( !m_Pool.empty() )
{
session = m_Pool.front();
m_Pool.pop_front();
session->m_pServerNetwork = NULL;
DeleteSession( session );
}
}
{
Guard < Mutex > guard( m_MutexActive );
for(MapActive::iterator iter = m_mapActive.begin() ; iter != m_mapActive.end() ; iter++ )
{
session = iter->second;
session->m_pServerNetwork = 0;
DeleteSession( session );
}
m_mapActive.clear();
}
m_pServerNetwork = NULL;
}
ServerSession* SessionManager::Find( DWORD uid )
{
Guard < Mutex > guard( m_MutexActive );
MapActive::iterator iter = m_mapActive.find( uid );
if( iter != m_mapActive.end() )
return iter->second;
return 0;
}
ServerSession* SessionManager::BindSession( SOCKET s, Socket::SocketAddr* addr )
{
if( NULL == s ||
NULL == addr )
{
//_ASSERTE(!"SessionManager::BindSession");
return 0;
}
ServerSession* session = NULL;
{
Guard < Mutex > guard( m_MutexPool );
if( m_Pool.size() == 0 )
return 0;
ListPool::iterator iter = m_Pool.begin();
session = *iter;
m_Pool.erase( iter );
}
session->Create( s, *addr );
{
Guard < Mutex > guard( m_MutexActive );
DWORD uid = session->GetUID();
m_mapActive[uid] = session;
}
return session;
}
bool SessionManager::ActiveSession( ServerSession* session )
{
if( NULL == session )
{
//_ASSERTE(!"SessionManager::ActiveSession");
return 0;
}
{
Guard < Mutex > guard( m_MutexPool );
bool isFind = false;
for(ListPool::iterator iter = m_Pool.begin() ; iter != m_Pool.end() ; iter++ )
{
if( *iter == session )
{
m_Pool.erase( iter );
isFind = true;
break;
}
}
if( false == isFind )
{
return false;
}
}
{
Guard < Mutex > guard( m_MutexActive );
DWORD uid = session->GetUID();
m_mapActive[uid] = session;
}
return true;
}
void SessionManager::InactiveSession( ServerSession* session )
{
if( NULL == session )
{
//_ASSERTE(!"SessionManager::InactiveSession");
return;
}
{
Guard < Mutex > guard( m_MutexActive );
MapActive::iterator iter = m_mapActive.find( session->GetUID() );
if( iter != m_mapActive.end() )
{
// ActiveÀÇ sessionÀ» »èÁ¦Çϰí Pool¿¡ ³Ö´Â´Ù.
m_mapActive.erase( iter );
{
Guard < Mutex > guard( m_MutexPool );
m_Pool.push_back( session );
}
}
}
}
void SessionManager::Update()
{
Guard < Mutex > guard( m_MutexActive );
if( m_mapActive.size() == 0 )
{
return;
}
ServerSession* session = NULL;
for(MapActive::iterator iter = m_mapActive.begin() ; iter != m_mapActive.end() ; iter++ )
{
session = iter->second;
session->Update();
}
}
void SessionManager::UpdateInactive()
{
Guard < Mutex > guard( m_MutexPool );
if( m_Pool.size() == 0 )
{
return;
}
ServerSession* session = NULL;
for(ListPool::iterator iter = m_Pool.begin() ; iter != m_Pool.end() ; iter++ )
{
session = *iter;
session->Update();
}
}
ServerSession* SessionManager::CreateSession()
{
return ( _new_dbg_ ServerSession( 8192, 8192 ) );
}
void SessionManager::DeleteSession( ServerSession* session )
{
if( NULL != session )
{
delete session, session = NULL;
}
}
}