#include "StdAfx.h"
#include "AcceptedSocketQueue.h"

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

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


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

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

/*!
	有効無効
*/
void CAcceptedSocketQueue::EnableQueue(int enable)
{
	SCOPE_LOCK();

	m_enable = enable;

	//	停止する
	if(!enable)
		Stop();
}


/*!
	追加
*/
int CAcceptedSocketQueue::AddNewConnection(CAcceptedSocket newConnection)
{
	SCOPE_LOCK();

	//	満タン or 無効
	if(m_queue.GetSize() >= m_maxQueue || !m_enable)
		return(-1);

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

	return(0);
}

/*!
	取得
*/
CAcceptedSocket CAcceptedSocketQueue::GetNewConnection()
{
	SCOPE_LOCK();

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

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

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

	return(m_queue.GetSize());
}
