diff options
| author | 2022-12-18 16:50:02 -0500 | |
|---|---|---|
| committer | 2022-12-18 20:21:24 -0500 | |
| commit | c770f25ccb4755f6a6861037fbfdfdac55191348 (patch) | |
| tree | eccc5140afa7a979800e8c27c1f4a2847adb283f | |
| parent | kernel: add KHardwareTimer (diff) | |
| download | yuzu-c770f25ccb4755f6a6861037fbfdfdac55191348.tar.gz yuzu-c770f25ccb4755f6a6861037fbfdfdac55191348.tar.xz yuzu-c770f25ccb4755f6a6861037fbfdfdac55191348.zip | |
kernel: remove TimeManager
Diffstat (limited to '')
| -rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_address_arbiter.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_hardware_timer.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_hardware_timer.h | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.h | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread_queue.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 20 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 9 | ||||
| -rw-r--r-- | src/core/hle/kernel/time_manager.cpp | 44 | ||||
| -rw-r--r-- | src/core/hle/kernel/time_manager.h | 41 |
11 files changed, 33 insertions, 117 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index dcccd0435..0252c8c31 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -294,8 +294,6 @@ add_library(core STATIC | |||
| 294 | hle/kernel/svc_common.h | 294 | hle/kernel/svc_common.h |
| 295 | hle/kernel/svc_types.h | 295 | hle/kernel/svc_types.h |
| 296 | hle/kernel/svc_wrap.h | 296 | hle/kernel/svc_wrap.h |
| 297 | hle/kernel/time_manager.cpp | ||
| 298 | hle/kernel/time_manager.h | ||
| 299 | hle/result.h | 297 | hle/result.h |
| 300 | hle/service/acc/acc.cpp | 298 | hle/service/acc/acc.cpp |
| 301 | hle/service/acc/acc.h | 299 | hle/service/acc/acc.h |
diff --git a/src/core/hle/kernel/k_address_arbiter.cpp b/src/core/hle/kernel/k_address_arbiter.cpp index f85b11557..a442a3b98 100644 --- a/src/core/hle/kernel/k_address_arbiter.cpp +++ b/src/core/hle/kernel/k_address_arbiter.cpp | |||
| @@ -10,7 +10,6 @@ | |||
| 10 | #include "core/hle/kernel/k_thread_queue.h" | 10 | #include "core/hle/kernel/k_thread_queue.h" |
| 11 | #include "core/hle/kernel/kernel.h" | 11 | #include "core/hle/kernel/kernel.h" |
| 12 | #include "core/hle/kernel/svc_results.h" | 12 | #include "core/hle/kernel/svc_results.h" |
| 13 | #include "core/hle/kernel/time_manager.h" | ||
| 14 | #include "core/memory.h" | 13 | #include "core/memory.h" |
| 15 | 14 | ||
| 16 | namespace Kernel { | 15 | namespace Kernel { |
diff --git a/src/core/hle/kernel/k_hardware_timer.cpp b/src/core/hle/kernel/k_hardware_timer.cpp index afa777f9a..6bba79ea0 100644 --- a/src/core/hle/kernel/k_hardware_timer.cpp +++ b/src/core/hle/kernel/k_hardware_timer.cpp | |||
| @@ -5,15 +5,13 @@ | |||
| 5 | #include "core/core_timing.h" | 5 | #include "core/core_timing.h" |
| 6 | #include "core/hle/kernel/k_hardware_timer.h" | 6 | #include "core/hle/kernel/k_hardware_timer.h" |
| 7 | #include "core/hle/kernel/k_scheduler.h" | 7 | #include "core/hle/kernel/k_scheduler.h" |
| 8 | #include "core/hle/kernel/time_manager.h" | ||
| 9 | 8 | ||
| 10 | namespace Kernel { | 9 | namespace Kernel { |
| 11 | 10 | ||
| 12 | void KHardwareTimer::Initialize() { | 11 | void KHardwareTimer::Initialize() { |
| 13 | // Create the timing callback to register with CoreTiming. | 12 | // Create the timing callback to register with CoreTiming. |
| 14 | m_event_type = Core::Timing::CreateEvent( | 13 | m_event_type = Core::Timing::CreateEvent( |
| 15 | "KHardwareTimer::Callback", | 14 | "KHardwareTimer::Callback", [](std::uintptr_t timer_handle, s64, std::chrono::nanoseconds) { |
| 16 | [this](std::uintptr_t timer_handle, s64, std::chrono::nanoseconds) { | ||
| 17 | reinterpret_cast<KHardwareTimer*>(timer_handle)->DoTask(); | 15 | reinterpret_cast<KHardwareTimer*>(timer_handle)->DoTask(); |
| 18 | return std::nullopt; | 16 | return std::nullopt; |
| 19 | }); | 17 | }); |
| @@ -21,6 +19,7 @@ void KHardwareTimer::Initialize() { | |||
| 21 | 19 | ||
| 22 | void KHardwareTimer::Finalize() { | 20 | void KHardwareTimer::Finalize() { |
| 23 | this->DisableInterrupt(); | 21 | this->DisableInterrupt(); |
| 22 | m_event_type.reset(); | ||
| 24 | } | 23 | } |
| 25 | 24 | ||
| 26 | void KHardwareTimer::DoTask() { | 25 | void KHardwareTimer::DoTask() { |
| @@ -64,7 +63,7 @@ void KHardwareTimer::DisableInterrupt() { | |||
| 64 | m_wakeup_time = std::numeric_limits<s64>::max(); | 63 | m_wakeup_time = std::numeric_limits<s64>::max(); |
| 65 | } | 64 | } |
| 66 | 65 | ||
| 67 | s64 KHardwareTimer::GetTick() { | 66 | s64 KHardwareTimer::GetTick() const { |
| 68 | return m_kernel.System().CoreTiming().GetGlobalTimeNs().count(); | 67 | return m_kernel.System().CoreTiming().GetGlobalTimeNs().count(); |
| 69 | } | 68 | } |
| 70 | 69 | ||
diff --git a/src/core/hle/kernel/k_hardware_timer.h b/src/core/hle/kernel/k_hardware_timer.h index 2c88876b3..00bef6ea1 100644 --- a/src/core/hle/kernel/k_hardware_timer.h +++ b/src/core/hle/kernel/k_hardware_timer.h | |||
| @@ -19,10 +19,14 @@ public: | |||
| 19 | void Initialize(); | 19 | void Initialize(); |
| 20 | void Finalize(); | 20 | void Finalize(); |
| 21 | 21 | ||
| 22 | s64 GetCount() { | 22 | s64 GetCount() const { |
| 23 | return GetTick(); | 23 | return GetTick(); |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | void RegisterTask(KTimerTask* task, s64 time_from_now) { | ||
| 27 | this->RegisterAbsoluteTask(task, GetTick() + time_from_now); | ||
| 28 | } | ||
| 29 | |||
| 26 | void RegisterAbsoluteTask(KTimerTask* task, s64 task_time) { | 30 | void RegisterAbsoluteTask(KTimerTask* task, s64 task_time) { |
| 27 | KScopedDisableDispatch dd{m_kernel}; | 31 | KScopedDisableDispatch dd{m_kernel}; |
| 28 | KScopedSpinLock lk{this->GetLock()}; | 32 | KScopedSpinLock lk{this->GetLock()}; |
| @@ -38,7 +42,7 @@ private: | |||
| 38 | void EnableInterrupt(s64 wakeup_time); | 42 | void EnableInterrupt(s64 wakeup_time); |
| 39 | void DisableInterrupt(); | 43 | void DisableInterrupt(); |
| 40 | bool GetInterruptEnabled(); | 44 | bool GetInterruptEnabled(); |
| 41 | s64 GetTick(); | 45 | s64 GetTick() const; |
| 42 | void DoTask(); | 46 | void DoTask(); |
| 43 | 47 | ||
| 44 | private: | 48 | private: |
diff --git a/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h b/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h index 76c095e69..76db65a4d 100644 --- a/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h +++ b/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h | |||
| @@ -5,9 +5,9 @@ | |||
| 5 | 5 | ||
| 6 | #include "common/common_types.h" | 6 | #include "common/common_types.h" |
| 7 | #include "core/hle/kernel/global_scheduler_context.h" | 7 | #include "core/hle/kernel/global_scheduler_context.h" |
| 8 | #include "core/hle/kernel/k_hardware_timer.h" | ||
| 8 | #include "core/hle/kernel/k_thread.h" | 9 | #include "core/hle/kernel/k_thread.h" |
| 9 | #include "core/hle/kernel/kernel.h" | 10 | #include "core/hle/kernel/kernel.h" |
| 10 | #include "core/hle/kernel/time_manager.h" | ||
| 11 | 11 | ||
| 12 | namespace Kernel { | 12 | namespace Kernel { |
| 13 | 13 | ||
| @@ -22,7 +22,7 @@ public: | |||
| 22 | ~KScopedSchedulerLockAndSleep() { | 22 | ~KScopedSchedulerLockAndSleep() { |
| 23 | // Register the sleep. | 23 | // Register the sleep. |
| 24 | if (timeout_tick > 0) { | 24 | if (timeout_tick > 0) { |
| 25 | kernel.TimeManager().ScheduleTimeEvent(thread, timeout_tick); | 25 | kernel.HardwareTimer().RegisterTask(thread, timeout_tick); |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | // Unlock the scheduler. | 28 | // Unlock the scheduler. |
diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h index 1320451c0..7cd94a340 100644 --- a/src/core/hle/kernel/k_thread.h +++ b/src/core/hle/kernel/k_thread.h | |||
| @@ -662,7 +662,7 @@ private: | |||
| 662 | union SyncObjectBuffer { | 662 | union SyncObjectBuffer { |
| 663 | std::array<KSynchronizationObject*, Svc::ArgumentHandleCountMax> sync_objects{}; | 663 | std::array<KSynchronizationObject*, Svc::ArgumentHandleCountMax> sync_objects{}; |
| 664 | std::array<Handle, | 664 | std::array<Handle, |
| 665 | Svc::ArgumentHandleCountMax * (sizeof(KSynchronizationObject*) / sizeof(Handle))> | 665 | Svc::ArgumentHandleCountMax*(sizeof(KSynchronizationObject*) / sizeof(Handle))> |
| 666 | handles; | 666 | handles; |
| 667 | constexpr SyncObjectBuffer() {} | 667 | constexpr SyncObjectBuffer() {} |
| 668 | }; | 668 | }; |
| @@ -683,8 +683,10 @@ private: | |||
| 683 | }; | 683 | }; |
| 684 | 684 | ||
| 685 | template <typename T> | 685 | template <typename T> |
| 686 | requires(std::same_as<T, KThread> || std::same_as<T, RedBlackKeyType>) | 686 | requires( |
| 687 | static constexpr int Compare(const T& lhs, const KThread& rhs) { | 687 | std::same_as<T, KThread> || |
| 688 | std::same_as<T, RedBlackKeyType>) static constexpr int Compare(const T& lhs, | ||
| 689 | const KThread& rhs) { | ||
| 688 | const u64 l_key = lhs.GetConditionVariableKey(); | 690 | const u64 l_key = lhs.GetConditionVariableKey(); |
| 689 | const u64 r_key = rhs.GetConditionVariableKey(); | 691 | const u64 r_key = rhs.GetConditionVariableKey(); |
| 690 | 692 | ||
diff --git a/src/core/hle/kernel/k_thread_queue.cpp b/src/core/hle/kernel/k_thread_queue.cpp index 9f4e081ba..5f1dc97eb 100644 --- a/src/core/hle/kernel/k_thread_queue.cpp +++ b/src/core/hle/kernel/k_thread_queue.cpp | |||
| @@ -1,9 +1,9 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project | 1 | // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project |
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include "core/hle/kernel/k_hardware_timer.h" | ||
| 4 | #include "core/hle/kernel/k_thread_queue.h" | 5 | #include "core/hle/kernel/k_thread_queue.h" |
| 5 | #include "core/hle/kernel/kernel.h" | 6 | #include "core/hle/kernel/kernel.h" |
| 6 | #include "core/hle/kernel/time_manager.h" | ||
| 7 | 7 | ||
| 8 | namespace Kernel { | 8 | namespace Kernel { |
| 9 | 9 | ||
| @@ -22,7 +22,7 @@ void KThreadQueue::EndWait(KThread* waiting_thread, Result wait_result) { | |||
| 22 | waiting_thread->ClearWaitQueue(); | 22 | waiting_thread->ClearWaitQueue(); |
| 23 | 23 | ||
| 24 | // Cancel the thread task. | 24 | // Cancel the thread task. |
| 25 | kernel.TimeManager().UnscheduleTimeEvent(waiting_thread); | 25 | kernel.HardwareTimer().CancelTask(waiting_thread); |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | void KThreadQueue::CancelWait(KThread* waiting_thread, Result wait_result, bool cancel_timer_task) { | 28 | void KThreadQueue::CancelWait(KThread* waiting_thread, Result wait_result, bool cancel_timer_task) { |
| @@ -37,7 +37,7 @@ void KThreadQueue::CancelWait(KThread* waiting_thread, Result wait_result, bool | |||
| 37 | 37 | ||
| 38 | // Cancel the thread task. | 38 | // Cancel the thread task. |
| 39 | if (cancel_timer_task) { | 39 | if (cancel_timer_task) { |
| 40 | kernel.TimeManager().UnscheduleTimeEvent(waiting_thread); | 40 | kernel.HardwareTimer().CancelTask(waiting_thread); |
| 41 | } | 41 | } |
| 42 | } | 42 | } |
| 43 | 43 | ||
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 0eb74a422..b75bac5df 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include "core/hle/kernel/k_client_port.h" | 26 | #include "core/hle/kernel/k_client_port.h" |
| 27 | #include "core/hle/kernel/k_dynamic_resource_manager.h" | 27 | #include "core/hle/kernel/k_dynamic_resource_manager.h" |
| 28 | #include "core/hle/kernel/k_handle_table.h" | 28 | #include "core/hle/kernel/k_handle_table.h" |
| 29 | #include "core/hle/kernel/k_hardware_timer.h" | ||
| 29 | #include "core/hle/kernel/k_memory_layout.h" | 30 | #include "core/hle/kernel/k_memory_layout.h" |
| 30 | #include "core/hle/kernel/k_memory_manager.h" | 31 | #include "core/hle/kernel/k_memory_manager.h" |
| 31 | #include "core/hle/kernel/k_page_buffer.h" | 32 | #include "core/hle/kernel/k_page_buffer.h" |
| @@ -39,7 +40,6 @@ | |||
| 39 | #include "core/hle/kernel/kernel.h" | 40 | #include "core/hle/kernel/kernel.h" |
| 40 | #include "core/hle/kernel/physical_core.h" | 41 | #include "core/hle/kernel/physical_core.h" |
| 41 | #include "core/hle/kernel/service_thread.h" | 42 | #include "core/hle/kernel/service_thread.h" |
| 42 | #include "core/hle/kernel/time_manager.h" | ||
| 43 | #include "core/hle/result.h" | 43 | #include "core/hle/result.h" |
| 44 | #include "core/hle/service/sm/sm.h" | 44 | #include "core/hle/service/sm/sm.h" |
| 45 | #include "core/memory.h" | 45 | #include "core/memory.h" |
| @@ -55,7 +55,7 @@ struct KernelCore::Impl { | |||
| 55 | static constexpr size_t ReservedDynamicPageCount = 64; | 55 | static constexpr size_t ReservedDynamicPageCount = 64; |
| 56 | 56 | ||
| 57 | explicit Impl(Core::System& system_, KernelCore& kernel_) | 57 | explicit Impl(Core::System& system_, KernelCore& kernel_) |
| 58 | : time_manager{system_}, service_threads_manager{1, "ServiceThreadsManager"}, | 58 | : service_threads_manager{1, "ServiceThreadsManager"}, |
| 59 | service_thread_barrier{2}, system{system_} {} | 59 | service_thread_barrier{2}, system{system_} {} |
| 60 | 60 | ||
| 61 | void SetMulticore(bool is_multi) { | 61 | void SetMulticore(bool is_multi) { |
| @@ -63,6 +63,9 @@ struct KernelCore::Impl { | |||
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | void Initialize(KernelCore& kernel) { | 65 | void Initialize(KernelCore& kernel) { |
| 66 | hardware_timer = std::make_unique<Kernel::KHardwareTimer>(kernel); | ||
| 67 | hardware_timer->Initialize(); | ||
| 68 | |||
| 66 | global_object_list_container = std::make_unique<KAutoObjectWithListContainer>(kernel); | 69 | global_object_list_container = std::make_unique<KAutoObjectWithListContainer>(kernel); |
| 67 | global_scheduler_context = std::make_unique<Kernel::GlobalSchedulerContext>(kernel); | 70 | global_scheduler_context = std::make_unique<Kernel::GlobalSchedulerContext>(kernel); |
| 68 | global_handle_table = std::make_unique<Kernel::KHandleTable>(kernel); | 71 | global_handle_table = std::make_unique<Kernel::KHandleTable>(kernel); |
| @@ -193,6 +196,9 @@ struct KernelCore::Impl { | |||
| 193 | // Ensure that the object list container is finalized and properly shutdown. | 196 | // Ensure that the object list container is finalized and properly shutdown. |
| 194 | global_object_list_container->Finalize(); | 197 | global_object_list_container->Finalize(); |
| 195 | global_object_list_container.reset(); | 198 | global_object_list_container.reset(); |
| 199 | |||
| 200 | hardware_timer->Finalize(); | ||
| 201 | hardware_timer.reset(); | ||
| 196 | } | 202 | } |
| 197 | 203 | ||
| 198 | void CloseServices() { | 204 | void CloseServices() { |
| @@ -832,7 +838,7 @@ struct KernelCore::Impl { | |||
| 832 | std::vector<KProcess*> process_list; | 838 | std::vector<KProcess*> process_list; |
| 833 | std::atomic<KProcess*> current_process{}; | 839 | std::atomic<KProcess*> current_process{}; |
| 834 | std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context; | 840 | std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context; |
| 835 | Kernel::TimeManager time_manager; | 841 | std::unique_ptr<Kernel::KHardwareTimer> hardware_timer; |
| 836 | 842 | ||
| 837 | Init::KSlabResourceCounts slab_resource_counts{}; | 843 | Init::KSlabResourceCounts slab_resource_counts{}; |
| 838 | KResourceLimit* system_resource_limit{}; | 844 | KResourceLimit* system_resource_limit{}; |
| @@ -1019,12 +1025,8 @@ Kernel::KScheduler* KernelCore::CurrentScheduler() { | |||
| 1019 | return impl->schedulers[core_id].get(); | 1025 | return impl->schedulers[core_id].get(); |
| 1020 | } | 1026 | } |
| 1021 | 1027 | ||
| 1022 | Kernel::TimeManager& KernelCore::TimeManager() { | 1028 | Kernel::KHardwareTimer& KernelCore::HardwareTimer() { |
| 1023 | return impl->time_manager; | 1029 | return *impl->hardware_timer; |
| 1024 | } | ||
| 1025 | |||
| 1026 | const Kernel::TimeManager& KernelCore::TimeManager() const { | ||
| 1027 | return impl->time_manager; | ||
| 1028 | } | 1030 | } |
| 1029 | 1031 | ||
| 1030 | Core::ExclusiveMonitor& KernelCore::GetExclusiveMonitor() { | 1032 | Core::ExclusiveMonitor& KernelCore::GetExclusiveMonitor() { |
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 2e22fe0f6..8d22f8d2c 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -39,6 +39,7 @@ class KDynamicPageManager; | |||
| 39 | class KEvent; | 39 | class KEvent; |
| 40 | class KEventInfo; | 40 | class KEventInfo; |
| 41 | class KHandleTable; | 41 | class KHandleTable; |
| 42 | class KHardwareTimer; | ||
| 42 | class KLinkedListNode; | 43 | class KLinkedListNode; |
| 43 | class KMemoryLayout; | 44 | class KMemoryLayout; |
| 44 | class KMemoryManager; | 45 | class KMemoryManager; |
| @@ -63,7 +64,6 @@ class KCodeMemory; | |||
| 63 | class PhysicalCore; | 64 | class PhysicalCore; |
| 64 | class ServiceThread; | 65 | class ServiceThread; |
| 65 | class Synchronization; | 66 | class Synchronization; |
| 66 | class TimeManager; | ||
| 67 | 67 | ||
| 68 | using ServiceInterfaceFactory = | 68 | using ServiceInterfaceFactory = |
| 69 | std::function<KClientPort&(Service::SM::ServiceManager&, Core::System&)>; | 69 | std::function<KClientPort&(Service::SM::ServiceManager&, Core::System&)>; |
| @@ -175,11 +175,8 @@ public: | |||
| 175 | /// Gets the an instance of the current physical CPU core. | 175 | /// Gets the an instance of the current physical CPU core. |
| 176 | const Kernel::PhysicalCore& CurrentPhysicalCore() const; | 176 | const Kernel::PhysicalCore& CurrentPhysicalCore() const; |
| 177 | 177 | ||
| 178 | /// Gets the an instance of the TimeManager Interface. | 178 | /// Gets the an instance of the hardware timer. |
| 179 | Kernel::TimeManager& TimeManager(); | 179 | Kernel::KHardwareTimer& HardwareTimer(); |
| 180 | |||
| 181 | /// Gets the an instance of the TimeManager Interface. | ||
| 182 | const Kernel::TimeManager& TimeManager() const; | ||
| 183 | 180 | ||
| 184 | /// Stops execution of 'id' core, in order to reschedule a new thread. | 181 | /// Stops execution of 'id' core, in order to reschedule a new thread. |
| 185 | void PrepareReschedule(std::size_t id); | 182 | void PrepareReschedule(std::size_t id); |
diff --git a/src/core/hle/kernel/time_manager.cpp b/src/core/hle/kernel/time_manager.cpp deleted file mode 100644 index 5ee72c432..000000000 --- a/src/core/hle/kernel/time_manager.cpp +++ /dev/null | |||
| @@ -1,44 +0,0 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "common/assert.h" | ||
| 5 | #include "core/core.h" | ||
| 6 | #include "core/core_timing.h" | ||
| 7 | #include "core/hle/kernel/k_scheduler.h" | ||
| 8 | #include "core/hle/kernel/k_thread.h" | ||
| 9 | #include "core/hle/kernel/time_manager.h" | ||
| 10 | |||
| 11 | namespace Kernel { | ||
| 12 | |||
| 13 | TimeManager::TimeManager(Core::System& system_) : system{system_} { | ||
| 14 | time_manager_event_type = Core::Timing::CreateEvent( | ||
| 15 | "Kernel::TimeManagerCallback", | ||
| 16 | [this](std::uintptr_t thread_handle, s64 time, | ||
| 17 | std::chrono::nanoseconds) -> std::optional<std::chrono::nanoseconds> { | ||
| 18 | KThread* thread = reinterpret_cast<KThread*>(thread_handle); | ||
| 19 | { | ||
| 20 | KScopedSchedulerLock sl(system.Kernel()); | ||
| 21 | thread->OnTimer(); | ||
| 22 | } | ||
| 23 | return std::nullopt; | ||
| 24 | }); | ||
| 25 | } | ||
| 26 | |||
| 27 | void TimeManager::ScheduleTimeEvent(KThread* thread, s64 nanoseconds) { | ||
| 28 | std::scoped_lock lock{mutex}; | ||
| 29 | if (nanoseconds > 0) { | ||
| 30 | ASSERT(thread); | ||
| 31 | ASSERT(thread->GetState() != ThreadState::Runnable); | ||
| 32 | system.CoreTiming().ScheduleEvent(std::chrono::nanoseconds{nanoseconds}, | ||
| 33 | time_manager_event_type, | ||
| 34 | reinterpret_cast<uintptr_t>(thread)); | ||
| 35 | } | ||
| 36 | } | ||
| 37 | |||
| 38 | void TimeManager::UnscheduleTimeEvent(KThread* thread) { | ||
| 39 | std::scoped_lock lock{mutex}; | ||
| 40 | system.CoreTiming().UnscheduleEvent(time_manager_event_type, | ||
| 41 | reinterpret_cast<uintptr_t>(thread)); | ||
| 42 | } | ||
| 43 | |||
| 44 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/time_manager.h b/src/core/hle/kernel/time_manager.h deleted file mode 100644 index 94d16b3b4..000000000 --- a/src/core/hle/kernel/time_manager.h +++ /dev/null | |||
| @@ -1,41 +0,0 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include <memory> | ||
| 7 | #include <mutex> | ||
| 8 | |||
| 9 | namespace Core { | ||
| 10 | class System; | ||
| 11 | } // namespace Core | ||
| 12 | |||
| 13 | namespace Core::Timing { | ||
| 14 | struct EventType; | ||
| 15 | } // namespace Core::Timing | ||
| 16 | |||
| 17 | namespace Kernel { | ||
| 18 | |||
| 19 | class KThread; | ||
| 20 | |||
| 21 | /** | ||
| 22 | * The `TimeManager` takes care of scheduling time events on threads and executes their TimeUp | ||
| 23 | * method when the event is triggered. | ||
| 24 | */ | ||
| 25 | class TimeManager { | ||
| 26 | public: | ||
| 27 | explicit TimeManager(Core::System& system); | ||
| 28 | |||
| 29 | /// Schedule a time event on `timetask` thread that will expire in 'nanoseconds' | ||
| 30 | void ScheduleTimeEvent(KThread* time_task, s64 nanoseconds); | ||
| 31 | |||
| 32 | /// Unschedule an existing time event | ||
| 33 | void UnscheduleTimeEvent(KThread* thread); | ||
| 34 | |||
| 35 | private: | ||
| 36 | Core::System& system; | ||
| 37 | std::shared_ptr<Core::Timing::EventType> time_manager_event_type; | ||
| 38 | std::mutex mutex; | ||
| 39 | }; | ||
| 40 | |||
| 41 | } // namespace Kernel | ||