diff options
author | Lioncash <mathew1800@gmail.com> | 2018-10-26 00:42:50 +0200 |
---|---|---|
committer | Lioncash <mathew1800@gmail.com> | 2018-10-26 18:49:11 +0200 |
commit | 6594853eb112f265fe2354723160c0d4e1cb761a (patch) | |
tree | 60e67d4d7f38d8f1fe5bebe01f3ef0d87881c570 /src/core/hle/kernel/scheduler.cpp | |
parent | Merge pull request #1533 from FernandoS27/lmem (diff) | |
download | yuzu-6594853eb112f265fe2354723160c0d4e1cb761a.tar yuzu-6594853eb112f265fe2354723160c0d4e1cb761a.tar.gz yuzu-6594853eb112f265fe2354723160c0d4e1cb761a.tar.bz2 yuzu-6594853eb112f265fe2354723160c0d4e1cb761a.tar.lz yuzu-6594853eb112f265fe2354723160c0d4e1cb761a.tar.xz yuzu-6594853eb112f265fe2354723160c0d4e1cb761a.tar.zst yuzu-6594853eb112f265fe2354723160c0d4e1cb761a.zip |
Diffstat (limited to 'src/core/hle/kernel/scheduler.cpp')
-rw-r--r-- | src/core/hle/kernel/scheduler.cpp | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp index 1342c597e..5a5f4cef1 100644 --- a/src/core/hle/kernel/scheduler.cpp +++ b/src/core/hle/kernel/scheduler.cpp @@ -9,6 +9,7 @@ #include "common/logging/log.h" #include "core/arm/arm_interface.h" #include "core/core.h" +#include "core/core_timing.h" #include "core/hle/kernel/kernel.h" #include "core/hle/kernel/process.h" #include "core/hle/kernel/scheduler.h" @@ -34,6 +35,10 @@ Thread* Scheduler::GetCurrentThread() const { return current_thread.get(); } +u64 Scheduler::GetLastContextSwitchTicks() const { + return last_context_switch_time; +} + Thread* Scheduler::PopNextReadyThread() { Thread* next = nullptr; Thread* thread = GetCurrentThread(); @@ -54,7 +59,10 @@ Thread* Scheduler::PopNextReadyThread() { } void Scheduler::SwitchContext(Thread* new_thread) { - Thread* previous_thread = GetCurrentThread(); + Thread* const previous_thread = GetCurrentThread(); + Process* const previous_process = Core::CurrentProcess(); + + UpdateLastContextSwitchTime(previous_thread, previous_process); // Save context for previous thread if (previous_thread) { @@ -78,8 +86,6 @@ void Scheduler::SwitchContext(Thread* new_thread) { // Cancel any outstanding wakeup events for this thread new_thread->CancelWakeupTimer(); - auto* const previous_process = Core::CurrentProcess(); - current_thread = new_thread; ready_queue.remove(new_thread->GetPriority(), new_thread); @@ -102,6 +108,22 @@ void Scheduler::SwitchContext(Thread* new_thread) { } } +void Scheduler::UpdateLastContextSwitchTime(Thread* thread, Process* process) { + const u64 prev_switch_ticks = last_context_switch_time; + const u64 most_recent_switch_ticks = CoreTiming::GetTicks(); + const u64 update_ticks = most_recent_switch_ticks - prev_switch_ticks; + + if (thread != nullptr) { + thread->UpdateCPUTimeTicks(update_ticks); + } + + if (process != nullptr) { + process->UpdateCPUTimeTicks(update_ticks); + } + + last_context_switch_time = most_recent_switch_ticks; +} + void Scheduler::Reschedule() { std::lock_guard<std::mutex> lock(scheduler_mutex); |