summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA/Sources/ProcessScheduler.cxx
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-30 18:46:00 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-30 19:56:02 +0200
commita9d87cbd143b05cc3de711d84401f8ef514f3aa3 (patch)
treecfc703f1dc02f6894b4d6d173d18d84be5757c5f /dev/ZKA/Sources/ProcessScheduler.cxx
parent5229ca8ae190c0cb3db8d381a44be4113e81d5dc (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.cxx79
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;
}
/**