From bfb96536da9d4eb61b75b60f1f403b4288ac5473 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Tue, 20 Mar 2018 18:54:55 +0100 Subject: [PATCH] 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 #2704 --- repos/os/include/timer/timeout.h | 4 ++-- repos/os/src/lib/timeout/timeout.cc | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/repos/os/include/timer/timeout.h b/repos/os/include/timer/timeout.h index 98ebdd2dc..41f9ccf23 100644 --- a/repos/os/include/timer/timeout.h +++ b/repos/os/include/timer/timeout.h @@ -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); diff --git a/repos/os/src/lib/timeout/timeout.cc b/repos/os/src/lib/timeout/timeout.cc index 572f78048..be6c7dff3 100644 --- a/repos/os/src/lib/timeout/timeout.cc +++ b/repos/os/src/lib/timeout/timeout.cc @@ -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); }