mirror of
https://github.com/genodelabs/genode.git
synced 2025-03-26 21:59:11 +00:00
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
This commit is contained in:
parent
38dbd59d8a
commit
bfb96536da
repos/os
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user