Browse Source
Merge pull request #3416 from FernandoS27/schedule
Merge pull request #3416 from FernandoS27/schedule
Kernel: Refactors and Implement a TimeManager and SchedulerLocksnce_cpp
committed by
GitHub
12 changed files with 349 additions and 34 deletions
-
2src/core/CMakeLists.txt
-
8src/core/core.cpp
-
6src/core/core.h
-
2src/core/hardware_properties.h
-
121src/core/hle/kernel/kernel.cpp
-
37src/core/hle/kernel/kernel.h
-
56src/core/hle/kernel/scheduler.cpp
-
46src/core/hle/kernel/scheduler.h
-
12src/core/hle/kernel/thread.cpp
-
6src/core/hle/kernel/thread.h
-
44src/core/hle/kernel/time_manager.cpp
-
43src/core/hle/kernel/time_manager.h
@ -0,0 +1,44 @@ |
|||
// Copyright 2020 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "common/assert.h"
|
|||
#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) { |
|||
return; |
|||
} |
|||
system.CoreTiming().UnscheduleEvent(time_manager_event_type, event_handle); |
|||
} |
|||
|
|||
} // namespace Kernel
|
|||
@ -0,0 +1,43 @@ |
|||
// 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; |
|||
|
|||
/** |
|||
* 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' |
|||
/// returns a non-invalid handle in `event_handle` if correctly scheduled |
|||
void ScheduleTimeEvent(Handle& event_handle, Thread* timetask, s64 nanoseconds); |
|||
|
|||
/// Unschedule an existing time event |
|||
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