void SessionManager::DeleteClientSession(ClientSession* client)
{
	//TODO: lock으로 보호할 것
	FastSpinlockGuard EnterLock(m_Lock);
	{
		mClientList.erase(client->mSocket);
	}
	
	delete client;
}
ClientSession* SessionManager::CreateClientSession(SOCKET sock)
{
	ClientSession* client = new ClientSession(sock);

	
	//TODO: lock으로 보호할 것
	FastSpinlockGuard EnterLock(m_Lock);
	{
		mClientList.insert(ClientList::value_type(sock, client));
	}

	return client;
}
Пример #3
0
void CThreadsManager::RunTask( CTaskObject* pTaskObject )
{
	if (FALSE == EnterLock())
	{
		return;
	}
	
	//float fBusyNum = m_dwBusyNum * 100 / THRESHOLD_VALUE;
	if ( m_dwBusyNum<<1 >= m_dwPoolSize )
	{
		CreateThreads( THREADS_STEP_INC );
	}
	
	BOOL32 bFind = FALSE;
	// 直接从上一次的下一个开始查找
//	++m_iter;
//	for (; m_iter != m_ThreadMap.end(); ++m_iter)
//	{
//		CThreadInfo* pInfo = m_iter->second;
//		if (FALSE == pInfo->HasTask())
//		{
//			pInfo->SetTask( pTaskObject );
//			bFind = TRUE;
//			break;
//		}
//		++g_FindCount;
//	}

	// 如果没有找到,则从头开始找
//	if (FALSE == bFind)
//	{
    ThreadMap::iterator iter;
		for (iter = m_ThreadMap.begin(); iter != m_ThreadMap.end(); ++iter)
		{
			CThreadInfo* pInfo = iter->second;
			if (FALSE == pInfo->HasTask())
			{
				pInfo->SetTask( pTaskObject );
				break;
			}
			++g_FindCount;
		}
//	}

	LeaveLock();

	++m_dwBusyNum;
}
session * session_manager::GetOneInvalidSession()
{
	EnterLock();
	std::vector<session *>::iterator it;
	for(it = m_invalidsession_list.begin();it!=m_invalidsession_list.end();it++)
	{
		if(!(*it)->GetInvalidStatus())
		{
			session * psession = (*it);
			psession->SetInvalidStatus(true);
			m_invalidsession_list.erase(it);
			ExitLock();
			return psession;
		}
	}
	ExitLock();
	return 0;
}
void session_manager::AddInvalidSession( session * psession )
{
	EnterLock();
	m_invalidsession_list.push_back(psession);
	ExitLock();
}