diff --git a/repos/base-hw/src/core/kernel/cpu.cc b/repos/base-hw/src/core/kernel/cpu.cc index 8c6790e22..21a568de0 100644 --- a/repos/base-hw/src/core/kernel/cpu.cc +++ b/repos/base-hw/src/core/kernel/cpu.cc @@ -116,7 +116,12 @@ Cpu::Idle_thread::Idle_thread(Cpu &cpu) void Cpu::schedule(Job * const job) { if (_id == executing_id()) { _scheduler.ready(job->share()); } - else if (_scheduler.ready_check(job->share())) { trigger_ip_interrupt(); } + else { + _scheduler.ready_check(job->share()); + if (_scheduler.need_to_schedule()) { + trigger_ip_interrupt(); + } + } } diff --git a/repos/base-hw/src/core/kernel/cpu_scheduler.cc b/repos/base-hw/src/core/kernel/cpu_scheduler.cc index e9ba295cd..cee5d60c7 100644 --- a/repos/base-hw/src/core/kernel/cpu_scheduler.cc +++ b/repos/base-hw/src/core/kernel/cpu_scheduler.cc @@ -153,14 +153,15 @@ void Cpu_scheduler::update(time_t time) } -bool Cpu_scheduler::ready_check(Share &s1) +void Cpu_scheduler::ready_check(Share &s1) { assert(_head); ready(s1); - if (_need_to_schedule) return _need_to_schedule; - + if (_need_to_schedule) { + return; + } Share * s2 = _head; if (!s1._claim) { _need_to_schedule = s2 == &_idle; @@ -178,7 +179,6 @@ bool Cpu_scheduler::ready_check(Share &s1) _need_to_schedule = !s2; } - return _need_to_schedule; } diff --git a/repos/base-hw/src/core/kernel/cpu_scheduler.h b/repos/base-hw/src/core/kernel/cpu_scheduler.h index e0b6dd079..8e9b18a35 100644 --- a/repos/base-hw/src/core/kernel/cpu_scheduler.h +++ b/repos/base-hw/src/core/kernel/cpu_scheduler.h @@ -177,7 +177,7 @@ class Kernel::Cpu_scheduler /** * Set 's1' ready and return wether this outdates current head */ - bool ready_check(Share &s1); + void ready_check(Share &s1); /** * Set share 's' ready diff --git a/repos/base-hw/src/test/cpu_scheduler/test.cc b/repos/base-hw/src/test/cpu_scheduler/test.cc index 1bdcd3a7c..460be1b53 100644 --- a/repos/base-hw/src/test/cpu_scheduler/test.cc +++ b/repos/base-hw/src/test/cpu_scheduler/test.cc @@ -119,9 +119,9 @@ void update_check(unsigned const l, unsigned const c, unsigned const t, void ready_check(unsigned const l, unsigned const s, bool const x) { - bool const y = data()->scheduler.ready_check(*share(s)); - if (y != x) { - Genode::log("wrong check result ", y, " in line ", l); + data()->scheduler.ready_check(*share(s)); + if (data()->scheduler.need_to_schedule() != x) { + Genode::log("wrong check result ", data()->scheduler.need_to_schedule(), " in line ", l); done(); } }