timeout: _setup_alarm calculates deadline itself

Instead of taking the absolute deadline of a timeout as argument from
outside (where it is calculated with a freshly requested now time), we
now take a relative duration as argument and calculate the deadline with
the scheduler-internal now time (which can be a little bit outdated).
This enables us to schedule timeouts without updating the internal now time
and thereby handle all pending timeouts.

Issue 
This commit is contained in:
Martin Stein 2018-03-20 18:54:55 +01:00 committed by Christian Helmuth
parent 38dbd59d8a
commit bfb96536da
2 changed files with 8 additions and 8 deletions
repos/os
include/timer
src/lib/timeout

@ -251,7 +251,7 @@ class Genode::Alarm_timeout_scheduler : private Noncopyable,
Alarm *_alarm_get_pending_alarm();
void _alarm_setup_alarm(Alarm &alarm, Alarm::Time period, Alarm::Time deadline);
void _alarm_setup_alarm(Alarm &alarm, Alarm::Time period, Alarm::Time first_duration);
void _enable();
@ -275,7 +275,7 @@ class Genode::Alarm_timeout_scheduler : private Noncopyable,
void _alarm_discard(Alarm *alarm);
void _alarm_schedule_absolute(Alarm *alarm, Alarm::Time timeout);
void _alarm_schedule_absolute(Alarm *alarm, Alarm::Time duration);
void _alarm_schedule(Alarm *alarm, Alarm::Time period);

@ -143,8 +143,7 @@ void Alarm_timeout_scheduler::_schedule_one_shot(Timeout &timeout,
/* ensure that the schedulers time is up-to-date before adding a timeout */
_alarm_handle(curr_time_us);
_alarm_schedule_absolute(&timeout._alarm,
curr_time_us + duration.value);
_alarm_schedule_absolute(&timeout._alarm, duration.value);
if (_alarm_head_timeout(&timeout._alarm)) {
_time_source.schedule_timeout(Microseconds(0), *this); }
@ -325,7 +324,7 @@ void Alarm_timeout_scheduler::_alarm_handle(Alarm::Time curr_time)
}
void Alarm_timeout_scheduler::_alarm_setup_alarm(Alarm &alarm, Alarm::Time period, Alarm::Time deadline)
void Alarm_timeout_scheduler::_alarm_setup_alarm(Alarm &alarm, Alarm::Time period, Alarm::Time first_duration)
{
/*
* If the alarm is already present in the queue, re-consider its queue
@ -335,17 +334,18 @@ void Alarm_timeout_scheduler::_alarm_setup_alarm(Alarm &alarm, Alarm::Time perio
if (alarm._active)
_alarm_unsynchronized_dequeue(&alarm);
Alarm::Time deadline = _now + first_duration;
alarm._alarm_assign(period, deadline, _now > deadline ? !_now_period : _now_period, this);
_alarm_unsynchronized_enqueue(&alarm);
}
void Alarm_timeout_scheduler::_alarm_schedule_absolute(Alarm *alarm, Alarm::Time timeout)
void Alarm_timeout_scheduler::_alarm_schedule_absolute(Alarm *alarm, Alarm::Time duration)
{
Lock::Guard alarm_list_lock_guard(_lock);
_alarm_setup_alarm(*alarm, 0, timeout);
_alarm_setup_alarm(*alarm, 0, duration);
}
@ -365,7 +365,7 @@ void Alarm_timeout_scheduler::_alarm_schedule(Alarm *alarm, Alarm::Time period)
}
/* first deadline is overdue */
_alarm_setup_alarm(*alarm, period, _now);
_alarm_setup_alarm(*alarm, period, 0);
}