llbc icon indicating copy to clipboard operation
llbc copied to clipboard

【llbc】整体简化llbc内部使用Task的逻辑

Open lailongwei opened this issue 1 year ago • 1 comments

lailongwei avatar Apr 04 '23 05:04 lailongwei

LLBC_ThreadMgr/LLBC_Task重构后,内部使用LLBC_Task的地方并未跟随调整&简化,已有的内部使用逻辑:

  • LLBC_LogRunnable:日志线程
  • LLBC_XXXPoller:网络线程
  • LLBC_PollerMonitor:网络辅助线程

需要作以下简化&bug fix:

  • 简化:所有的Stop()逻辑可统一简化成如下:
void XXX::Stop()
{
    stopping_ = true; // 设置标记为, Svc()方法内部将跳出loop
    Wait(); // 等待Task结束即可, 不再需要每个Task子类做独立且重复的_started标记位
}
  • Bug Fix:部分Task子类的Actative()跟Wait()调用线程不是同一个问题,需要统一解决,主要是在网络线程内部

  • LogRunnable支持任意线程Stop:在App-Crash后,signal handler线程不一定是初始化LoggerMgr的线程,所以需要进行特殊处理,代码如下:

void LLBC_LogRunnable::Stop()
{
    LLBC_ReturnIf(GetTaskState() == LLBC_TaskState::NotActivated, void());

    // Mask stopping and waiting for thread stopped.
    _stopping = true;
    LLBC_ReturnIf(Wait() == LLBC_OK, void());

    // If Wait() call failed, maybe call LogRunnable::Stop() in difference thread(eg: in crash hook),
    // in this case, force waiting for LogRunnable thread stopped.
    while (GetTaskState() != LLBC_TaskState::NotActivated)
        LLBC_Sleep(10);
}

lailongwei avatar Apr 04 '23 05:04 lailongwei