diff options
| author | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-30 18:46:00 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-30 19:56:02 +0200 |
| commit | a9d87cbd143b05cc3de711d84401f8ef514f3aa3 (patch) | |
| tree | cfc703f1dc02f6894b4d6d173d18d84be5757c5f /dev/ZKA/Sources/ProcessScheduler.cxx | |
| parent | 5229ca8ae190c0cb3db8d381a44be4113e81d5dc (diff) | |
[IMP] Updated the ARM64 release of ZKA.
[IMP] Shall use the timer on AMD64 by default, a SMP driver will be written if needed.
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 | 79 |
1 files changed, 27 insertions, 52 deletions
diff --git a/dev/ZKA/Sources/ProcessScheduler.cxx b/dev/ZKA/Sources/ProcessScheduler.cxx index 2198cd42..bf2cdbd3 100644 --- a/dev/ZKA/Sources/ProcessScheduler.cxx +++ b/dev/ZKA/Sources/ProcessScheduler.cxx @@ -211,7 +211,7 @@ 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(Ref<PROCESS_HEADER_BLOCK> process) { if (!process.Leak().Image) { @@ -224,24 +224,17 @@ namespace Kernel if (mTeam.AsArray().Count() > kSchedProcessLimitPerTeam) return -kErrorOutOfTeamSlot; - kcout << "ProcessScheduler:: adding process to team...\r"; - - if (process.Leak().GetOwner() == nullptr) - { - // Something went wrong, do not continue, process may be incorrect. - process.Leak().Crash(); - return -kErrorProcessFault; - } + kcout << "ProcessScheduler: Adding process to team...\r"; // Create heap according to type of process. if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kAppKind) { - process.Leak().HeapPtr = sched_new_heap(kProcessHeapUser | kProcessHeapRw, process.Leak().SizeMemory); + process.Leak().HeapPtr = mm_new_ke_heap(process.Leak().SizeMemory, true, true); } else if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind) { - process.Leak().DLLPtr = rtl_init_shared_object(&process.Leak()); - process.Leak().HeapPtr = sched_new_heap(kProcessHeapUser | kProcessHeapRw | kProcessHeapShared, process.Leak().SizeMemory); + process.Leak().DLLPtr = rtl_init_shared_object(&process.Leak()); + process.Leak().HeapPtr = mm_new_ke_heap(process.Leak().SizeMemory, true, true); } else { @@ -276,7 +269,9 @@ namespace Kernel process.Leak().ProcessId = (mTeam.AsArray().Count() - 1); process.Leak().HeapCursor = process.Leak().HeapPtr; - MUST_PASS(mTeam.AsArray().Add(process)); + mTeam.AsArray()[process.Leak().ProcessId] = process.Leak(); + + kcout << "ProcessScheduler: Adding process to team [ OK ]...\r"; return (mTeam.AsArray().Count() - 1); } @@ -302,12 +297,13 @@ namespace Kernel return false; // also check if the process isn't a dummy one. - if (mTeam.AsArray()[processSlot].Leak().Leak().Image == nullptr) + if (mTeam.AsArray()[processSlot].Image == nullptr) return false; - kcout << "ProcessScheduler: removing process\r"; + kcout << "ProcessScheduler: Removing process...\r"; - return mTeam.AsArray().Remove(processSlot); + mTeam.AsArray()[processSlot].Status = ProcessStatus::kDead; + return true; } /// @brief Run scheduler. @@ -322,26 +318,18 @@ namespace Kernel auto process = mTeam.AsArray()[process_index]; //! check if process needs to be scheduled. - if (ProcessHelper::CanBeScheduled(process.Leak())) + if (ProcessHelper::CanBeScheduled(process)) { - auto unwrapped_process = *process.Leak(); - - if (unwrapped_process.Parent->Status == ProcessStatus::kKilled) - { - unwrapped_process.Exit(); - continue; - } - // set the current process. - mTeam.AsRef() = unwrapped_process; + mTeam.AsRef() = process; - // tell helper to find a core to schedule on. - ProcessHelper::Switch(unwrapped_process.StackFrame, - unwrapped_process.ProcessId); + process.PTime = static_cast<Int32>(process.Affinity); - unwrapped_process.PTime = static_cast<Int32>(unwrapped_process.Affinity); + kcout << process.Name << ": will be runned.\r"; - kcout << unwrapped_process.Name << ": has been switched to a CPU core.\r"; + // tell helper to find a core to schedule on. + ProcessHelper::Switch(process.StackFrame, + process.ProcessId); } else { @@ -381,36 +369,23 @@ namespace Kernel /// @param process the process reference. /// @retval true can be schedulded. /// @retval false cannot be schedulded. - bool ProcessHelper::CanBeScheduled(Ref<PROCESS_HEADER_BLOCK>& process) + bool ProcessHelper::CanBeScheduled(PROCESS_HEADER_BLOCK& process) { - if (process.Leak().Status == ProcessStatus::kFrozen || - process.Leak().Status == ProcessStatus::kDead) + if (process.Status == ProcessStatus::kFrozen || + process.Status == ProcessStatus::kDead) return false; - if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind) + if (process.Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind) { - if (auto start = process.Leak().DLLPtr->Load<VoidPtr>(kPefStart, rt_string_len(kPefStart), kPefCode); + if (auto start = process.DLLPtr->Load<VoidPtr>(kPefStart, rt_string_len(kPefStart), kPefCode); start) { - process.Leak().Image = start; - process.Leak().StackFrame->BP = reinterpret_cast<HAL::Reg>(start); + process.Image = start; + process.StackFrame->BP = reinterpret_cast<HAL::Reg>(start); } } - if (process.Leak().GetStatus() == ProcessStatus::kStarting) - { - if (process.Leak().PTime <= 0) - { - process.Leak().Status = ProcessStatus::kRunning; - process.Leak().Affinity = AffinityKind::kStandard; - - return true; - } - - ++process.Leak().PTime; - } - - return process.Leak().PTime > 0; + return process.PTime > 0; } /** |
