committed by
FernandoS27
5 changed files with 98 additions and 1 deletions
-
2src/core/CMakeLists.txt
-
12src/core/hle/kernel/kernel.cpp
-
7src/core/hle/kernel/kernel.h
-
42src/core/hle/kernel/time_manager.cpp
-
36src/core/hle/kernel/time_manager.h
@ -0,0 +1,42 @@ |
|||
// Copyright 2020 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "core/core.h"
|
|||
#include "core/core_timing.h"
|
|||
#include "core/core_timing_util.h"
|
|||
#include "core/hle/kernel/handle_table.h"
|
|||
#include "core/hle/kernel/kernel.h"
|
|||
#include "core/hle/kernel/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](u64 thread_handle, [[maybe_unused]] s64 cycles_late) { |
|||
Handle proper_handle = static_cast<Handle>(thread_handle); |
|||
std::shared_ptr<Thread> thread = |
|||
this->system.Kernel().RetrieveThreadFromGlobalHandleTable(proper_handle); |
|||
thread->ResumeFromWait(); |
|||
}); |
|||
} |
|||
|
|||
void TimeManager::ScheduleTimeEvent(Handle& event_handle, Thread* timetask, s64 nanoseconds) { |
|||
if (nanoseconds > 0) { |
|||
ASSERT(timetask); |
|||
event_handle = timetask->GetGlobalHandle(); |
|||
const s64 cycles = Core::Timing::nsToCycles(std::chrono::nanoseconds{nanoseconds}); |
|||
system.CoreTiming().ScheduleEvent(cycles, time_manager_event_type, event_handle); |
|||
} else { |
|||
event_handle = InvalidHandle; |
|||
} |
|||
} |
|||
|
|||
void TimeManager::UnscheduleTimeEvent(Handle event_handle) { |
|||
if (event_handle != InvalidHandle) { |
|||
system.CoreTiming().UnscheduleEvent(time_manager_event_type, event_handle); |
|||
} |
|||
} |
|||
|
|||
} // namespace Kernel
|
|||
@ -0,0 +1,36 @@ |
|||
// Copyright 2020 yuzu Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <memory> |
|||
|
|||
#include "core/hle/kernel/object.h" |
|||
|
|||
namespace Core { |
|||
class System; |
|||
} // namespace Core |
|||
|
|||
namespace Core::Timing { |
|||
struct EventType; |
|||
} // namespace Core::Timing |
|||
|
|||
namespace Kernel { |
|||
|
|||
class Thread; |
|||
|
|||
class TimeManager { |
|||
public: |
|||
TimeManager(Core::System& system); |
|||
|
|||
void ScheduleTimeEvent(Handle& event_handle, Thread* timetask, s64 nanoseconds); |
|||
|
|||
void UnscheduleTimeEvent(Handle event_handle); |
|||
|
|||
private: |
|||
Core::System& system; |
|||
std::shared_ptr<Core::Timing::EventType> time_manager_event_type; |
|||
}; |
|||
|
|||
} // namespace Kernel |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue