diff options
| -rw-r--r-- | src/core/core.cpp | 16 | ||||
| -rw-r--r-- | src/core/core.h | 8 | ||||
| -rw-r--r-- | src/core/core_cpu.cpp | 2 | ||||
| -rw-r--r-- | src/core/core_cpu.h | 10 | ||||
| -rw-r--r-- | src/core/gdbstub/gdbstub.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/address_arbiter.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 16 | ||||
| -rw-r--r-- | src/yuzu/debugger/wait_tree.cpp | 9 |
10 files changed, 50 insertions, 31 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index 52433731a..3c57a62ec 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -355,12 +355,15 @@ std::size_t System::CurrentCoreIndex() { | |||
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | Kernel::Scheduler& System::CurrentScheduler() { | 357 | Kernel::Scheduler& System::CurrentScheduler() { |
| 358 | return *CurrentCpuCore().Scheduler(); | 358 | return CurrentCpuCore().Scheduler(); |
| 359 | } | 359 | } |
| 360 | 360 | ||
| 361 | const std::shared_ptr<Kernel::Scheduler>& System::Scheduler(std::size_t core_index) { | 361 | Kernel::Scheduler& System::Scheduler(std::size_t core_index) { |
| 362 | ASSERT(core_index < NUM_CPU_CORES); | 362 | return CpuCore(core_index).Scheduler(); |
| 363 | return impl->cpu_cores[core_index]->Scheduler(); | 363 | } |
| 364 | |||
| 365 | const Kernel::Scheduler& System::Scheduler(std::size_t core_index) const { | ||
| 366 | return CpuCore(core_index).Scheduler(); | ||
| 364 | } | 367 | } |
| 365 | 368 | ||
| 366 | Kernel::Process* System::CurrentProcess() { | 369 | Kernel::Process* System::CurrentProcess() { |
| @@ -381,6 +384,11 @@ Cpu& System::CpuCore(std::size_t core_index) { | |||
| 381 | return *impl->cpu_cores[core_index]; | 384 | return *impl->cpu_cores[core_index]; |
| 382 | } | 385 | } |
| 383 | 386 | ||
| 387 | const Cpu& System::CpuCore(std::size_t core_index) const { | ||
| 388 | ASSERT(core_index < NUM_CPU_CORES); | ||
| 389 | return *impl->cpu_cores[core_index]; | ||
| 390 | } | ||
| 391 | |||
| 384 | ExclusiveMonitor& System::Monitor() { | 392 | ExclusiveMonitor& System::Monitor() { |
| 385 | return *impl->cpu_exclusive_monitor; | 393 | return *impl->cpu_exclusive_monitor; |
| 386 | } | 394 | } |
diff --git a/src/core/core.h b/src/core/core.h index ea4d53914..173be45f8 100644 --- a/src/core/core.h +++ b/src/core/core.h | |||
| @@ -156,6 +156,9 @@ public: | |||
| 156 | /// Gets a CPU interface to the CPU core with the specified index | 156 | /// Gets a CPU interface to the CPU core with the specified index |
| 157 | Cpu& CpuCore(std::size_t core_index); | 157 | Cpu& CpuCore(std::size_t core_index); |
| 158 | 158 | ||
| 159 | /// Gets a CPU interface to the CPU core with the specified index | ||
| 160 | const Cpu& CpuCore(std::size_t core_index) const; | ||
| 161 | |||
| 159 | /// Gets the exclusive monitor | 162 | /// Gets the exclusive monitor |
| 160 | ExclusiveMonitor& Monitor(); | 163 | ExclusiveMonitor& Monitor(); |
| 161 | 164 | ||
| @@ -172,7 +175,10 @@ public: | |||
| 172 | const VideoCore::RendererBase& Renderer() const; | 175 | const VideoCore::RendererBase& Renderer() const; |
| 173 | 176 | ||
| 174 | /// Gets the scheduler for the CPU core with the specified index | 177 | /// Gets the scheduler for the CPU core with the specified index |
| 175 | const std::shared_ptr<Kernel::Scheduler>& Scheduler(std::size_t core_index); | 178 | Kernel::Scheduler& Scheduler(std::size_t core_index); |
| 179 | |||
| 180 | /// Gets the scheduler for the CPU core with the specified index | ||
| 181 | const Kernel::Scheduler& Scheduler(std::size_t core_index) const; | ||
| 176 | 182 | ||
| 177 | /// Provides a pointer to the current process | 183 | /// Provides a pointer to the current process |
| 178 | Kernel::Process* CurrentProcess(); | 184 | Kernel::Process* CurrentProcess(); |
diff --git a/src/core/core_cpu.cpp b/src/core/core_cpu.cpp index 9f856ca6e..fffda8a99 100644 --- a/src/core/core_cpu.cpp +++ b/src/core/core_cpu.cpp | |||
| @@ -62,7 +62,7 @@ Cpu::Cpu(ExclusiveMonitor& exclusive_monitor, CpuBarrier& cpu_barrier, std::size | |||
| 62 | arm_interface = std::make_unique<ARM_Unicorn>(); | 62 | arm_interface = std::make_unique<ARM_Unicorn>(); |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | scheduler = std::make_shared<Kernel::Scheduler>(*arm_interface); | 65 | scheduler = std::make_unique<Kernel::Scheduler>(*arm_interface); |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | Cpu::~Cpu() = default; | 68 | Cpu::~Cpu() = default; |
diff --git a/src/core/core_cpu.h b/src/core/core_cpu.h index 3d62de7cb..1d2bdc6cd 100644 --- a/src/core/core_cpu.h +++ b/src/core/core_cpu.h | |||
| @@ -58,8 +58,12 @@ public: | |||
| 58 | return *arm_interface; | 58 | return *arm_interface; |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | const std::shared_ptr<Kernel::Scheduler>& Scheduler() const { | 61 | Kernel::Scheduler& Scheduler() { |
| 62 | return scheduler; | 62 | return *scheduler; |
| 63 | } | ||
| 64 | |||
| 65 | const Kernel::Scheduler& Scheduler() const { | ||
| 66 | return *scheduler; | ||
| 63 | } | 67 | } |
| 64 | 68 | ||
| 65 | bool IsMainCore() const { | 69 | bool IsMainCore() const { |
| @@ -77,7 +81,7 @@ private: | |||
| 77 | 81 | ||
| 78 | std::unique_ptr<ARM_Interface> arm_interface; | 82 | std::unique_ptr<ARM_Interface> arm_interface; |
| 79 | CpuBarrier& cpu_barrier; | 83 | CpuBarrier& cpu_barrier; |
| 80 | std::shared_ptr<Kernel::Scheduler> scheduler; | 84 | std::unique_ptr<Kernel::Scheduler> scheduler; |
| 81 | 85 | ||
| 82 | std::atomic<bool> reschedule_pending = false; | 86 | std::atomic<bool> reschedule_pending = false; |
| 83 | std::size_t core_index; | 87 | std::size_t core_index; |
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp index e961ef121..bdcc889e0 100644 --- a/src/core/gdbstub/gdbstub.cpp +++ b/src/core/gdbstub/gdbstub.cpp | |||
| @@ -207,7 +207,7 @@ void RegisterModule(std::string name, VAddr beg, VAddr end, bool add_elf_ext) { | |||
| 207 | 207 | ||
| 208 | static Kernel::Thread* FindThreadById(int id) { | 208 | static Kernel::Thread* FindThreadById(int id) { |
| 209 | for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) { | 209 | for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) { |
| 210 | const auto& threads = Core::System::GetInstance().Scheduler(core)->GetThreadList(); | 210 | const auto& threads = Core::System::GetInstance().Scheduler(core).GetThreadList(); |
| 211 | for (auto& thread : threads) { | 211 | for (auto& thread : threads) { |
| 212 | if (thread->GetThreadID() == static_cast<u32>(id)) { | 212 | if (thread->GetThreadID() == static_cast<u32>(id)) { |
| 213 | current_core = core; | 213 | current_core = core; |
| @@ -597,7 +597,7 @@ static void HandleQuery() { | |||
| 597 | } else if (strncmp(query, "fThreadInfo", strlen("fThreadInfo")) == 0) { | 597 | } else if (strncmp(query, "fThreadInfo", strlen("fThreadInfo")) == 0) { |
| 598 | std::string val = "m"; | 598 | std::string val = "m"; |
| 599 | for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) { | 599 | for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) { |
| 600 | const auto& threads = Core::System::GetInstance().Scheduler(core)->GetThreadList(); | 600 | const auto& threads = Core::System::GetInstance().Scheduler(core).GetThreadList(); |
| 601 | for (const auto& thread : threads) { | 601 | for (const auto& thread : threads) { |
| 602 | val += fmt::format("{:x}", thread->GetThreadID()); | 602 | val += fmt::format("{:x}", thread->GetThreadID()); |
| 603 | val += ","; | 603 | val += ","; |
| @@ -612,7 +612,7 @@ static void HandleQuery() { | |||
| 612 | buffer += "l<?xml version=\"1.0\"?>"; | 612 | buffer += "l<?xml version=\"1.0\"?>"; |
| 613 | buffer += "<threads>"; | 613 | buffer += "<threads>"; |
| 614 | for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) { | 614 | for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) { |
| 615 | const auto& threads = Core::System::GetInstance().Scheduler(core)->GetThreadList(); | 615 | const auto& threads = Core::System::GetInstance().Scheduler(core).GetThreadList(); |
| 616 | for (const auto& thread : threads) { | 616 | for (const auto& thread : threads) { |
| 617 | buffer += | 617 | buffer += |
| 618 | fmt::format(R"*(<thread id="{:x}" core="{:d}" name="Thread {:x}"></thread>)*", | 618 | fmt::format(R"*(<thread id="{:x}" core="{:d}" name="Thread {:x}"></thread>)*", |
diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp index ebf193930..57157beb4 100644 --- a/src/core/hle/kernel/address_arbiter.cpp +++ b/src/core/hle/kernel/address_arbiter.cpp | |||
| @@ -39,7 +39,7 @@ static std::vector<SharedPtr<Thread>> GetThreadsWaitingOnAddress(VAddr address) | |||
| 39 | std::vector<SharedPtr<Thread>>& waiting_threads, | 39 | std::vector<SharedPtr<Thread>>& waiting_threads, |
| 40 | VAddr arb_addr) { | 40 | VAddr arb_addr) { |
| 41 | const auto& scheduler = Core::System::GetInstance().Scheduler(core_index); | 41 | const auto& scheduler = Core::System::GetInstance().Scheduler(core_index); |
| 42 | const auto& thread_list = scheduler->GetThreadList(); | 42 | const auto& thread_list = scheduler.GetThreadList(); |
| 43 | 43 | ||
| 44 | for (const auto& thread : thread_list) { | 44 | for (const auto& thread : thread_list) { |
| 45 | if (thread->GetArbiterWaitAddress() == arb_addr) | 45 | if (thread->GetArbiterWaitAddress() == arb_addr) |
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index c80b2c507..073dd5a7d 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp | |||
| @@ -153,11 +153,11 @@ void Process::PrepareForTermination() { | |||
| 153 | } | 153 | } |
| 154 | }; | 154 | }; |
| 155 | 155 | ||
| 156 | auto& system = Core::System::GetInstance(); | 156 | const auto& system = Core::System::GetInstance(); |
| 157 | stop_threads(system.Scheduler(0)->GetThreadList()); | 157 | stop_threads(system.Scheduler(0).GetThreadList()); |
| 158 | stop_threads(system.Scheduler(1)->GetThreadList()); | 158 | stop_threads(system.Scheduler(1).GetThreadList()); |
| 159 | stop_threads(system.Scheduler(2)->GetThreadList()); | 159 | stop_threads(system.Scheduler(2).GetThreadList()); |
| 160 | stop_threads(system.Scheduler(3)->GetThreadList()); | 160 | stop_threads(system.Scheduler(3).GetThreadList()); |
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | /** | 163 | /** |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 7a053da1e..3e5f11f2b 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -809,7 +809,7 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target | |||
| 809 | std::vector<SharedPtr<Thread>>& waiting_threads, | 809 | std::vector<SharedPtr<Thread>>& waiting_threads, |
| 810 | VAddr condvar_addr) { | 810 | VAddr condvar_addr) { |
| 811 | const auto& scheduler = Core::System::GetInstance().Scheduler(core_index); | 811 | const auto& scheduler = Core::System::GetInstance().Scheduler(core_index); |
| 812 | const auto& thread_list = scheduler->GetThreadList(); | 812 | const auto& thread_list = scheduler.GetThreadList(); |
| 813 | 813 | ||
| 814 | for (const auto& thread : thread_list) { | 814 | for (const auto& thread : thread_list) { |
| 815 | if (thread->GetCondVarWaitAddress() == condvar_addr) | 815 | if (thread->GetCondVarWaitAddress() == condvar_addr) |
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 352ce1725..35ec98c1a 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp | |||
| @@ -97,7 +97,7 @@ void Thread::CancelWakeupTimer() { | |||
| 97 | static boost::optional<s32> GetNextProcessorId(u64 mask) { | 97 | static boost::optional<s32> GetNextProcessorId(u64 mask) { |
| 98 | for (s32 index = 0; index < Core::NUM_CPU_CORES; ++index) { | 98 | for (s32 index = 0; index < Core::NUM_CPU_CORES; ++index) { |
| 99 | if (mask & (1ULL << index)) { | 99 | if (mask & (1ULL << index)) { |
| 100 | if (!Core::System::GetInstance().Scheduler(index)->GetCurrentThread()) { | 100 | if (!Core::System::GetInstance().Scheduler(index).GetCurrentThread()) { |
| 101 | // Core is enabled and not running any threads, use this one | 101 | // Core is enabled and not running any threads, use this one |
| 102 | return index; | 102 | return index; |
| 103 | } | 103 | } |
| @@ -147,14 +147,14 @@ void Thread::ResumeFromWait() { | |||
| 147 | new_processor_id = processor_id; | 147 | new_processor_id = processor_id; |
| 148 | } | 148 | } |
| 149 | if (ideal_core != -1 && | 149 | if (ideal_core != -1 && |
| 150 | Core::System::GetInstance().Scheduler(ideal_core)->GetCurrentThread() == nullptr) { | 150 | Core::System::GetInstance().Scheduler(ideal_core).GetCurrentThread() == nullptr) { |
| 151 | new_processor_id = ideal_core; | 151 | new_processor_id = ideal_core; |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | ASSERT(*new_processor_id < 4); | 154 | ASSERT(*new_processor_id < 4); |
| 155 | 155 | ||
| 156 | // Add thread to new core's scheduler | 156 | // Add thread to new core's scheduler |
| 157 | auto& next_scheduler = Core::System::GetInstance().Scheduler(*new_processor_id); | 157 | auto* next_scheduler = &Core::System::GetInstance().Scheduler(*new_processor_id); |
| 158 | 158 | ||
| 159 | if (*new_processor_id != processor_id) { | 159 | if (*new_processor_id != processor_id) { |
| 160 | // Remove thread from previous core's scheduler | 160 | // Remove thread from previous core's scheduler |
| @@ -169,7 +169,7 @@ void Thread::ResumeFromWait() { | |||
| 169 | next_scheduler->ScheduleThread(this, current_priority); | 169 | next_scheduler->ScheduleThread(this, current_priority); |
| 170 | 170 | ||
| 171 | // Change thread's scheduler | 171 | // Change thread's scheduler |
| 172 | scheduler = next_scheduler.get(); | 172 | scheduler = next_scheduler; |
| 173 | 173 | ||
| 174 | Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule(); | 174 | Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule(); |
| 175 | } | 175 | } |
| @@ -230,7 +230,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(KernelCore& kernel, std::string name | |||
| 230 | thread->name = std::move(name); | 230 | thread->name = std::move(name); |
| 231 | thread->callback_handle = kernel.ThreadWakeupCallbackHandleTable().Create(thread).Unwrap(); | 231 | thread->callback_handle = kernel.ThreadWakeupCallbackHandleTable().Create(thread).Unwrap(); |
| 232 | thread->owner_process = &owner_process; | 232 | thread->owner_process = &owner_process; |
| 233 | thread->scheduler = Core::System::GetInstance().Scheduler(processor_id).get(); | 233 | thread->scheduler = &Core::System::GetInstance().Scheduler(processor_id); |
| 234 | thread->scheduler->AddThread(thread, priority); | 234 | thread->scheduler->AddThread(thread, priority); |
| 235 | thread->tls_address = thread->owner_process->MarkNextAvailableTLSSlotAsUsed(*thread); | 235 | thread->tls_address = thread->owner_process->MarkNextAvailableTLSSlotAsUsed(*thread); |
| 236 | 236 | ||
| @@ -375,14 +375,14 @@ void Thread::ChangeCore(u32 core, u64 mask) { | |||
| 375 | new_processor_id = processor_id; | 375 | new_processor_id = processor_id; |
| 376 | } | 376 | } |
| 377 | if (ideal_core != -1 && | 377 | if (ideal_core != -1 && |
| 378 | Core::System::GetInstance().Scheduler(ideal_core)->GetCurrentThread() == nullptr) { | 378 | Core::System::GetInstance().Scheduler(ideal_core).GetCurrentThread() == nullptr) { |
| 379 | new_processor_id = ideal_core; | 379 | new_processor_id = ideal_core; |
| 380 | } | 380 | } |
| 381 | 381 | ||
| 382 | ASSERT(*new_processor_id < 4); | 382 | ASSERT(*new_processor_id < 4); |
| 383 | 383 | ||
| 384 | // Add thread to new core's scheduler | 384 | // Add thread to new core's scheduler |
| 385 | auto& next_scheduler = Core::System::GetInstance().Scheduler(*new_processor_id); | 385 | auto* next_scheduler = &Core::System::GetInstance().Scheduler(*new_processor_id); |
| 386 | 386 | ||
| 387 | if (*new_processor_id != processor_id) { | 387 | if (*new_processor_id != processor_id) { |
| 388 | // Remove thread from previous core's scheduler | 388 | // Remove thread from previous core's scheduler |
| @@ -397,7 +397,7 @@ void Thread::ChangeCore(u32 core, u64 mask) { | |||
| 397 | next_scheduler->ScheduleThread(this, current_priority); | 397 | next_scheduler->ScheduleThread(this, current_priority); |
| 398 | 398 | ||
| 399 | // Change thread's scheduler | 399 | // Change thread's scheduler |
| 400 | scheduler = next_scheduler.get(); | 400 | scheduler = next_scheduler; |
| 401 | 401 | ||
| 402 | Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule(); | 402 | Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule(); |
| 403 | } | 403 | } |
diff --git a/src/yuzu/debugger/wait_tree.cpp b/src/yuzu/debugger/wait_tree.cpp index 4a09da685..7403e9ccd 100644 --- a/src/yuzu/debugger/wait_tree.cpp +++ b/src/yuzu/debugger/wait_tree.cpp | |||
| @@ -66,10 +66,11 @@ std::vector<std::unique_ptr<WaitTreeThread>> WaitTreeItem::MakeThreadItemList() | |||
| 66 | } | 66 | } |
| 67 | }; | 67 | }; |
| 68 | 68 | ||
| 69 | add_threads(Core::System::GetInstance().Scheduler(0)->GetThreadList()); | 69 | const auto& system = Core::System::GetInstance(); |
| 70 | add_threads(Core::System::GetInstance().Scheduler(1)->GetThreadList()); | 70 | add_threads(system.Scheduler(0).GetThreadList()); |
| 71 | add_threads(Core::System::GetInstance().Scheduler(2)->GetThreadList()); | 71 | add_threads(system.Scheduler(1).GetThreadList()); |
| 72 | add_threads(Core::System::GetInstance().Scheduler(3)->GetThreadList()); | 72 | add_threads(system.Scheduler(2).GetThreadList()); |
| 73 | add_threads(system.Scheduler(3).GetThreadList()); | ||
| 73 | 74 | ||
| 74 | return item_list; | 75 | return item_list; |
| 75 | } | 76 | } |