diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/time_manager.cpp | 20 |
2 files changed, 17 insertions, 13 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 0009193be..ee91a9b68 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -234,17 +234,19 @@ struct KernelCore::Impl { | |||
| 234 | 234 | ||
| 235 | void InitializePreemption(KernelCore& kernel) { | 235 | void InitializePreemption(KernelCore& kernel) { |
| 236 | preemption_event = Core::Timing::CreateEvent( | 236 | preemption_event = Core::Timing::CreateEvent( |
| 237 | "PreemptionCallback", [this, &kernel](std::uintptr_t, std::chrono::nanoseconds) { | 237 | "PreemptionCallback", |
| 238 | [this, &kernel](std::uintptr_t, s64 time, | ||
| 239 | std::chrono::nanoseconds) -> std::optional<std::chrono::nanoseconds> { | ||
| 238 | { | 240 | { |
| 239 | KScopedSchedulerLock lock(kernel); | 241 | KScopedSchedulerLock lock(kernel); |
| 240 | global_scheduler_context->PreemptThreads(); | 242 | global_scheduler_context->PreemptThreads(); |
| 241 | } | 243 | } |
| 242 | const auto time_interval = std::chrono::nanoseconds{std::chrono::milliseconds(10)}; | 244 | return std::nullopt; |
| 243 | system.CoreTiming().ScheduleEvent(time_interval, preemption_event); | ||
| 244 | }); | 245 | }); |
| 245 | 246 | ||
| 246 | const auto time_interval = std::chrono::nanoseconds{std::chrono::milliseconds(10)}; | 247 | const auto time_interval = std::chrono::nanoseconds{std::chrono::milliseconds(10)}; |
| 247 | system.CoreTiming().ScheduleEvent(time_interval, preemption_event); | 248 | system.CoreTiming().ScheduleLoopingEvent(std::chrono::nanoseconds(0), time_interval, |
| 249 | preemption_event); | ||
| 248 | } | 250 | } |
| 249 | 251 | ||
| 250 | void InitializeShutdownThreads() { | 252 | void InitializeShutdownThreads() { |
diff --git a/src/core/hle/kernel/time_manager.cpp b/src/core/hle/kernel/time_manager.cpp index 2724c3782..5ee72c432 100644 --- a/src/core/hle/kernel/time_manager.cpp +++ b/src/core/hle/kernel/time_manager.cpp | |||
| @@ -11,15 +11,17 @@ | |||
| 11 | namespace Kernel { | 11 | namespace Kernel { |
| 12 | 12 | ||
| 13 | TimeManager::TimeManager(Core::System& system_) : system{system_} { | 13 | TimeManager::TimeManager(Core::System& system_) : system{system_} { |
| 14 | time_manager_event_type = | 14 | time_manager_event_type = Core::Timing::CreateEvent( |
| 15 | Core::Timing::CreateEvent("Kernel::TimeManagerCallback", | 15 | "Kernel::TimeManagerCallback", |
| 16 | [this](std::uintptr_t thread_handle, std::chrono::nanoseconds) { | 16 | [this](std::uintptr_t thread_handle, s64 time, |
| 17 | KThread* thread = reinterpret_cast<KThread*>(thread_handle); | 17 | std::chrono::nanoseconds) -> std::optional<std::chrono::nanoseconds> { |
| 18 | { | 18 | KThread* thread = reinterpret_cast<KThread*>(thread_handle); |
| 19 | KScopedSchedulerLock sl(system.Kernel()); | 19 | { |
| 20 | thread->OnTimer(); | 20 | KScopedSchedulerLock sl(system.Kernel()); |
| 21 | } | 21 | thread->OnTimer(); |
| 22 | }); | 22 | } |
| 23 | return std::nullopt; | ||
| 24 | }); | ||
| 23 | } | 25 | } |
| 24 | 26 | ||
| 25 | void TimeManager::ScheduleTimeEvent(KThread* thread, s64 nanoseconds) { | 27 | void TimeManager::ScheduleTimeEvent(KThread* thread, s64 nanoseconds) { |