summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/src/UserProcessScheduler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dev/Kernel/src/UserProcessScheduler.cc')
-rw-r--r--dev/Kernel/src/UserProcessScheduler.cc31
1 files changed, 15 insertions, 16 deletions
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;
}
////////////////////////////////////////////////////////////