mirror of
https://github.com/genodelabs/genode.git
synced 2025-05-29 13:44:26 +00:00
fixup "hw: sanitize scheduler, cpu, and timer interplay" (timer)
This commit is contained in:
parent
ef7c0c9fb1
commit
8cc24e048e
@ -186,10 +186,8 @@ void Scheduler::update()
|
||||
if (!_schedule_slack())
|
||||
_set_current(_idle, _slack_quota);
|
||||
|
||||
_timer.set_timeout(&_timeout,
|
||||
_timer.set_timeout(_timeout,
|
||||
Genode::min(_current_quantum, _super_period_left));
|
||||
_timer.schedule_timeout();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -507,7 +507,7 @@ void Thread::_call_timeout()
|
||||
{
|
||||
Timer & t = _cpu().timer();
|
||||
_timeout_sigid = (Kernel::capid_t)user_arg_2();
|
||||
t.set_timeout(this, t.us_to_ticks(user_arg_1()));
|
||||
t.set_timeout(*this, t.us_to_ticks(user_arg_1()));
|
||||
}
|
||||
|
||||
|
||||
|
@ -36,19 +36,19 @@ time_t Timer::timeout_max_us() const
|
||||
}
|
||||
|
||||
|
||||
void Timer::set_timeout(Timeout * const timeout, time_t const duration)
|
||||
void Timer::set_timeout(Timeout &timeout, time_t const duration)
|
||||
{
|
||||
/*
|
||||
* Remove timeout if it is already in use. Timeouts may get overridden as
|
||||
* result of an update.
|
||||
*/
|
||||
if (timeout->_listed)
|
||||
_timeout_list.remove(timeout);
|
||||
if (timeout._listed)
|
||||
_timeout_list.remove(&timeout);
|
||||
else
|
||||
timeout->_listed = true;
|
||||
timeout._listed = true;
|
||||
|
||||
/* set timeout parameters */
|
||||
timeout->_end = time() + duration;
|
||||
timeout._end = time() + duration;
|
||||
|
||||
/*
|
||||
* Insert timeout. Timeouts are ordered ascending according to their end
|
||||
@ -56,26 +56,26 @@ void Timer::set_timeout(Timeout * const timeout, time_t const duration)
|
||||
*/
|
||||
Timeout * t1 = 0;
|
||||
for (Timeout * t2 = _timeout_list.first();
|
||||
t2 && t2->_end < timeout->_end;
|
||||
t2 && t2->_end < timeout._end;
|
||||
t1 = t2, t2 = t2->next()) { }
|
||||
|
||||
_timeout_list.insert(timeout, t1);
|
||||
_timeout_list.insert(&timeout, t1);
|
||||
|
||||
if (_timeout_list.first() == &timeout)
|
||||
_schedule_timeout();
|
||||
}
|
||||
|
||||
|
||||
time_t Timer::schedule_timeout()
|
||||
void Timer::_schedule_timeout()
|
||||
{
|
||||
/* get the timeout with the nearest end time */
|
||||
Timeout * timeout = _timeout_list.first();
|
||||
assert(timeout);
|
||||
time_t end = timeout ? timeout->_end : _time + _max_value();
|
||||
|
||||
/* install timeout at timer hardware */
|
||||
time_t duration = _duration();
|
||||
_time += duration;
|
||||
_last_timeout_duration = (timeout->_end > _time) ? timeout->_end - _time : 1;
|
||||
_time += _duration();
|
||||
_last_timeout_duration = (end > _time) ? end - _time : 1;
|
||||
_start_one_shot(_last_timeout_duration);
|
||||
|
||||
return duration;
|
||||
}
|
||||
|
||||
|
||||
@ -97,6 +97,9 @@ void Timer::_process_timeouts()
|
||||
timeout->_listed = false;
|
||||
timeout->timeout_triggered();
|
||||
}
|
||||
|
||||
if (_timeout_list.first())
|
||||
_schedule_timeout();
|
||||
}
|
||||
|
||||
|
||||
|
@ -90,16 +90,13 @@ class Kernel::Timer
|
||||
|
||||
void _process_timeouts();
|
||||
|
||||
void _schedule_timeout();
|
||||
|
||||
public:
|
||||
|
||||
Timer(Cpu & cpu);
|
||||
|
||||
/**
|
||||
* Return duration from last call of this function
|
||||
*/
|
||||
time_t schedule_timeout();
|
||||
|
||||
void set_timeout(Timeout * const timeout, time_t const duration);
|
||||
void set_timeout(Timeout &timeout, time_t const duration);
|
||||
|
||||
time_t us_to_ticks(time_t const us) const;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user