From c08af30448618c5d1950dc1fa0fb1685782e7b22 Mon Sep 17 00:00:00 2001 From: Amlal Date: Tue, 29 Oct 2024 07:11:56 +0100 Subject: FIX: Fix scheduler crash (1/2) - UserProcessScheduler has been improved and cleaned up. - Same goes for the HardwareThreadScheduler Signed-off-by: Amlal --- dev/ZKAKit/src/UserProcessScheduler.cc | 50 ++++++---------------------------- 1 file changed, 8 insertions(+), 42 deletions(-) (limited to 'dev/ZKAKit/src/UserProcessScheduler.cc') diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc index 249033a2..280a006b 100644 --- a/dev/ZKAKit/src/UserProcessScheduler.cc +++ b/dev/ZKAKit/src/UserProcessScheduler.cc @@ -12,10 +12,10 @@ /// @brief User process scheduler. /***********************************************************************************/ -#include #include -#include #include +#include +#include #include #include #include @@ -38,8 +38,7 @@ namespace Kernel /// @brief User Process scheduler global and external reference of thread scheduler. /***********************************************************************************/ - UserProcessScheduler* kProcessScheduler = nullptr; - EXTERN HardwareThreadScheduler* kHardwareThreadScheduler; + UserProcessScheduler kProcessScheduler; UserProcess::UserProcess(VoidPtr start_image) : Image(start_image) {} @@ -373,16 +372,7 @@ namespace Kernel UserProcessScheduler& UserProcessScheduler::The() { - MUST_PASS(kProcessScheduler); - return *kProcessScheduler; - } - - ErrorOr UserProcessScheduler::TheSafe() - { - if (!kProcessScheduler) - return ErrorOr(nullptr); - - return ErrorOr(kProcessScheduler); + return kProcessScheduler; } /***********************************************************************************/ @@ -397,7 +387,7 @@ namespace Kernel const Bool UserProcessScheduler::Remove(ProcessID process_id) { // check if process is within range. - if (process_id > mTeam.AsArray().Count()) + if (process_id > mTeam.mProcessAmount) return No; mTeam.AsArray()[process_id].Status = ProcessStatusKind::kDead; @@ -458,7 +448,7 @@ namespace Kernel this->GetCurrentProcess() = process; // tell helper to find a core to schedule on. - if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize], process.StackFrame, + if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize - 1], process.StackFrame, process.ProcessId)) { process.Crash(); @@ -497,7 +487,7 @@ namespace Kernel PID& UserProcessHelper::TheCurrentPID() { kcout << "UserProcessHelper::TheCurrentPID: Leaking ProcessId...\r"; - return kProcessScheduler->GetCurrentProcess().Leak().ProcessId; + return kProcessScheduler.GetCurrentProcess().Leak().ProcessId; } /// @brief Check if process can be schedulded. @@ -521,27 +511,6 @@ namespace Kernel return process.PTime < 1 && process.Status == ProcessStatusKind::kRunning; } - /***********************************************************************************/ - /** - * @brief Allocate a scheduler. - */ - /***********************************************************************************/ - - Bool UserProcessHelper::InitializeScheduler() - { - if (!kProcessScheduler) - { - kProcessScheduler = new UserProcessScheduler(); - } - - if (!kHardwareThreadScheduler) - { - kHardwareThreadScheduler = new HardwareThreadScheduler(); - } - - return Yes; - } - /***********************************************************************************/ /** * @brief Start scheduling current AP/Hart/Core. @@ -549,10 +518,7 @@ namespace Kernel /***********************************************************************************/ SizeT UserProcessHelper::StartScheduling() { - if (!kProcessScheduler) - return 0; - - return kProcessScheduler->Run(); + return kProcessScheduler.Run(); } /***********************************************************************************/ -- cgit v1.2.3