summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2019-09-10 17:04:40 +0200
committerFernandoS27 <fsahmkow27@gmail.com>2019-10-15 17:55:14 +0200
commitb49c0dab8772afb06358e5d19af092226b3a59bb (patch)
tree00e1cad505f915f5d7d286c5627b8e13f5eb78ff /src/core/hle/kernel/kernel.cpp
parentScheduler: Add protections for Yield bombing (diff)
downloadyuzu-b49c0dab8772afb06358e5d19af092226b3a59bb.tar
yuzu-b49c0dab8772afb06358e5d19af092226b3a59bb.tar.gz
yuzu-b49c0dab8772afb06358e5d19af092226b3a59bb.tar.bz2
yuzu-b49c0dab8772afb06358e5d19af092226b3a59bb.tar.lz
yuzu-b49c0dab8772afb06358e5d19af092226b3a59bb.tar.xz
yuzu-b49c0dab8772afb06358e5d19af092226b3a59bb.tar.zst
yuzu-b49c0dab8772afb06358e5d19af092226b3a59bb.zip
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 600d6ec74..7a913520d 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -12,6 +12,7 @@
#include "core/core.h"
#include "core/core_timing.h"
+#include "core/core_timing_util.h"
#include "core/hle/kernel/address_arbiter.h"
#include "core/hle/kernel/client_port.h"
#include "core/hle/kernel/handle_table.h"
@@ -96,6 +97,7 @@ struct KernelCore::Impl {
InitializeSystemResourceLimit(kernel);
InitializeThreads();
+ InitializePreemption();
}
void Shutdown() {
@@ -111,6 +113,7 @@ struct KernelCore::Impl {
thread_wakeup_callback_handle_table.Clear();
thread_wakeup_event_type = nullptr;
+ preemption_event = nullptr;
named_ports.clear();
}
@@ -133,6 +136,18 @@ struct KernelCore::Impl {
system.CoreTiming().RegisterEvent("ThreadWakeupCallback", ThreadWakeupCallback);
}
+ void InitializePreemption() {
+ preemption_event = system.CoreTiming().RegisterEvent(
+ "PreemptionCallback", [this](u64 userdata, s64 cycles_late) {
+ global_scheduler.PreemptThreads();
+ s64 time_interval = Core::Timing::msToCycles(std::chrono::milliseconds(10));
+ system.CoreTiming().ScheduleEvent(time_interval, preemption_event);
+ });
+
+ s64 time_interval = Core::Timing::msToCycles(std::chrono::milliseconds(10));
+ system.CoreTiming().ScheduleEvent(time_interval, preemption_event);
+ }
+
std::atomic<u32> next_object_id{0};
std::atomic<u64> next_kernel_process_id{Process::InitialKIPIDMin};
std::atomic<u64> next_user_process_id{Process::ProcessIDMin};
@@ -146,6 +161,7 @@ struct KernelCore::Impl {
SharedPtr<ResourceLimit> system_resource_limit;
Core::Timing::EventType* thread_wakeup_event_type = nullptr;
+ Core::Timing::EventType* preemption_event = nullptr;
// TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future,
// allowing us to simply use a pool index or similar.
Kernel::HandleTable thread_wakeup_callback_handle_table;