#include "HGMsgPumpImpl.hpp" 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.id = 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; }