#include "StdAfx.h"
#include "OverloadManager.h"

#define	CLASS_NAME	"OverloadManager"

COverloadManager::COverloadManager(void)
{
}

COverloadManager::~COverloadManager(void)
{
}

/*!
	初期化
*/
void COverloadManager::Start(IServerToolIIPtr serverTool, int maxConnect, int overloadModeKeepTime)
{
	m_serverTool = serverTool;
	m_maxConnect = maxConnect;
	m_overloadModeKeepTime = overloadModeKeepTime;
	m_overload = 0;

	//	エントリを生成しておく
	m_serverTool->SetServerStatusInt("ConnectionCount",			0, "現在の接続数");
	m_serverTool->SetServerStatusInt("ThreadCount",				0, "現在のスレッド数");
	m_serverTool->SetServerStatusInt("QueueingConnectionCount", 0, "現在の処理待ち接続数");
	m_serverTool->SetServerStatusInt("OverloadMode",			0, "オーバーロード");
}


/*!
	サーバ負荷を設定
*/
void COverloadManager::UpdateServerload(int threadCount, int queueCount)
{
	SCOPE_LOCK();

	//	現在の接続数
	int curConnectionCount = threadCount + queueCount;

	//	オーバーロード？
	if(curConnectionCount >= m_maxConnect)
	{
		//	オーバーロード中
		if(!m_overload)
			m_serverTool->WriteSystemLog(CLASS_NAME, SERVER_STATUS_NORMAL_LOG, "オーバーロードモードへ移行しました", 1 * 60 * 60 * 1000);

		m_overloadModeStartTime = GetTickCount();
		m_overload = TRUE;
	}
	else
	{
		//	オーバーロード解除？
		if(m_overload && IsOver(m_overloadModeStartTime, GetTickCount(), m_overloadModeKeepTime))
			m_overload = FALSE;
	}

	//	情報更新
	m_serverTool->SetServerStatusInt("ConnectionCount",			curConnectionCount);
	m_serverTool->SetServerStatusInt("ThreadCount",				threadCount);
	m_serverTool->SetServerStatusInt("QueueingConnectionCount", queueCount);
	m_serverTool->SetServerStatusInt("OverloadMode",			m_overload);
}

/*!
	指定時間過ぎたか？
*/
int COverloadManager::IsOver(DWORD old, DWORD cur, DWORD span)
{
	//	48日過ぎた？
	if(old > cur)
		return(TRUE);

	//	経過
	if(old + span < cur)
		return(TRUE);

	return(FALSE);
}

