mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-06 01:11:46 +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())
|
if (!_schedule_slack())
|
||||||
_set_current(_idle, _slack_quota);
|
_set_current(_idle, _slack_quota);
|
||||||
|
|
||||||
_timer.set_timeout(&_timeout,
|
_timer.set_timeout(_timeout,
|
||||||
Genode::min(_current_quantum, _super_period_left));
|
Genode::min(_current_quantum, _super_period_left));
|
||||||
_timer.schedule_timeout();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -507,7 +507,7 @@ void Thread::_call_timeout()
|
|||||||
{
|
{
|
||||||
Timer & t = _cpu().timer();
|
Timer & t = _cpu().timer();
|
||||||
_timeout_sigid = (Kernel::capid_t)user_arg_2();
|
_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
|
* Remove timeout if it is already in use. Timeouts may get overridden as
|
||||||
* result of an update.
|
* result of an update.
|
||||||
*/
|
*/
|
||||||
if (timeout->_listed)
|
if (timeout._listed)
|
||||||
_timeout_list.remove(timeout);
|
_timeout_list.remove(&timeout);
|
||||||
else
|
else
|
||||||
timeout->_listed = true;
|
timeout._listed = true;
|
||||||
|
|
||||||
/* set timeout parameters */
|
/* set timeout parameters */
|
||||||
timeout->_end = time() + duration;
|
timeout._end = time() + duration;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Insert timeout. Timeouts are ordered ascending according to their end
|
* 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;
|
Timeout * t1 = 0;
|
||||||
for (Timeout * t2 = _timeout_list.first();
|
for (Timeout * t2 = _timeout_list.first();
|
||||||
t2 && t2->_end < timeout->_end;
|
t2 && t2->_end < timeout._end;
|
||||||
t1 = t2, t2 = t2->next()) { }
|
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 */
|
/* get the timeout with the nearest end time */
|
||||||
Timeout * timeout = _timeout_list.first();
|
Timeout * timeout = _timeout_list.first();
|
||||||
assert(timeout);
|
time_t end = timeout ? timeout->_end : _time + _max_value();
|
||||||
|
|
||||||
/* install timeout at timer hardware */
|
/* install timeout at timer hardware */
|
||||||
time_t duration = _duration();
|
_time += _duration();
|
||||||
_time += duration;
|
_last_timeout_duration = (end > _time) ? end - _time : 1;
|
||||||
_last_timeout_duration = (timeout->_end > _time) ? timeout->_end - _time : 1;
|
|
||||||
_start_one_shot(_last_timeout_duration);
|
_start_one_shot(_last_timeout_duration);
|
||||||
|
|
||||||
return duration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -97,6 +97,9 @@ void Timer::_process_timeouts()
|
|||||||
timeout->_listed = false;
|
timeout->_listed = false;
|
||||||
timeout->timeout_triggered();
|
timeout->timeout_triggered();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_timeout_list.first())
|
||||||
|
_schedule_timeout();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -90,16 +90,13 @@ class Kernel::Timer
|
|||||||
|
|
||||||
void _process_timeouts();
|
void _process_timeouts();
|
||||||
|
|
||||||
|
void _schedule_timeout();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Timer(Cpu & cpu);
|
Timer(Cpu & cpu);
|
||||||
|
|
||||||
/**
|
void set_timeout(Timeout &timeout, time_t const duration);
|
||||||
* Return duration from last call of this function
|
|
||||||
*/
|
|
||||||
time_t schedule_timeout();
|
|
||||||
|
|
||||||
void set_timeout(Timeout * const timeout, time_t const duration);
|
|
||||||
|
|
||||||
time_t us_to_ticks(time_t const us) const;
|
time_t us_to_ticks(time_t const us) const;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user