diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-02-14 16:44:31 +0100 |
---|---|---|
committer | FernandoS27 <fsahmkow27@gmail.com> | 2020-02-22 16:18:07 +0100 |
commit | ea956c823e5e6b7f6fd16780b613263d6fadd5da (patch) | |
tree | c5ce0c9e42f30b6342c064c50b0c712bf05cf5b0 /src/core/hle/kernel/scheduler.h | |
parent | Kernel: Implement Time Manager. (diff) | |
download | yuzu-ea956c823e5e6b7f6fd16780b613263d6fadd5da.tar yuzu-ea956c823e5e6b7f6fd16780b613263d6fadd5da.tar.gz yuzu-ea956c823e5e6b7f6fd16780b613263d6fadd5da.tar.bz2 yuzu-ea956c823e5e6b7f6fd16780b613263d6fadd5da.tar.lz yuzu-ea956c823e5e6b7f6fd16780b613263d6fadd5da.tar.xz yuzu-ea956c823e5e6b7f6fd16780b613263d6fadd5da.tar.zst yuzu-ea956c823e5e6b7f6fd16780b613263d6fadd5da.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/kernel/scheduler.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/core/hle/kernel/scheduler.h b/src/core/hle/kernel/scheduler.h index 283236d4c..a779bb70f 100644 --- a/src/core/hle/kernel/scheduler.h +++ b/src/core/hle/kernel/scheduler.h @@ -6,6 +6,7 @@ #include <atomic> #include <memory> +#include <mutex> #include <vector> #include "common/common_types.h" @@ -22,6 +23,7 @@ namespace Kernel { class KernelCore; class Process; +class SchedulerLock; class GlobalScheduler final { public: @@ -139,6 +141,14 @@ public: void Shutdown(); private: + friend class SchedulerLock; + + /// Lock the scheduler to the current thread. + void Lock(); + + /// Unlocks the scheduler, reselects threads, interrupts cores for rescheduling + /// and reschedules current core if needed. + void Unlock(); /** * Transfers a thread into an specific core. If the destination_core is -1 * it will be unscheduled from its source code and added into its suggested @@ -159,6 +169,11 @@ private: // ordered from Core 0 to Core 3. std::array<u32, Core::Hardware::NUM_CPU_CORES> preemption_priorities = {59, 59, 59, 62}; + /// Scheduler lock mechanisms. + std::mutex inner_lock{}; // TODO(Blinkhawk): Replace for a SpinLock + std::atomic<std::size_t> scope_lock{}; + Core::EmuThreadHandle current_owner{Core::EmuThreadHandle::InvalidHandle()}; + /// Lists all thread ids that aren't deleted/etc. std::vector<std::shared_ptr<Thread>> thread_list; KernelCore& kernel; @@ -228,4 +243,30 @@ private: bool is_context_switch_pending = false; }; +class SchedulerLock { +public: + SchedulerLock(KernelCore& kernel); + ~SchedulerLock(); + +protected: + KernelCore& kernel; +}; + +class SchedulerLockAndSleep : public SchedulerLock { +public: + SchedulerLockAndSleep(KernelCore& kernel, Handle& event_handle, Thread* time_task, + s64 nanoseconds); + ~SchedulerLockAndSleep(); + + void CancelSleep() { + sleep_cancelled = true; + } + +private: + Handle& event_handle; + Thread* time_task; + s64 nanoseconds; + bool sleep_cancelled{}; +}; + } // namespace Kernel |