Example #1
0
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);
}
Example #2
0
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();
    }
}