summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dev/ddk/DDKKit/ifs.h16
-rw-r--r--dev/kernel/KernelKit/UserProcessScheduler.h3
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc32
-rw-r--r--docs/md/SPECIFICATION_KERNEL.md4
4 files changed, 50 insertions, 5 deletions
diff --git a/dev/ddk/DDKKit/ifs.h b/dev/ddk/DDKKit/ifs.h
new file mode 100644
index 00000000..0665de9a
--- /dev/null
+++ b/dev/ddk/DDKKit/ifs.h
@@ -0,0 +1,16 @@
+/* -------------------------------------------
+
+ Copyright Amlal El Mahrouss.
+
+ FILE: ifs.h
+ PURPOSE: IFS model base header.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <DDKKit/macros.h>
+
+struct DDK_IFS_MANIFEST;
+
+/// @brief IFS hooks to plug into the FileMgr.
diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h
index d6cd7ad4..1e8719ca 100644
--- a/dev/kernel/KernelKit/UserProcessScheduler.h
+++ b/dev/kernel/KernelKit/UserProcessScheduler.h
@@ -106,7 +106,8 @@ class USER_PROCESS final {
kExecutableKindCount,
};
- ProcessTime PTime{0}; //! @brief USER_PROCESS allocated tine.
+ ProcessTime PTime{0}; //! @brief Process allocated tine.
+ ProcessTime RTime{0}; //! @brief Process Run time
PID ProcessId{kSchedInvalidPID};
Int32 Kind{kExecutableKind};
diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 96938d10..4b206317 100644
--- a/dev/kernel/src/UserProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -20,6 +20,8 @@
#include <KernelKit/MemoryMgr.h>
#include <KernelKit/ProcessScheduler.h>
#include <NewKit/KString.h>
+#include "KernelKit/CoreProcessScheduler.h"
+#include "NewKit/Defines.h"
///! BUGS: 0
@@ -424,6 +426,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
process.ProcessId = pid;
process.Status = ProcessStatusKind::kStarting;
process.PTime = (UIntPtr) AffinityKind::kStandard;
+ process.RTime = 0;
(Void)(kout << "PID: " << number(process.ProcessId) << kendl);
(Void)(kout << "Name: " << process.Name << kendl);
@@ -510,13 +513,36 @@ SizeT UserProcessScheduler::Run() noexcept {
process.StackFrame, process.ProcessId);
if (!ret) {
- if (process.Affinity == AffinityKind::kRealTime) continue;
-
kout << "The process: " << process.Name << ", is not valid! Crashing it...\r";
-
process.Crash();
}
} else {
+ if (process.ProcessId == this->CurrentProcess().Leak().ProcessId) {
+ if (process.PTime < process.RTime) {
+ if (process.RTime < (Int32) AffinityKind::kRealTime)
+ process.PTime = (Int32) AffinityKind::kVeryLowUsage;
+ else if (process.RTime < (Int32) AffinityKind::kVeryHigh)
+ process.PTime = (Int32) AffinityKind::kLowUsage;
+ else if (process.RTime < (Int32) AffinityKind::kHigh)
+ process.PTime = (Int32) AffinityKind::kStandard;
+ else if (process.RTime < (Int32) AffinityKind::kStandard)
+ process.PTime = (Int32) AffinityKind::kHigh;
+
+ process.RTime = static_cast<Int32>(process.Affinity);
+
+ BOOL ret = UserProcessHelper::Switch(process.Image.Leak().Leak().Leak(),
+ &process.StackReserve[process.StackSize - 1],
+ process.StackFrame, process.ProcessId);
+
+ if (!ret) {
+ kout << "The process: " << process.Name << ", is not valid! Crashing it...\r";
+ process.Crash();
+ }
+ } else {
+ ++process.RTime;
+ }
+ }
+
--process.PTime;
}
}
diff --git a/docs/md/SPECIFICATION_KERNEL.md b/docs/md/SPECIFICATION_KERNEL.md
index ae283428..6f1fae03 100644
--- a/docs/md/SPECIFICATION_KERNEL.md
+++ b/docs/md/SPECIFICATION_KERNEL.md
@@ -24,7 +24,7 @@
- TLS (Thread Local Storage) support.
- BinaryMutex, Locks, Timers.
- Canary mechanisms.
-- Dynamic Sys.
+- Dynamic Loader.
- Cross Platform.
- Permission Selectors.
@@ -51,6 +51,8 @@
- Hal -> hal_foo_bar
- Class methods -> Class::FooBar
+Internals function shall be formated as such: (hali, rtli, rti...)
+
===================================
# 4: The Bootloader (BootZ)