summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-02-13 22:04:10 -0400
committerGravatar FernandoS272020-02-22 11:18:06 -0400
commit0728dfef84ded5e68bdb3b0781ea00ca7cc85659 (patch)
tree2f0746f6070e5e27eaa15612458acbd33a911d6a
parentMerge pull request #3444 from bunnei/linux-audio-fix (diff)
downloadyuzu-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.cpp14
-rw-r--r--src/core/hle/kernel/kernel.h7
-rw-r--r--src/core/hle/kernel/scheduler.cpp6
-rw-r--r--src/core/hle/kernel/scheduler.h5
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
99struct KernelCore::Impl { 99struct 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
218KernelCore::KernelCore(Core::System& system) : impl{std::make_unique<Impl>(system)} {} 218KernelCore::KernelCore(Core::System& system) : impl{std::make_unique<Impl>(system, *this)} {}
219KernelCore::~KernelCore() { 219KernelCore::~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
268Kernel::Scheduler& KernelCore::Scheduler(std::size_t id) {
269 return impl->cores[id].Scheduler();
270}
271
272const Kernel::Scheduler& KernelCore::Scheduler(std::size_t id) const {
273 return impl->cores[id].Scheduler();
274}
275
268Kernel::PhysicalCore& KernelCore::PhysicalCore(std::size_t id) { 276Kernel::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;
29class PhysicalCore; 29class PhysicalCore;
30class Process; 30class Process;
31class ResourceLimit; 31class ResourceLimit;
32class Scheduler;
32class Synchronization; 33class Synchronization;
33class Thread; 34class 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
22namespace Kernel { 22namespace Kernel {
23 23
24GlobalScheduler::GlobalScheduler(Core::System& system) : system{system} {} 24GlobalScheduler::GlobalScheduler(KernelCore& kernel) : kernel{kernel} {}
25 25
26GlobalScheduler::~GlobalScheduler() = default; 26GlobalScheduler::~GlobalScheduler() = default;
27 27
@@ -35,7 +35,7 @@ void GlobalScheduler::RemoveThread(std::shared_ptr<Thread> thread) {
35} 35}
36 36
37void GlobalScheduler::UnloadThread(std::size_t core) { 37void 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
21namespace Kernel { 21namespace Kernel {
22 22
23class KernelCore;
23class Process; 24class Process;
24 25
25class GlobalScheduler final { 26class GlobalScheduler final {
26public: 27public:
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
166class Scheduler final { 167class Scheduler final {