void timer_manager_t::register_timer(uint32_t interval_, const time_event_callback_t& callback_, bool persist_, time_t start_time_ ) { CHECK_LOCK(m_is_lock, m_mutex); time_t local_start_time = start_time_; if (!local_start_time) { local_start_time = get_cached_time_i().tv_sec; } time_event_t* time_event = new time_event_t( local_start_time, interval_, 0, local_start_time + interval_, callback_, persist_ ); if (NULL == time_event) { LOGWARN((TIMER_MANAGER_MODULE, "timer_manager_t::register_timer new time_event_t failed")); return; } //! yunjie: 这里不需要加锁, m_time_heap被初始化为线程安全的 register_timer_i(time_event); }
void timer_manager_t::exec() { CHECK_LOCK(m_is_lock, m_mutex); if (!m_inited) { LOGWARN((TIMER_MANAGER_MODULE, "timer_manager_t::exec timer manager has not been inited.")); return; } time_t now = get_cached_time_i().tv_sec; timer_container_t::container_t tasks; uint32_t all_task_num = 0; //! yunjie: 用于在fetch_task过程中检测time event是否满足执行条件 struct timer_container_t::cond_checker_t checker(time_event_fetch_condition, (void*)&now, FETCH_BREAK); //! yunjie: 一次性抓取足够的需要被执行的time事件. m_time_heap.fetch_task(tasks, all_task_num, 0xffffffff, &checker); while (!tasks.empty()) { struct time_event_t* event = tasks.top(); event->exec(); if (event->persist) { event->last_exec_time = now; event->timestamp = now + event->interval; //! yunjie: 这时注册的event在该loop中将不会被检测. register_timer_i(event); } else { //! yunjie: release会对内部的async_method_t进行内存释放, 不是persist事件才能调用 event->release(); SAFE_DELETE(event); } tasks.pop(); } }