diff --git a/repos/base-hw/src/core/kernel/cpu_scheduler.cc b/repos/base-hw/src/core/kernel/cpu_scheduler.cc index 62184c2a4a..59b129c097 100644 --- a/repos/base-hw/src/core/kernel/cpu_scheduler.cc +++ b/repos/base-hw/src/core/kernel/cpu_scheduler.cc @@ -179,6 +179,13 @@ void Cpu_scheduler::update(time_t time) _head_filled(r); _consumed(duration); + + } else if (_head_was_removed) { + + _trim_consumption(duration); + _head_was_removed = false; + _head_yields = false; + _consumed(duration); } if (_claim_for_head()) @@ -258,8 +265,10 @@ void Cpu_scheduler::remove(Share &s) if (s._ready) unready(s); - if (&s == _head) + if (&s == _head) { _head = nullptr; + _head_was_removed = true; + } if (!s._quota) return; diff --git a/repos/base-hw/src/core/kernel/cpu_scheduler.h b/repos/base-hw/src/core/kernel/cpu_scheduler.h index 70e921f44c..944ba532f3 100644 --- a/repos/base-hw/src/core/kernel/cpu_scheduler.h +++ b/repos/base-hw/src/core/kernel/cpu_scheduler.h @@ -120,6 +120,7 @@ class Kernel::Cpu_scheduler unsigned _head_quota = 0; bool _head_claims = false; bool _head_yields = false; + bool _head_was_removed = false; unsigned const _quota; unsigned _residual; unsigned const _fill;