/*!
	COverloadManager

	サーバの負荷の管理を行う
*/

#pragma once
#include "IServerTool.h"
#include "SyncObject.h"

/*!
	オーバーロードマネージャ外部インタフェース
*/
class IOverloadManager
{
public:
	virtual ~IOverloadManager(void)
	{
	}

	//!	動作状態を取得
	virtual int InOverloadMode() = 0;
};

//!	インターフェース定義
DEFINE_INTERFACE_NOWRAP(IOverloadManager);

/*!
	オーバーロードマネージャ
*/
class COverloadManager : public IOverloadManager
{
public:
	COverloadManager(void);
	~COverloadManager(void);

	/////////////////////////////////////////////////////////////////////////////////////
	//	サーバ負荷管理
	/////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	void Start(IServerToolPtr serverTool, int maxConnect, int overloadModeKeepTime);

	//!	停止
	void Stop() {};

	//!	最大接続数に到達？
	int InMaxThreads();

	//!	サーバ負荷を設定
	void UpdateServerload(int threadCount, int queueCount);

	//!	指定時間過ぎたか？
	int IsOver(DWORD old, DWORD cur, DWORD span);

	//!	動作状態を取得
	virtual int InOverloadMode() { return m_overload; };

	//!	インタフェースを取得
	IOverloadManagerPtr GetIOverloadManager() { return IOverloadManagerRet(this, FALSE); };

protected:
	/////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数 - サーバ負荷管理
	/////////////////////////////////////////////////////////////////////////////////////
	//!	クリティカルセクション
	CCriticalSection					m_scopeLock;

	//!	サーバツール
	IServerToolPtr						m_serverTool;

	//!	最大接続数
	int									m_maxConnect;

	//!	オーバーロードモード維持時間
	int									m_overloadModeKeepTime;
	
	//!	オーバーロードモード開始時間
	DWORD								m_overloadModeStartTime;

	//!	オーバーロードモード
	CInterlockCounter					m_overload;
};
