#include"CStorageCore.h"
#include"../../Auxiliary/Debug/CAssert.h"
#include"../../Auxiliary/Debug/CWarning.h"


//	ストレージスレッド側で呼ばれる関数

namespace Maid
{
unt CStorageCore::ThreadFunction( volatile CThreadController::BRIGEDATA& brige )
{
	while( true )
	{
		if( brige.IsExit ) { break; }

		POSTMESSAGEQUE Mess;
		{	//	とりあえず溜まっているメッセージを拾う
			CThreadMutexLocker Lock(m_MessageMutex);
			Mess = m_MessageQue;
			m_MessageQue.clear();
		}

		//	メッセージを順番に処理
		for( int i=0; i<(int)Mess.size(); ++i )
		{
			POSTMESSAGE& mess = Mess[i];
			RETURNCODE&  ret  = m_ReturnCode[mess.ReturnCodeID];

			if( mess.FunctionNo==POSTMESSAGE::CANCEL )
			{	//	キャンセルなら戻り値を破棄
				ret.State = RETURNCODE::STATE_NONE;
			}else
			{	//	そうでないなら実行

				CThreadMutexLocker Lock(m_FunctionMutex);	//	わざわざとる必要なさそうだけど一応
			
				FUNCTIONMAP::iterator ite = m_FunctionMap.find(mess.FunctionNo);

				MAID_ASSERT( ite==m_FunctionMap.end(), "関数がありません" );

				ret.pMess = ite->second( mess.FileName,mess.pParam );
				ret.State = RETURNCODE::STATE_LOADEND;
			}
		}

		//	一仕事終わったのでしばし休憩
		CThreadController::Sleep( 1 );
	}

	return 0;
}


}

