2022-05-24 02:01:36 +00:00
|
|
|
|
#include "HGMsgPumpImpl.hpp"
|
2022-05-21 10:09:34 +00:00
|
|
|
|
|
|
|
|
|
HGMsgPumpImpl::HGMsgPumpImpl()
|
|
|
|
|
{
|
|
|
|
|
HGBase_CreateEvent(HGTRUE, HGFALSE, &m_msgEvent);
|
|
|
|
|
HGBase_CreateLock(&m_msgLock);
|
|
|
|
|
m_bRecvMsg = HGTRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGMsgPumpImpl::~HGMsgPumpImpl()
|
|
|
|
|
{
|
|
|
|
|
HGBase_DestroyLock(m_msgLock);
|
|
|
|
|
m_msgLock = NULL;
|
|
|
|
|
HGBase_DestroyEvent(m_msgEvent);
|
|
|
|
|
m_msgEvent = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGResult HGMsgPumpImpl::Run(HGMsgPumpFunc func, HGPointer param)
|
|
|
|
|
{
|
|
|
|
|
if (NULL == func)
|
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_INVALIDARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
|
{
|
|
|
|
|
HGBase_WaitEvent(m_msgEvent);
|
|
|
|
|
|
|
|
|
|
HGMsg msg = { 0 };
|
|
|
|
|
bool getMsg = false;
|
|
|
|
|
|
|
|
|
|
HGBase_EnterLock(m_msgLock);
|
|
|
|
|
if (!m_listMsg.empty())
|
|
|
|
|
{
|
|
|
|
|
msg = m_listMsg.front();
|
|
|
|
|
m_listMsg.pop_front();
|
|
|
|
|
getMsg = true;
|
|
|
|
|
}
|
|
|
|
|
if (m_listMsg.empty())
|
|
|
|
|
{
|
|
|
|
|
HGBase_ResetEvent(m_msgEvent);
|
|
|
|
|
}
|
|
|
|
|
HGBase_LeaveLock(m_msgLock);
|
|
|
|
|
|
|
|
|
|
if (!getMsg)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (0 == msg.id)
|
|
|
|
|
{
|
|
|
|
|
assert(NULL == msg.data);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
func((HGMsgPump)this, &msg, param);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return HGBASE_ERR_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGResult HGMsgPumpImpl::PostMessage(const HGMsg* msg)
|
|
|
|
|
{
|
|
|
|
|
if (NULL == msg || 0 == msg->id)
|
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_INVALIDARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGResult ret = HGBASE_ERR_FAIL;
|
|
|
|
|
HGBase_EnterLock(m_msgLock);
|
|
|
|
|
if (m_bRecvMsg)
|
|
|
|
|
{
|
|
|
|
|
m_listMsg.push_back(*msg);
|
|
|
|
|
HGBase_SetEvent(m_msgEvent);
|
|
|
|
|
ret = HGBASE_ERR_OK;
|
|
|
|
|
}
|
|
|
|
|
HGBase_LeaveLock(m_msgLock);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGResult HGMsgPumpImpl::Exit()
|
|
|
|
|
{
|
|
|
|
|
HGMsg msg;
|
|
|
|
|
msg.data = 0;
|
|
|
|
|
msg.data = NULL;
|
|
|
|
|
|
|
|
|
|
HGResult ret = HGBASE_ERR_FAIL;
|
|
|
|
|
HGBase_EnterLock(m_msgLock);
|
|
|
|
|
if (m_bRecvMsg)
|
|
|
|
|
{
|
|
|
|
|
m_listMsg.push_back(msg);
|
|
|
|
|
HGBase_SetEvent(m_msgEvent);
|
|
|
|
|
m_bRecvMsg = HGFALSE;
|
|
|
|
|
ret = HGBASE_ERR_OK;
|
|
|
|
|
}
|
|
|
|
|
HGBase_LeaveLock(m_msgLock);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|