/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  GetMessage
 *  Description:  以阻塞的方式从消息队列中取出一条消息
 * =====================================================================================
 */
CMessage * CUsrDefMsgQueue::GetMessage()
{
	CStatus s = m_Event.Wait();
	if( !s.IsSuccess() )
	{
		throw s;
	}
	
	return Pop();
}
CThreadForMsgLoop:: ~CThreadForMsgLoop()
{
	if(m_bWaitForDeath && m_pThread != 0)
	{
		CStatus s = m_pThread->WaitForDeath();
		if(!s.IsSuccess())
		{
			throw s;
		}
	}
}
/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  Push
 *  Description:  以互斥的方式向消息队列中插入一条消息
 * =====================================================================================
 */
CStatus CUsrDefMsgQueue::Push(CMessage * pMsg)
{
	CEnterCriticalSection ecs(&m_Mutex);	
	if( IsFull() )
	{
		CStatus s = EnlargeQueue();
		if(!s.IsSuccess())
			return CStatus(-1,0,"failed to Enlarge the queue!");
	}

	m_pQueueSpace[m_iQueueTail] = pMsg;
	m_iQueueTail = (m_iQueueTail + 1) % m_iTotalRoom;

	return CStatus(0,0);
}