Exemple #1
0
void Repeater::trigger(std::list<Repetition>::iterator rep, Clock::time_point invocation)
{
    Repetition& repetition = *rep;
    DataRequest& request = access_request(repetition.m_request);
    assert(request.repetition);

    // reduce remaining interval by one step and occurred triggering delay
    decrement_by_one(*request.repetition);
    auto delayed = m_runtime.now() - invocation;
    request.repetition->maximum -= units::clock_cast(delayed);

    // reset repetition data if this is the last repetition
    if (!has_further_repetition(request)) {
        request.repetition.reset();
    }

    m_repeat_fn(repetition.m_request, std::move(repetition.m_payload));
    m_repetitions.erase(rep);
}
Exemple #2
0
void Repeater::trigger(Timestamp now)
{
    while (!m_repetitions.empty() && m_repetitions.top().m_next <= now) {
        // This cast is safe because element is removed afterwards anyway
        Repetition& repetition = const_cast<Repetition&>(m_repetitions.top());
        if (m_repeat_fn) {
            DataRequest& request = access_request(repetition.m_request);
            assert(request.repetition);

            // reduce remaining interval by one step and occurred triggering delay
            decrement_by_one(*request.repetition);
            Timestamp::duration_type delayed = now - repetition.m_next;
            request.repetition->maximum -= units::Duration(delayed);

            // reset repetition data if this is the last repetition
            if (!has_further_repetition(request)) {
                request.repetition.reset();
            }
            m_repeat_fn(repetition.m_request, std::move(repetition.m_payload));
        }
        m_repetitions.pop();
    }
}