summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel/src')
-rw-r--r--dev/kernel/src/PEFCodeMgr.cc4
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc45
-rw-r--r--dev/kernel/src/UtfUtils.cc12
3 files changed, 41 insertions, 20 deletions
diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc
index 5ff54098..25a25122 100644
--- a/dev/kernel/src/PEFCodeMgr.cc
+++ b/dev/kernel/src/PEFCodeMgr.cc
@@ -249,8 +249,8 @@ namespace Utils {
*(volatile UIntPtr*) stacksym.Leak().Leak() = kSchedMaxStackSz;
}
- UserProcessScheduler::The().CurrentTeam().AsArray()[id].Kind = process_kind;
- UserProcessScheduler::The().CurrentTeam().AsArray()[id].StackSize =
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[id].Kind = process_kind;
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[id].StackSize =
*(UIntPtr*) stacksym.Leak().Leak();
mm_delete_ptr(stacksym.Leak().Leak());
diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 4f6e859e..b0d56c5d 100644
--- a/dev/kernel/src/UserProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -14,13 +14,13 @@
/***********************************************************************************/
#include <ArchKit/ArchKit.h>
-#include <NewKit/KString.h>
-
#include <KernelKit/HardwareThreadScheduler.h>
#include <KernelKit/IPEFDylibObject.h>
#include <KernelKit/KPC.h>
#include <KernelKit/MemoryMgr.h>
#include <KernelKit/ProcessScheduler.h>
+#include <NewKit/KString.h>
+#include <SignalKit/Signals.h>
///! BUGS: 0
@@ -479,18 +479,23 @@ SizeT UserProcessScheduler::Run() noexcept {
return 0UL;
}
+ auto& process = this->TheCurrentProcess().Leak();
+
+ //! Increase the usage time of the process.
+ if (process.UTime < process.PTime) {
+ ++process.UTime;
+ }
+
SizeT process_index = 0UL; //! we store this guy to tell the scheduler how many
//! things we have scheduled.
for (; process_index < mTeam.AsArray().Capacity(); ++process_index) {
auto& process = mTeam.AsArray()[process_index];
- if (this->CurrentProcess() == process) continue;
-
//! Check if the process needs to be run.
if (UserProcessHelper::CanBeScheduled(process)) {
if (process.StackSize > kSchedMaxStackSz) {
- kout << "The process: " << process.Name << ", has not a valid stack size! Crashing it...\r";
+ kout << "Process: " << process.Name << ", has not a valid stack size! Crashing it...\r";
process.Crash();
continue;
}
@@ -511,13 +516,14 @@ SizeT UserProcessScheduler::Run() noexcept {
process.RTime = 0UL;
}
- this->CurrentProcess() = process;
-
if (!UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) {
break;
}
- break;
+ mTeam.AsArray()[this->TheCurrentProcess().Leak().ProcessId] =
+ this->TheCurrentProcess().Leak();
+
+ this->TheCurrentProcess() = process;
} else {
++process.RTime;
--process.PTime;
@@ -529,7 +535,7 @@ SizeT UserProcessScheduler::Run() noexcept {
/// @brief Gets the current scheduled team.
/// @return
-UserProcessTeam& UserProcessScheduler::CurrentTeam() {
+UserProcessTeam& UserProcessScheduler::TheCurrentTeam() {
return mTeam;
}
@@ -550,17 +556,17 @@ BOOL UserProcessScheduler::SwitchTeam(UserProcessTeam& team) {
/// @brief Gets current running process.
/// @return
-Ref<USER_PROCESS>& UserProcessScheduler::CurrentProcess() {
+Ref<USER_PROCESS>& UserProcessScheduler::TheCurrentProcess() {
return mTeam.AsRef();
}
/// @brief Current proccess id getter.
/// @return USER_PROCESS ID integer.
ErrorOr<PID> UserProcessHelper::TheCurrentPID() {
- if (!UserProcessScheduler::The().CurrentProcess()) return ErrorOr<PID>{-kErrorProcessFault};
+ if (!UserProcessScheduler::The().TheCurrentProcess()) return ErrorOr<PID>{-kErrorProcessFault};
kout << "UserProcessHelper::TheCurrentPID: Leaking ProcessId...\r";
- return ErrorOr<PID>{UserProcessScheduler::The().CurrentProcess().Leak().ProcessId};
+ return ErrorOr<PID>{UserProcessScheduler::The().TheCurrentProcess().Leak().ProcessId};
}
/// @brief Check if process can be schedulded.
@@ -575,12 +581,17 @@ Bool UserProcessHelper::CanBeScheduled(const USER_PROCESS& process) {
// real time processes shouldn't wait that much.
if (process.Affinity == AffinityKind::kRealTime) return Yes;
+ if (process.Signal.SignalID == SIGKILL || process.Signal.SignalID == SIGABRT ||
+ process.Signal.SignalID == SIGTRAP) {
+ return No;
+ }
+
return process.PTime < 1;
}
/***********************************************************************************/
/**
- * @brief Start scheduling current AP.
+ * @brief Start scheduling the current team.
*/
/***********************************************************************************/
@@ -604,13 +615,13 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) {
// A fallback is a special core for real-time tasks which needs immediate execution.
if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPRealTime) {
- if (UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].Affinity !=
+ if (UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].Affinity !=
AffinityKind::kRealTime)
continue;
if (HardwareThreadScheduler::The()[index].Leak()->Switch(frame_ptr, new_pid)) {
HardwareThreadScheduler::The()[index].Leak()->fPTime =
- UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime;
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].PTime;
UserProcessHelper::TheCurrentPID().Leak().Leak() = UserProcessHelper::TheCurrentPID();
@@ -620,7 +631,7 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) {
continue;
}
- if (UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].Affinity ==
+ if (UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].Affinity ==
AffinityKind::kRealTime)
continue;
@@ -639,7 +650,7 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) {
UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid;
HardwareThreadScheduler::The()[index].Leak()->fPTime =
- UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime;
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].PTime;
HardwareThreadScheduler::The()[index].Leak()->Wake(YES);
return YES;
diff --git a/dev/kernel/src/UtfUtils.cc b/dev/kernel/src/UtfUtils.cc
index 11d7471a..1374ee86 100644
--- a/dev/kernel/src/UtfUtils.cc
+++ b/dev/kernel/src/UtfUtils.cc
@@ -25,7 +25,17 @@ Void urt_set_memory(const voidPtr src, UInt32 dst, Size len) {
}
}
-Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len) {
+Int32 rt_string_cmp(const Utf8Char* src, const Utf8Char* cmp, Size size) {
+ Int32 counter = 0;
+
+ for (Size index = 0; index < size; ++index) {
+ if (src[index] != cmp[index]) ++counter;
+ }
+
+ return counter;
+}
+
+Int urt_copy_memory(const VoidPtr src, VoidPtr dst, Size len) {
Utf8Char* srcChr = reinterpret_cast<Utf8Char*>(src);
Utf8Char* dstChar = reinterpret_cast<Utf8Char*>(dst);