diff options
| author | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-30 20:46:01 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-30 20:46:01 +0200 |
| commit | 43bac17a2986ac2ea86e9d70c61268fa7e90ca4e (patch) | |
| tree | d259814b8c388e87bb02860405ff668a92434c44 /dev/ZKA/Sources/ProcessScheduler.cxx | |
| parent | 8a4f0e988a901e4fce5d32e3d5f9dbdc5f309863 (diff) | |
Fixed many issues with the kernel, and refactored it.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKA/Sources/ProcessScheduler.cxx')
| -rw-r--r-- | dev/ZKA/Sources/ProcessScheduler.cxx | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/dev/ZKA/Sources/ProcessScheduler.cxx b/dev/ZKA/Sources/ProcessScheduler.cxx index 579294fb..82c1cf57 100644 --- a/dev/ZKA/Sources/ProcessScheduler.cxx +++ b/dev/ZKA/Sources/ProcessScheduler.cxx @@ -211,71 +211,71 @@ namespace Kernel /// @brief Add process to list. /// @param process the process *Ref* class. /// @return the process index inside the team. - SizeT ProcessScheduler::Add(Ref<PROCESS_HEADER_BLOCK> process) + SizeT ProcessScheduler::Add(PROCESS_HEADER_BLOCK& process) { - if (!process.Leak().Image) + if (!process.Image) { return -kErrorInvalidData; } - if (mTeam.AsArray().Count() > kSchedProcessLimitPerTeam) - return -kErrorOutOfTeamSlot; - kcout << "ProcessScheduler: Adding process to team...\r"; // Create heap according to type of process. - if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kExeKind) + if (process.Kind == PROCESS_HEADER_BLOCK::kExeKind) { - process.Leak().HeapPtr = mm_new_ke_heap(process.Leak().SizeMemory, true, true); + process.HeapPtr = mm_new_ke_heap(process.SizeMemory, true, true); } - else if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind) + else if (process.Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind) { - process.Leak().DLLPtr = rtl_init_shared_object(&process.Leak()); - process.Leak().HeapPtr = mm_new_ke_heap(process.Leak().SizeMemory, true, true); + process.DLLPtr = rtl_init_shared_object(&process); + process.HeapPtr = mm_new_ke_heap(process.SizeMemory, true, true); } else { // Something went wrong, do not continue, process may be incorrect. - process.Leak().Crash(); + process.Crash(); return -kErrorProcessFault; } - process.Leak().StackFrame = reinterpret_cast<HAL::StackFrame*>( + process.StackFrame = reinterpret_cast<HAL::StackFrame*>( mm_new_ke_heap(sizeof(HAL::StackFrame), Yes, Yes)); - MUST_PASS(process.Leak().StackFrame); + MUST_PASS(process.StackFrame); - if (process.Leak().Image) + if (process.Image) { - process.Leak().StackFrame->BP = reinterpret_cast<HAL::Reg>(process.Leak().Image); + process.StackFrame->BP = reinterpret_cast<HAL::Reg>(process.Image); } else { - if (process.Leak().Kind != PROCESS_HEADER_BLOCK::kSharedObjectKind) + if (process.Kind != PROCESS_HEADER_BLOCK::kSharedObjectKind) { - process.Leak().Crash(); + process.Crash(); return -kErrorProcessFault; } } - if (!process.Leak().StackFrame->SP) - process.Leak().StackFrame->SP = reinterpret_cast<HAL::Reg>(mm_new_ke_heap(sizeof(UInt8) * 8196, Yes, Yes)); + if (!process.StackFrame->SP) + process.StackFrame->SP = reinterpret_cast<HAL::Reg>(mm_new_ke_heap(sizeof(UInt8) * 8196, Yes, Yes)); + + process.Status = ProcessStatus::kStarting; + + process.ProcessId = (mTeam.mCurrentProcess); - process.Leak().Status = ProcessStatus::kStarting; + ++mTeam.mProcessAmount; - process.Leak().ProcessId = (mTeam.AsArray().Count() - 1); - process.Leak().HeapCursor = process.Leak().HeapPtr; + process.HeapCursor = process.HeapPtr; - mTeam.AsArray()[process.Leak().ProcessId] = process.Leak(); + mTeam.AsArray()[process.ProcessId] = process; kcout << "ProcessScheduler: Adding process to team [ OK ]...\r"; - return (mTeam.AsArray().Count() - 1); + return process.ProcessId; } /***********************************************************************************/ - Ref<ProcessScheduler> ProcessScheduler::The() + ProcessScheduler& ProcessScheduler::The() { MUST_PASS(cProcessScheduler); return *cProcessScheduler; @@ -287,7 +287,7 @@ namespace Kernel /// @param processSlot process slot inside team. /// @retval true process was removed. /// @retval false process doesn't exist in team. - Bool ProcessScheduler::Remove(SizeT processSlot) + Bool ProcessScheduler::Remove(ProcessID processSlot) { // check if process is within range. if (processSlot > mTeam.AsArray().Count()) @@ -299,6 +299,7 @@ namespace Kernel kcout << "ProcessScheduler: Removing process...\r"; + --mTeam.mProcessAmount; mTeam.AsArray()[processSlot].Status = ProcessStatus::kDead; return true; } @@ -349,7 +350,7 @@ namespace Kernel /// @brief Gets current running process. /// @return - Ref<PROCESS_HEADER_BLOCK>& ProcessScheduler::TheCurrent() + Ref<PROCESS_HEADER_BLOCK>& ProcessScheduler::CurrentProcess() { return mTeam.AsRef(); } @@ -359,7 +360,7 @@ namespace Kernel PID& ProcessHelper::TheCurrentPID() { kcout << "ProcessHelper::TheCurrentPID: Leaking ProcessId...\r"; - return cProcessScheduler->TheCurrent().Leak().ProcessId; + return cProcessScheduler->CurrentProcess().Leak().ProcessId; } /// @brief Check if process can be schedulded. @@ -377,16 +378,16 @@ namespace Kernel if (auto start = process.DLLPtr->Load<VoidPtr>(kPefStart, rt_string_len(kPefStart), kPefCode); start) { - process.Image = start; + process.Image = start; process.StackFrame->BP = reinterpret_cast<HAL::Reg>(start); } } - return process.PTime > 0; + return process.PTime < 0; } /** - * @brief Spin scheduler class. + * @brief Scheduler helper class. */ SizeT ProcessHelper::StartScheduling() |
