diff options
| author | 2020-02-13 22:04:10 -0400 | |
|---|---|---|
| committer | 2020-02-22 11:18:06 -0400 | |
| commit | 0728dfef84ded5e68bdb3b0781ea00ca7cc85659 (patch) | |
| tree | 2f0746f6070e5e27eaa15612458acbd33a911d6a | |
| parent | Merge pull request #3444 from bunnei/linux-audio-fix (diff) | |
| download | yuzu-0728dfef84ded5e68bdb3b0781ea00ca7cc85659.tar.gz yuzu-0728dfef84ded5e68bdb3b0781ea00ca7cc85659.tar.xz yuzu-0728dfef84ded5e68bdb3b0781ea00ca7cc85659.zip | |
Kernel: Make global scheduler depend on KernelCore
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 14 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 7 | ||||
| -rw-r--r-- | src/core/hle/kernel/scheduler.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/scheduler.h | 5 |
4 files changed, 24 insertions, 8 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 4eb1d8703..d312ae31e 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -97,8 +97,8 @@ static void ThreadWakeupCallback(u64 thread_handle, [[maybe_unused]] s64 cycles_ | |||
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | struct KernelCore::Impl { | 99 | struct KernelCore::Impl { |
| 100 | explicit Impl(Core::System& system) | 100 | explicit Impl(Core::System& system, KernelCore& kernel) |
| 101 | : system{system}, global_scheduler{system}, synchronization{system} {} | 101 | : system{system}, global_scheduler{kernel}, synchronization{system} {} |
| 102 | 102 | ||
| 103 | void Initialize(KernelCore& kernel) { | 103 | void Initialize(KernelCore& kernel) { |
| 104 | Shutdown(); | 104 | Shutdown(); |
| @@ -215,7 +215,7 @@ struct KernelCore::Impl { | |||
| 215 | Core::System& system; | 215 | Core::System& system; |
| 216 | }; | 216 | }; |
| 217 | 217 | ||
| 218 | KernelCore::KernelCore(Core::System& system) : impl{std::make_unique<Impl>(system)} {} | 218 | KernelCore::KernelCore(Core::System& system) : impl{std::make_unique<Impl>(system, *this)} {} |
| 219 | KernelCore::~KernelCore() { | 219 | KernelCore::~KernelCore() { |
| 220 | Shutdown(); | 220 | Shutdown(); |
| 221 | } | 221 | } |
| @@ -265,6 +265,14 @@ const Kernel::GlobalScheduler& KernelCore::GlobalScheduler() const { | |||
| 265 | return impl->global_scheduler; | 265 | return impl->global_scheduler; |
| 266 | } | 266 | } |
| 267 | 267 | ||
| 268 | Kernel::Scheduler& KernelCore::Scheduler(std::size_t id) { | ||
| 269 | return impl->cores[id].Scheduler(); | ||
| 270 | } | ||
| 271 | |||
| 272 | const Kernel::Scheduler& KernelCore::Scheduler(std::size_t id) const { | ||
| 273 | return impl->cores[id].Scheduler(); | ||
| 274 | } | ||
| 275 | |||
| 268 | Kernel::PhysicalCore& KernelCore::PhysicalCore(std::size_t id) { | 276 | Kernel::PhysicalCore& KernelCore::PhysicalCore(std::size_t id) { |
| 269 | return impl->cores[id]; | 277 | return impl->cores[id]; |
| 270 | } | 278 | } |
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 1eede3063..0dfc559e9 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -29,6 +29,7 @@ class HandleTable; | |||
| 29 | class PhysicalCore; | 29 | class PhysicalCore; |
| 30 | class Process; | 30 | class Process; |
| 31 | class ResourceLimit; | 31 | class ResourceLimit; |
| 32 | class Scheduler; | ||
| 32 | class Synchronization; | 33 | class Synchronization; |
| 33 | class Thread; | 34 | class Thread; |
| 34 | 35 | ||
| @@ -87,6 +88,12 @@ public: | |||
| 87 | /// Gets the sole instance of the global scheduler | 88 | /// Gets the sole instance of the global scheduler |
| 88 | const Kernel::GlobalScheduler& GlobalScheduler() const; | 89 | const Kernel::GlobalScheduler& GlobalScheduler() const; |
| 89 | 90 | ||
| 91 | /// Gets the sole instance of the Scheduler assoviated with cpu core 'id' | ||
| 92 | Kernel::Scheduler& Scheduler(std::size_t id); | ||
| 93 | |||
| 94 | /// Gets the sole instance of the Scheduler assoviated with cpu core 'id' | ||
| 95 | const Kernel::Scheduler& Scheduler(std::size_t id) const; | ||
| 96 | |||
| 90 | /// Gets the an instance of the respective physical CPU core. | 97 | /// Gets the an instance of the respective physical CPU core. |
| 91 | Kernel::PhysicalCore& PhysicalCore(std::size_t id); | 98 | Kernel::PhysicalCore& PhysicalCore(std::size_t id); |
| 92 | 99 | ||
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp index 86f1421bf..118c1aa95 100644 --- a/src/core/hle/kernel/scheduler.cpp +++ b/src/core/hle/kernel/scheduler.cpp | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | 21 | ||
| 22 | namespace Kernel { | 22 | namespace Kernel { |
| 23 | 23 | ||
| 24 | GlobalScheduler::GlobalScheduler(Core::System& system) : system{system} {} | 24 | GlobalScheduler::GlobalScheduler(KernelCore& kernel) : kernel{kernel} {} |
| 25 | 25 | ||
| 26 | GlobalScheduler::~GlobalScheduler() = default; | 26 | GlobalScheduler::~GlobalScheduler() = default; |
| 27 | 27 | ||
| @@ -35,7 +35,7 @@ void GlobalScheduler::RemoveThread(std::shared_ptr<Thread> thread) { | |||
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | void GlobalScheduler::UnloadThread(std::size_t core) { | 37 | void GlobalScheduler::UnloadThread(std::size_t core) { |
| 38 | Scheduler& sched = system.Scheduler(core); | 38 | Scheduler& sched = kernel.Scheduler(core); |
| 39 | sched.UnloadThread(); | 39 | sched.UnloadThread(); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| @@ -50,7 +50,7 @@ void GlobalScheduler::SelectThread(std::size_t core) { | |||
| 50 | sched.is_context_switch_pending = sched.selected_thread != sched.current_thread; | 50 | sched.is_context_switch_pending = sched.selected_thread != sched.current_thread; |
| 51 | std::atomic_thread_fence(std::memory_order_seq_cst); | 51 | std::atomic_thread_fence(std::memory_order_seq_cst); |
| 52 | }; | 52 | }; |
| 53 | Scheduler& sched = system.Scheduler(core); | 53 | Scheduler& sched = kernel.Scheduler(core); |
| 54 | Thread* current_thread = nullptr; | 54 | Thread* current_thread = nullptr; |
| 55 | // Step 1: Get top thread in schedule queue. | 55 | // Step 1: Get top thread in schedule queue. |
| 56 | current_thread = scheduled_queue[core].empty() ? nullptr : scheduled_queue[core].front(); | 56 | current_thread = scheduled_queue[core].empty() ? nullptr : scheduled_queue[core].front(); |
diff --git a/src/core/hle/kernel/scheduler.h b/src/core/hle/kernel/scheduler.h index 96db049cb..283236d4c 100644 --- a/src/core/hle/kernel/scheduler.h +++ b/src/core/hle/kernel/scheduler.h | |||
| @@ -20,11 +20,12 @@ class System; | |||
| 20 | 20 | ||
| 21 | namespace Kernel { | 21 | namespace Kernel { |
| 22 | 22 | ||
| 23 | class KernelCore; | ||
| 23 | class Process; | 24 | class Process; |
| 24 | 25 | ||
| 25 | class GlobalScheduler final { | 26 | class GlobalScheduler final { |
| 26 | public: | 27 | public: |
| 27 | explicit GlobalScheduler(Core::System& system); | 28 | explicit GlobalScheduler(KernelCore& kernel); |
| 28 | ~GlobalScheduler(); | 29 | ~GlobalScheduler(); |
| 29 | 30 | ||
| 30 | /// Adds a new thread to the scheduler | 31 | /// Adds a new thread to the scheduler |
| @@ -160,7 +161,7 @@ private: | |||
| 160 | 161 | ||
| 161 | /// Lists all thread ids that aren't deleted/etc. | 162 | /// Lists all thread ids that aren't deleted/etc. |
| 162 | std::vector<std::shared_ptr<Thread>> thread_list; | 163 | std::vector<std::shared_ptr<Thread>> thread_list; |
| 163 | Core::System& system; | 164 | KernelCore& kernel; |
| 164 | }; | 165 | }; |
| 165 | 166 | ||
| 166 | class Scheduler final { | 167 | class Scheduler final { |