diff options
| author | Amlal <amlal.elmahrouss@icloud.com> | 2025-01-29 09:15:17 +0100 |
|---|---|---|
| committer | Amlal <amlal.elmahrouss@icloud.com> | 2025-01-29 09:15:17 +0100 |
| commit | b6464d3fcd11ad43d1d0421fa8484eda2ac1708f (patch) | |
| tree | 7826279e593c837fa81a61f38e899213f8f55c03 /dev/Kernel/src | |
| parent | 711dcbb464de6339a2dc5cd251f2096616d5ea09 (diff) | |
WiP: Tweaks and will finish SATA support and ATA (DMA) support.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel/src')
| -rw-r--r-- | dev/Kernel/src/HardwareThreadScheduler.cc | 6 | ||||
| -rw-r--r-- | dev/Kernel/src/UserProcessScheduler.cc | 31 |
2 files changed, 20 insertions, 17 deletions
diff --git a/dev/Kernel/src/HardwareThreadScheduler.cc b/dev/Kernel/src/HardwareThreadScheduler.cc index 66500f73..573b86d6 100644 --- a/dev/Kernel/src/HardwareThreadScheduler.cc +++ b/dev/Kernel/src/HardwareThreadScheduler.cc @@ -62,8 +62,9 @@ namespace Kernel Bool HardwareThread::IsBusy() noexcept { STATIC Int64 busy_timer = 0U; + STATIC Int64 timeout_max = 0x1000000; // an arbitrary value used to tell if the timeout hasn't been reached yet. - if (fBusy && busy_timer > this->fPTime) + if (fBusy && busy_timer > timeout_max) { busy_timer = 0U; fBusy = No; @@ -111,6 +112,9 @@ namespace Kernel /***********************************************************************************/ Bool HardwareThread::Switch(VoidPtr image_ptr, Ptr8 stack_ptr, HAL::StackFramePtr frame, const ThreadID& pid) { + if (this->IsBusy()) + return NO; + this->fStack = frame; this->fSourcePID = pid; diff --git a/dev/Kernel/src/UserProcessScheduler.cc b/dev/Kernel/src/UserProcessScheduler.cc index dbe0471b..2e76f7ac 100644 --- a/dev/Kernel/src/UserProcessScheduler.cc +++ b/dev/Kernel/src/UserProcessScheduler.cc @@ -565,7 +565,14 @@ namespace Kernel continue; if (HardwareThreadScheduler::The()[index].Leak()->Switch(image_ptr, stack, frame_ptr, new_pid)) + { + auto prev_ptime = HardwareThreadScheduler::The()[index].Leak()->fPTime; + HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; + PID prev_pid = UserProcessHelper::TheCurrentPID(); + UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid; + return YES; + } continue; } @@ -573,38 +580,30 @@ namespace Kernel if (UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].Affinity == AffinityKind::kRealTime) continue; - PID prev_pid = UserProcessHelper::TheCurrentPID(); - UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid; - //////////////////////////////////////////////////////////// /// Prepare task switch. /// //////////////////////////////////////////////////////////// - HardwareThreadScheduler::The()[index].Leak()->Wake(YES); - HardwareThreadScheduler::The()[index].Leak()->Busy(NO); - - auto prev_ptime = HardwareThreadScheduler::The()[index].Leak()->fPTime; - HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; - Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(image_ptr, stack, frame_ptr, new_pid); //////////////////////////////////////////////////////////// /// Rollback on fail. /// //////////////////////////////////////////////////////////// if (!ret) - { - HardwareThreadScheduler::The()[index].Leak()->fPTime = prev_ptime; - UserProcessHelper::TheCurrentPID().Leak().Leak() = prev_pid; + return No; - HardwareThreadScheduler::The()[index].Leak()->Busy(NO); - } + PID prev_pid = UserProcessHelper::TheCurrentPID(); + UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid; + + auto prev_ptime = HardwareThreadScheduler::The()[index].Leak()->fPTime; + HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; HardwareThreadScheduler::The()[index].Leak()->Wake(NO); - return Yes; + break; } - return No; + return Yes; } //////////////////////////////////////////////////////////// |
