120 lines
3.4 KiB
C++
120 lines
3.4 KiB
C++
#include "precompile.h"
|
|
|
|
#include <a8/timer.h>
|
|
|
|
#include "framework/cpp/msgqueue.h"
|
|
#include "app.h"
|
|
|
|
namespace f8
|
|
{
|
|
struct MsgQueueNode
|
|
{
|
|
struct list_head entry;
|
|
MsgHandleFunc func;
|
|
};
|
|
|
|
class MsgQueueImp
|
|
{
|
|
public:
|
|
int curr_im_msgid = 10000;
|
|
std::map<int, list_head> msg_handlers;
|
|
|
|
void ProcessMsg(int msgid, const a8::XParams& param)
|
|
{
|
|
auto itr = msg_handlers.find(msgid);
|
|
if (itr != msg_handlers.end()) {
|
|
list_head* head = &itr->second;
|
|
struct MsgQueueNode *node = nullptr;
|
|
struct MsgQueueNode *tmp = nullptr;
|
|
list_for_each_entry_safe(node, tmp, head, entry) {
|
|
node->func(param);
|
|
}
|
|
}
|
|
}
|
|
|
|
CallBackHandle RegisterCallBack(int msgid, MsgHandleFunc handle_func)
|
|
{
|
|
MsgQueueNode* node = new MsgQueueNode();
|
|
INIT_LIST_HEAD(&node->entry);
|
|
node->func = handle_func;
|
|
|
|
auto itr = msg_handlers.find(msgid);
|
|
if (itr == msg_handlers.end()) {
|
|
msg_handlers[msgid] = list_head();
|
|
itr = msg_handlers.find(msgid);
|
|
assert(itr != msg_handlers.end());
|
|
INIT_LIST_HEAD(&itr->second);
|
|
}
|
|
list_add_tail(&node->entry, &itr->second);
|
|
return &node->entry;
|
|
}
|
|
|
|
};
|
|
|
|
void MsgQueue::Init()
|
|
{
|
|
imp_ = new MsgQueueImp();
|
|
}
|
|
|
|
void MsgQueue::UnInit()
|
|
{
|
|
delete imp_;
|
|
imp_ = nullptr;
|
|
}
|
|
|
|
void MsgQueue::SendMsg(int msgid, a8::XParams param)
|
|
{
|
|
imp_->ProcessMsg(msgid, param);
|
|
}
|
|
|
|
void MsgQueue::PostMsg(int msgid, a8::XParams param)
|
|
{
|
|
param._sys_field = msgid;
|
|
a8::Timer::Instance()->AddDeadLineTimer(0, param,
|
|
[] (const a8::XParams& param)
|
|
{
|
|
MsgQueue::Instance()->imp_->ProcessMsg(param._sys_field, param);
|
|
});
|
|
}
|
|
|
|
void MsgQueue::AddDelayMsg(int msgid, a8::XParams param, int milli_seconds)
|
|
{
|
|
param._sys_field = msgid;
|
|
a8::Timer::Instance()->AddDeadLineTimer(milli_seconds, param,
|
|
[] (const a8::XParams& param)
|
|
{
|
|
MsgQueue::Instance()->imp_->ProcessMsg(param._sys_field, param);
|
|
});
|
|
}
|
|
|
|
void MsgQueue::RemoveCallBack(CallBackHandle handle)
|
|
{
|
|
list_head* head = handle;
|
|
MsgQueueNode* node = list_entry(head, struct MsgQueueNode, entry);
|
|
list_del_init(&node->entry);
|
|
delete node;
|
|
}
|
|
|
|
CallBackHandle MsgQueue::RegisterCallBack(int msgid, MsgHandleFunc handle_func)
|
|
{
|
|
return imp_->RegisterCallBack(msgid, handle_func);
|
|
}
|
|
|
|
int MsgQueue::AllocIMMsgId()
|
|
{
|
|
return ++imp_->curr_im_msgid;
|
|
}
|
|
|
|
void MsgQueue::ProcessMsg(int msgid, const a8::XParams& param)
|
|
{
|
|
imp_->ProcessMsg(msgid, param);
|
|
}
|
|
|
|
void MsgQueue::PostMsg_r(int msgid, a8::XParams param)
|
|
{
|
|
a8::XParams* p = new a8::XParams();
|
|
param.DeepCopy(*p);
|
|
App::Instance()->AddIMMsg(f8::IM_SysMsgQueue, a8::XParams().SetSender(msgid).SetParam1((void*)p));
|
|
}
|
|
}
|