/*!
	ClientConnectionQueue.cpp

	クライアント新規接続用キュー
*/
#include "StdAfx.h"
#include "ClientConnectionQueue.h"


///////////////////////////////////////////////////////////////////
//	コンストラクタ
///////////////////////////////////////////////////////////////////
CClientConnectionQueue::CClientConnectionQueue(void)
{
	m_semaphore.Create(0, 100000);
	SetMaxQueue(100);
}

CClientConnectionQueue::~CClientConnectionQueue(void)
{
	Stop();
}


///////////////////////////////////////////////////////////////////
//	インターフェース
///////////////////////////////////////////////////////////////////
/*!
	終了処理
*/
void CClientConnectionQueue::Stop()
{
	CRITICAL_SECTION_SCOPE();

	//	削除
	while(m_queue.GetCount())
		m_queue.RemoveHead().Delete();
}

/*!
	追加
*/
int CClientConnectionQueue::AddNewConnection(IClientConnectionPtr newConnection)
{
	CRITICAL_SECTION_SCOPE();

	//	最大数以下？
	if(m_queue.GetCount() >= m_maxQueue)
		return(-1);

	//	追加
	m_queue.AddTail(IClientConnectionAutoPtr(newConnection));
	::ReleaseSemaphore(m_semaphore, 1, NULL);

	return(0);
}

/*!
	取得
*/
IClientConnectionPtr CClientConnectionQueue::GetNewConnection()
{
	CRITICAL_SECTION_SCOPE();

	//	あるの？
	if(m_queue.GetCount() <= 0)
		return(IClientConnectionPtr());

	//	取得
	return(m_queue.RemoveHead().Detach());
}

/*!
	最大数設定
*/
void CClientConnectionQueue::SetMaxQueue(int max)
{
	m_maxQueue = max;
	m_queue.SetMinQueueSize(m_maxQueue);
}

/*!
	現在の保持数を取得
*/
int CClientConnectionQueue::GetCurrentQueueCount()
{
	CRITICAL_SECTION_SCOPE();

	return(m_queue.GetCount());
}
