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