void ExpiryTimerImpl::run() { auto hasTaskOrStop = [this](){ return !m_tasks.empty() || m_stop; }; std::unique_lock< std::mutex > lock{ m_mutex }; while(!m_stop) { m_cond.wait(lock, hasTaskOrStop); if (m_stop) break; m_cond.wait_for(lock, remainingTimeForNext()); executeExpired(); } }
TreeNodeStatus ITimedNode::execute(const AIPtr& entity, long deltaMillis) { const TreeNodeStatus result = TreeNode::execute(entity, deltaMillis); if (result == CANNOTEXECUTE) return CANNOTEXECUTE; if (_timerMillis == NOTSTARTED) { _timerMillis = _millis; const TreeNodeStatus status = executeStart(entity, deltaMillis); if (status == FINISHED) _timerMillis = NOTSTARTED; return state(entity, status); } if (_timerMillis - deltaMillis > 0) { _timerMillis -= deltaMillis; const TreeNodeStatus status = executeRunning(entity, deltaMillis); if (status == FINISHED) _timerMillis = NOTSTARTED; return state(entity, status); } _timerMillis = NOTSTARTED; return state(entity, executeExpired(entity, deltaMillis)); }