Example #1
0
long long CoTimerMgr::GetExpired(std::list<CoTimerPtr> &result, uint32_t n)
{
    if (system_deadlines_.empty() && steady_deadlines_.empty())
        return std::numeric_limits<long long>::max();

    std::unique_lock<LFLock> lock(lock_, std::defer_lock);
    if (!lock.try_lock()) return GetNextTriggerTime();

    {
        SystemTimePoint now = SystemNow();
        auto it = system_deadlines_.begin();
        for (; it != system_deadlines_.end() && n > 0; --n, ++it)
        {
            if (it->first > now) {
                break;
            }

            it->second->token_state_ = CoTimer::e_token_state::none;
            result.push_back(it->second);
        }
        if (it != system_deadlines_.end())
            SetNextTriggerTime(it->first);
        else
            system_next_trigger_time_ = std::numeric_limits<long long>::max();
        system_deadlines_.erase(system_deadlines_.begin(), it);
    }

    {
        SteadyTimePoint now = SteadyNow();
        auto it = steady_deadlines_.begin();
        for (; it != steady_deadlines_.end() && n > 0; --n, ++it)
        {
            if (it->first > now) {
                break;
            }

            it->second->token_state_ = CoTimer::e_token_state::none;
            result.push_back(it->second);
        }
        if (it != steady_deadlines_.end())
            SetNextTriggerTime(it->first);
        else
            steady_next_trigger_time_ = std::numeric_limits<long long>::max();
        steady_deadlines_.erase(steady_deadlines_.begin(), it);
    }

    return GetNextTriggerTime();
}
Example #2
0
long long CoTimerMgr::GetExpired(std::list<CoTimerPtr> &result, uint32_t n)
{
    std::unique_lock<LFLock> lock(lock_, std::defer_lock);
    if (!lock.try_lock()) return GetNextTriggerTime();

    TimePoint now = Now();
    auto it = deadlines_.begin();
    for (; it != deadlines_.end() && n > 0; --n, ++it)
    {
        if (it->first > now) {
            break;
        }

        result.push_back(it->second);
    }

    if (it != deadlines_.end()) {
        // 还有timer需要触发
        TimePoint const& next_tp = it->first;
        SetNextTriggerTime(next_tp);
    } else
        next_trigger_time_ = std::numeric_limits<long>::max();

    deadlines_.erase(deadlines_.begin(), it);
    return GetNextTriggerTime();
}
Example #3
0
CoTimerPtr CoTimerMgr::ExpireAt(TimePoint const& time_point, CoTimer::fn_t const& fn)
{
    std::unique_lock<LFLock> lock(lock_);
    CoTimerPtr sptr(new CoTimer(fn));
    sptr->next_time_point_ = time_point;
    if (deadlines_.empty())
        SetNextTriggerTime(time_point);
    deadlines_.insert(std::make_pair(time_point, sptr));
    return sptr;
}
Example #4
0
CoTimerPtr CoTimerMgr::ExpireAt(SteadyTimePoint const& time_point,
        CoTimer::fn_t const& fn)
{
    std::unique_lock<LFLock> lock(lock_);
    CoTimerPtr sptr(new CoTimer(fn));
    if (system_deadlines_.empty() && steady_deadlines_.empty())
        SetNextTriggerTime(time_point);
    sptr->token_state_ = CoTimer::e_token_state::steady;
    sptr->steady_token_ = steady_deadlines_.insert(std::make_pair(time_point, sptr));
    return sptr;
}