summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA/Sources/UserProcessScheduler.cxx
diff options
context:
space:
mode:
authorAmlal <amlal@el-mahrouss-logic.com>2024-09-06 09:38:00 +0200
committerAmlal <amlal@el-mahrouss-logic.com>2024-09-06 09:38:00 +0200
commit507b3a76de36e41bdfd1c14d94a397990b26a423 (patch)
treee087051b51d36828fbca98d9e9e74cb1381a4def /dev/ZKA/Sources/UserProcessScheduler.cxx
parent98f504c442b1a0f769e2f20e4fb251813dd5dd67 (diff)
[ IMP ] A first set of software patches regarding the OS kernel and it's components.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev/ZKA/Sources/UserProcessScheduler.cxx')
-rw-r--r--dev/ZKA/Sources/UserProcessScheduler.cxx74
1 files changed, 31 insertions, 43 deletions
diff --git a/dev/ZKA/Sources/UserProcessScheduler.cxx b/dev/ZKA/Sources/UserProcessScheduler.cxx
index 8c46b1cf..f480bccc 100644
--- a/dev/ZKA/Sources/UserProcessScheduler.cxx
+++ b/dev/ZKA/Sources/UserProcessScheduler.cxx
@@ -12,6 +12,7 @@
/// @brief User Process scheduler.
/***********************************************************************************/
+#include "HALKit/AMD64/Processor.hxx"
#include <KernelKit/UserProcessScheduler.hxx>
#include <KernelKit/IPEFDLLObject.hxx>
#include <KernelKit/HardwareThreadScheduler.hxx>
@@ -213,7 +214,7 @@ namespace Kernel
if (this->Kind == kDLLKind)
{
Bool success = false;
- rtl_fini_shared_object(this, this->DLLPtr, &success);
+ rtl_fini_dll(this, this->DLLPtr, &success);
if (success)
{
@@ -237,7 +238,7 @@ namespace Kernel
process.MemoryPD = reinterpret_cast<UIntPtr>(hal_read_cr3());
#endif // __ZKA_AMD64__
- process.StackFrame = (HAL::StackFrame*)process.New(sizeof(HAL::StackFrame));
+ process.StackFrame = new HAL::StackFrame(0);
if (!process.StackFrame)
{
@@ -248,28 +249,26 @@ namespace Kernel
// Create heap according to type of process.
if (process.Kind == UserProcess::kDLLKind)
{
- process.DLLPtr = rtl_init_shared_object(&process);
+ process.DLLPtr = rtl_init_dll(&process);
}
- if (process.Image)
+ if (!process.Image)
{
- // get preferred stack size by app.
- const auto cMaxStackSize = process.StackSize;
- process.StackReserve = (UInt8*)process.New(sizeof(UInt8) * cMaxStackSize);
-
- if (process.StackReserve)
+ if (process.Kind != UserProcess::kDLLKind)
{
process.Crash();
return -kErrorProcessFault;
}
}
- else
+
+ // get preferred stack size by app.
+ const auto cMaxStackSize = process.StackSize;
+ process.StackReserve = new UInt8[cMaxStackSize];
+
+ if (!process.StackReserve)
{
- if (process.Kind != UserProcess::kDLLKind)
- {
- process.Crash();
- return -kErrorProcessFault;
- }
+ process.Crash();
+ return -kErrorProcessFault;
}
process.Status = ProcessStatusKind::kStarting;
@@ -277,9 +276,6 @@ namespace Kernel
++mTeam.mProcessAmount;
- while (1)
- ;
-
mTeam.AsArray()[process.ProcessId] = process;
return process.ProcessId;
@@ -318,6 +314,8 @@ namespace Kernel
SizeT process_index = 0; //! we store this guy to tell the scheduler how many
//! things we have scheduled.
+ kcout << "Finding available process...\r";
+
for (; process_index < mTeam.AsArray().Capacity(); ++process_index)
{
auto& process = mTeam.AsArray()[process_index];
@@ -326,7 +324,7 @@ namespace Kernel
if (UserProcessHelper::CanBeScheduled(process))
{
// set the current process.
- mTeam.AsRef() = mTeam.AsArray()[process.ProcessId];
+ mTeam.AsRef() = process;
process.PTime = static_cast<Int32>(process.Affinity);
@@ -339,10 +337,6 @@ namespace Kernel
process.Crash();
continue;
}
-
- process.Exit();
-
- continue;
}
else
{
@@ -378,35 +372,16 @@ namespace Kernel
return cProcessScheduler->CurrentProcess().Leak().ProcessId;
}
- Void UserProcessHelper::Init()
- {
- if (mm_is_valid_heap(cProcessScheduler))
- delete cProcessScheduler;
-
- cProcessScheduler = nullptr;
- cProcessScheduler = new UserProcessScheduler();
- MUST_PASS(cProcessScheduler);
- }
-
/// @brief Check if process can be schedulded.
/// @param process the process reference.
/// @retval true can be schedulded.
/// @retval false cannot be schedulded.
- bool UserProcessHelper::CanBeScheduled(UserProcess& process)
+ bool UserProcessHelper::CanBeScheduled(const UserProcess process)
{
if (process.Status == ProcessStatusKind::kFrozen ||
process.Status == ProcessStatusKind::kDead)
return false;
- if (process.Kind == UserProcess::kDLLKind)
- {
- if (auto start = process.DLLPtr->Load<VoidPtr>(kPefStart, rt_string_len(kPefStart), kPefCode);
- start)
- {
- process.Image = start;
- }
- }
-
return process.PTime < 1;
}
@@ -414,8 +389,21 @@ namespace Kernel
* @brief Scheduler helper class.
*/
+ EXTERN
+ HardwareThreadScheduler* cHardwareThreadScheduler;
+
SizeT UserProcessHelper::StartScheduling()
{
+ if (!cHardwareThreadScheduler)
+ {
+ cHardwareThreadScheduler = new HardwareThreadScheduler();
+ }
+
+ if (!cProcessScheduler)
+ {
+ cProcessScheduler = new UserProcessScheduler();
+ }
+
SizeT ret = cProcessScheduler->Run();
return ret;
}