错误代码
重试策略:一次延迟1s,最长30s直至事件成功。
int try_count = 0;
//do something
if(not success)
m_loop->setTimerInLoop((try_count >= 30 ? 30: ++try_count) *1000 , cb, INFINITE, 0x100);
表现现象
cpu 爆了
内存爆了
总结原因
hv内部代码bug,虽然timerid
相同但依旧会再次创建htimer_t
,上一次的htimer_t
并未释放和删除。所以会累积越来越多的定时器,导致cpu和内存都爆了。
代码修复(设置之前killTimer)
TimerID setTimer(int timeout_ms, TimerCallback cb, uint32_t repeat = INFINITE, TimerID timerID = INVALID_TIMER_ID) {
assertInLoopThread();
if (loop_ == NULL) return INVALID_TIMER_ID;
htimer_t* htimer = htimer_add(loop_, onTimer, timeout_ms, repeat);
assert(htimer != NULL);
if (timerID == INVALID_TIMER_ID) {
timerID = generateTimerID();
}
hevent_set_id(htimer, timerID);
hevent_set_userdata(htimer, this);
//在设置timerid之前,删除当前定时器(即使不存在也没关系)
killTimer(timerID);
timers[timerID] = std::make_shared<Timer>(htimer, cb, repeat);
return timerID;
}
代码分析
此时将会导致连个问题:
htimer_t对象内存泄露 内存 boom
定时器未释放,导致定时器积累月累越多,cpu boom