#include "StdAfx.h"
#include "NewConnectionQueue.h"

CNewConnectionQueue::CNewConnectionQueue(void)
{
	m_semaphore.Create(0, 100000);
	m_maxQueue = 100;
}

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


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

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

/*!
	追加
*/
int CNewConnectionQueue::AddNewConnection(IClientConnectionPtr newConnection)
{
	SCOPE_LOCK();

	if(m_queue.GetSize() >= m_maxQueue)
		return(-1);
	m_queue.AddTail(newConnection);
	::ReleaseSemaphore(m_semaphore, 1, NULL);
	return(0);
}

/*!
	取得
*/
IClientConnectionPtr CNewConnectionQueue::GetNewConnection()
{
	SCOPE_LOCK();

	if(m_queue.GetSize() <= 0)
		return(IClientConnectionPtr());
	return(m_queue.RemoveHead());
}

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

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

	return(m_queue.GetSize());
}
