From 911bf2d68a4904d8ff838d31e00ef65d4e03063c Mon Sep 17 00:00:00 2001 From: Amlal Date: Wed, 30 Apr 2025 10:12:55 +0200 Subject: kernel, sched: worked on a pending ticket (process rebalancing) Signed-off-by: Amlal --- dev/kernel/src/UserProcessScheduler.cc | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'dev/kernel/src/UserProcessScheduler.cc') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 96938d10..4b206317 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -20,6 +20,8 @@ #include #include #include +#include "KernelKit/CoreProcessScheduler.h" +#include "NewKit/Defines.h" ///! BUGS: 0 @@ -424,6 +426,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im process.ProcessId = pid; process.Status = ProcessStatusKind::kStarting; process.PTime = (UIntPtr) AffinityKind::kStandard; + process.RTime = 0; (Void)(kout << "PID: " << number(process.ProcessId) << kendl); (Void)(kout << "Name: " << process.Name << kendl); @@ -510,13 +513,36 @@ SizeT UserProcessScheduler::Run() noexcept { process.StackFrame, process.ProcessId); if (!ret) { - if (process.Affinity == AffinityKind::kRealTime) continue; - kout << "The process: " << process.Name << ", is not valid! Crashing it...\r"; - process.Crash(); } } else { + if (process.ProcessId == this->CurrentProcess().Leak().ProcessId) { + if (process.PTime < process.RTime) { + if (process.RTime < (Int32) AffinityKind::kRealTime) + process.PTime = (Int32) AffinityKind::kVeryLowUsage; + else if (process.RTime < (Int32) AffinityKind::kVeryHigh) + process.PTime = (Int32) AffinityKind::kLowUsage; + else if (process.RTime < (Int32) AffinityKind::kHigh) + process.PTime = (Int32) AffinityKind::kStandard; + else if (process.RTime < (Int32) AffinityKind::kStandard) + process.PTime = (Int32) AffinityKind::kHigh; + + process.RTime = static_cast(process.Affinity); + + BOOL ret = UserProcessHelper::Switch(process.Image.Leak().Leak().Leak(), + &process.StackReserve[process.StackSize - 1], + process.StackFrame, process.ProcessId); + + if (!ret) { + kout << "The process: " << process.Name << ", is not valid! Crashing it...\r"; + process.Crash(); + } + } else { + ++process.RTime; + } + } + --process.PTime; } } -- cgit v1.2.3