Files
mir_server/server/LogicServer/AsyncWorker.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

144 lines
2.5 KiB
C++

#include "StdAfx.h"
#include "AsyncWorker.h"
#include "BufferAllocator.h"
AsyncWorker::AsyncWorker(const char* lua_file)
: Inherited()
, m_WorkCallBack(NULL)
, m_isReload(false)
, m_Id(0)
{
m_CallBackDataList.setLock(&m_Lock);
LoadScript(lua_file);
_asncpyt(m_sLuaFilePath, lua_file);
}
AsyncWorker::~AsyncWorker()
{
m_CallBackDataList.flush();
int count = m_CallBackDataList.count();
for (int i = 0; i < count; ++i)
{
CBData* cb = m_CallBackDataList[i];
if (!cb) continue;
if (cb->params_ && cb->free_func_)
{
cb->free_func_(cb);
}
m_Alloc.FreeBuffer(cb);
}
m_CallBackDataList.clear();
}
int AsyncWorker::Run()
{
if (m_isReload)
{
m_isReload = false;
LoadScript(m_sLuaFilePath);
}
if (m_CallBackDataList.appendCount() <= 0) return 0;
m_CallBackDataList.flush();
int count = m_CallBackDataList.count();
for (int i = 0; i < count; ++i)
{
CBData* cb = m_CallBackDataList[i];
cb->work_func_(cb);
this->m_WorkCallBack(cb);
}
m_CallBackDataList.clear();
return count;
}
void AsyncWorker::OnRountine()
{
OnStart();
while (!terminated())
{
if (Run() <= 0)
Sleep(1);
}
OnStop();
}
void AsyncWorker::OnStart()
{
OutputMsg(rmError, "AsyncWorker start!");
}
void AsyncWorker::OnStop()
{
OutputMsg(rmError, "AsyncWorker stop!");
}
void AsyncWorker::AppendWork(CBData* cb)
{
m_CallBackDataList.append(cb);
}
void AsyncWorker::LoadScript(const char* lua_file)
{
if (lua_file)
{
if (!m_Script.LoadScript(lua_file))
{
OutputMsg(rmError, "load AsyncWorker script fail!!!file:%s", lua_file);
}
}
}
unsigned int AsyncWorker::SendLuaMessage(CScriptValueList& req, WordFunc func)
{
m_Id++;
if (m_Id == 0) m_Id++;
CBData* cb = (CBData*)m_Alloc.AllocBuffer(sizeof(*cb));
new(cb)CBData(this, m_Id);
cb->worker_ = this;
cb->work_func_ = &AsyncWorker::ExecuteLua;
cb->after_func_ = func;
cb->free_func_ = &AsyncWorker::FreeLuaParams;
cb->params_ = m_Alloc.AllocBuffer(sizeof(LuaParams));
new(cb->params_)LuaParams();
LuaParams* p = (LuaParams*)cb->params_;
p->req_ = req;
p->result_ << cb->guid_;
AppendWork(cb);
return cb->guid_;
}
void AsyncWorker::FreeLuaParams(void* callback)
{
CBData* cb = (CBData*)callback;
if (cb->params_)
{
((LuaParams*)cb->params_)->~LuaParams();
cb->worker_->GetAlloc().FreeBuffer(cb->params_);
cb->params_ = NULL;
}
}
void AsyncWorker::ExecuteLua(void* cb)
{
CBData* c = (CBData*)cb;
LuaParams* p = (LuaParams*)c->params_;
c->worker_->m_Script.Call("main", p->req_, p->result_);
}