11 changed files with 33 additions and 117 deletions
-
2src/core/CMakeLists.txt
-
1src/core/hle/kernel/k_address_arbiter.cpp
-
7src/core/hle/kernel/k_hardware_timer.cpp
-
8src/core/hle/kernel/k_hardware_timer.h
-
4src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h
-
6src/core/hle/kernel/k_thread.h
-
6src/core/hle/kernel/k_thread_queue.cpp
-
20src/core/hle/kernel/kernel.cpp
-
9src/core/hle/kernel/kernel.h
-
44src/core/hle/kernel/time_manager.cpp
-
41src/core/hle/kernel/time_manager.h
@ -1,44 +0,0 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
|
|||
#include "common/assert.h"
|
|||
#include "core/core.h"
|
|||
#include "core/core_timing.h"
|
|||
#include "core/hle/kernel/k_scheduler.h"
|
|||
#include "core/hle/kernel/k_thread.h"
|
|||
#include "core/hle/kernel/time_manager.h"
|
|||
|
|||
namespace Kernel { |
|||
|
|||
TimeManager::TimeManager(Core::System& system_) : system{system_} { |
|||
time_manager_event_type = Core::Timing::CreateEvent( |
|||
"Kernel::TimeManagerCallback", |
|||
[this](std::uintptr_t thread_handle, s64 time, |
|||
std::chrono::nanoseconds) -> std::optional<std::chrono::nanoseconds> { |
|||
KThread* thread = reinterpret_cast<KThread*>(thread_handle); |
|||
{ |
|||
KScopedSchedulerLock sl(system.Kernel()); |
|||
thread->OnTimer(); |
|||
} |
|||
return std::nullopt; |
|||
}); |
|||
} |
|||
|
|||
void TimeManager::ScheduleTimeEvent(KThread* thread, s64 nanoseconds) { |
|||
std::scoped_lock lock{mutex}; |
|||
if (nanoseconds > 0) { |
|||
ASSERT(thread); |
|||
ASSERT(thread->GetState() != ThreadState::Runnable); |
|||
system.CoreTiming().ScheduleEvent(std::chrono::nanoseconds{nanoseconds}, |
|||
time_manager_event_type, |
|||
reinterpret_cast<uintptr_t>(thread)); |
|||
} |
|||
} |
|||
|
|||
void TimeManager::UnscheduleTimeEvent(KThread* thread) { |
|||
std::scoped_lock lock{mutex}; |
|||
system.CoreTiming().UnscheduleEvent(time_manager_event_type, |
|||
reinterpret_cast<uintptr_t>(thread)); |
|||
} |
|||
|
|||
} // namespace Kernel
|
|||
@ -1,41 +0,0 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include <memory> |
|||
#include <mutex> |
|||
|
|||
namespace Core { |
|||
class System; |
|||
} // namespace Core |
|||
|
|||
namespace Core::Timing { |
|||
struct EventType; |
|||
} // namespace Core::Timing |
|||
|
|||
namespace Kernel { |
|||
|
|||
class KThread; |
|||
|
|||
/** |
|||
* The `TimeManager` takes care of scheduling time events on threads and executes their TimeUp |
|||
* method when the event is triggered. |
|||
*/ |
|||
class TimeManager { |
|||
public: |
|||
explicit TimeManager(Core::System& system); |
|||
|
|||
/// Schedule a time event on `timetask` thread that will expire in 'nanoseconds' |
|||
void ScheduleTimeEvent(KThread* time_task, s64 nanoseconds); |
|||
|
|||
/// Unschedule an existing time event |
|||
void UnscheduleTimeEvent(KThread* thread); |
|||
|
|||
private: |
|||
Core::System& system; |
|||
std::shared_ptr<Core::Timing::EventType> time_manager_event_type; |
|||
std::mutex mutex; |
|||
}; |
|||
|
|||
} // namespace Kernel |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue