Parcourir la source

core_cpu: Make Cpu scheduler instances unique_ptrs instead of shared_ptrs

Lioncash il y a 7 ans
Parent
commit
5484742fda

+ 12 - 4
src/core/core.cpp

@@ -355,12 +355,15 @@ std::size_t System::CurrentCoreIndex() {
 }
 }
 
 
 Kernel::Scheduler& System::CurrentScheduler() {
 Kernel::Scheduler& System::CurrentScheduler() {
-    return *CurrentCpuCore().Scheduler();
+    return CurrentCpuCore().Scheduler();
 }
 }
 
 
-const std::shared_ptr<Kernel::Scheduler>& System::Scheduler(std::size_t core_index) {
-    ASSERT(core_index < NUM_CPU_CORES);
-    return impl->cpu_cores[core_index]->Scheduler();
+Kernel::Scheduler& System::Scheduler(std::size_t core_index) {
+    return CpuCore(core_index).Scheduler();
+}
+
+const Kernel::Scheduler& System::Scheduler(std::size_t core_index) const {
+    return CpuCore(core_index).Scheduler();
 }
 }
 
 
 Kernel::Process* System::CurrentProcess() {
 Kernel::Process* System::CurrentProcess() {
@@ -381,6 +384,11 @@ Cpu& System::CpuCore(std::size_t core_index) {
     return *impl->cpu_cores[core_index];
     return *impl->cpu_cores[core_index];
 }
 }
 
 
+const Cpu& System::CpuCore(std::size_t core_index) const {
+    ASSERT(core_index < NUM_CPU_CORES);
+    return *impl->cpu_cores[core_index];
+}
+
 ExclusiveMonitor& System::Monitor() {
 ExclusiveMonitor& System::Monitor() {
     return *impl->cpu_exclusive_monitor;
     return *impl->cpu_exclusive_monitor;
 }
 }

+ 7 - 1
src/core/core.h

@@ -156,6 +156,9 @@ public:
     /// Gets a CPU interface to the CPU core with the specified index
     /// Gets a CPU interface to the CPU core with the specified index
     Cpu& CpuCore(std::size_t core_index);
     Cpu& CpuCore(std::size_t core_index);
 
 
+    /// Gets a CPU interface to the CPU core with the specified index
+    const Cpu& CpuCore(std::size_t core_index) const;
+
     /// Gets the exclusive monitor
     /// Gets the exclusive monitor
     ExclusiveMonitor& Monitor();
     ExclusiveMonitor& Monitor();
 
 
@@ -172,7 +175,10 @@ public:
     const VideoCore::RendererBase& Renderer() const;
     const VideoCore::RendererBase& Renderer() const;
 
 
     /// Gets the scheduler for the CPU core with the specified index
     /// Gets the scheduler for the CPU core with the specified index
-    const std::shared_ptr<Kernel::Scheduler>& Scheduler(std::size_t core_index);
+    Kernel::Scheduler& Scheduler(std::size_t core_index);
+
+    /// Gets the scheduler for the CPU core with the specified index
+    const Kernel::Scheduler& Scheduler(std::size_t core_index) const;
 
 
     /// Provides a pointer to the current process
     /// Provides a pointer to the current process
     Kernel::Process* CurrentProcess();
     Kernel::Process* CurrentProcess();

+ 1 - 1
src/core/core_cpu.cpp

@@ -62,7 +62,7 @@ Cpu::Cpu(ExclusiveMonitor& exclusive_monitor, CpuBarrier& cpu_barrier, std::size
         arm_interface = std::make_unique<ARM_Unicorn>();
         arm_interface = std::make_unique<ARM_Unicorn>();
     }
     }
 
 
-    scheduler = std::make_shared<Kernel::Scheduler>(*arm_interface);
+    scheduler = std::make_unique<Kernel::Scheduler>(*arm_interface);
 }
 }
 
 
 Cpu::~Cpu() = default;
 Cpu::~Cpu() = default;

+ 7 - 3
src/core/core_cpu.h

@@ -58,8 +58,12 @@ public:
         return *arm_interface;
         return *arm_interface;
     }
     }
 
 
-    const std::shared_ptr<Kernel::Scheduler>& Scheduler() const {
-        return scheduler;
+    Kernel::Scheduler& Scheduler() {
+        return *scheduler;
+    }
+
+    const Kernel::Scheduler& Scheduler() const {
+        return *scheduler;
     }
     }
 
 
     bool IsMainCore() const {
     bool IsMainCore() const {
@@ -77,7 +81,7 @@ private:
 
 
     std::unique_ptr<ARM_Interface> arm_interface;
     std::unique_ptr<ARM_Interface> arm_interface;
     CpuBarrier& cpu_barrier;
     CpuBarrier& cpu_barrier;
-    std::shared_ptr<Kernel::Scheduler> scheduler;
+    std::unique_ptr<Kernel::Scheduler> scheduler;
 
 
     std::atomic<bool> reschedule_pending = false;
     std::atomic<bool> reschedule_pending = false;
     std::size_t core_index;
     std::size_t core_index;

+ 3 - 3
src/core/gdbstub/gdbstub.cpp

@@ -207,7 +207,7 @@ void RegisterModule(std::string name, VAddr beg, VAddr end, bool add_elf_ext) {
 
 
 static Kernel::Thread* FindThreadById(int id) {
 static Kernel::Thread* FindThreadById(int id) {
     for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) {
     for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) {
-        const auto& threads = Core::System::GetInstance().Scheduler(core)->GetThreadList();
+        const auto& threads = Core::System::GetInstance().Scheduler(core).GetThreadList();
         for (auto& thread : threads) {
         for (auto& thread : threads) {
             if (thread->GetThreadID() == static_cast<u32>(id)) {
             if (thread->GetThreadID() == static_cast<u32>(id)) {
                 current_core = core;
                 current_core = core;
@@ -597,7 +597,7 @@ static void HandleQuery() {
     } else if (strncmp(query, "fThreadInfo", strlen("fThreadInfo")) == 0) {
     } else if (strncmp(query, "fThreadInfo", strlen("fThreadInfo")) == 0) {
         std::string val = "m";
         std::string val = "m";
         for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) {
         for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) {
-            const auto& threads = Core::System::GetInstance().Scheduler(core)->GetThreadList();
+            const auto& threads = Core::System::GetInstance().Scheduler(core).GetThreadList();
             for (const auto& thread : threads) {
             for (const auto& thread : threads) {
                 val += fmt::format("{:x}", thread->GetThreadID());
                 val += fmt::format("{:x}", thread->GetThreadID());
                 val += ",";
                 val += ",";
@@ -612,7 +612,7 @@ static void HandleQuery() {
         buffer += "l<?xml version=\"1.0\"?>";
         buffer += "l<?xml version=\"1.0\"?>";
         buffer += "<threads>";
         buffer += "<threads>";
         for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) {
         for (u32 core = 0; core < Core::NUM_CPU_CORES; core++) {
-            const auto& threads = Core::System::GetInstance().Scheduler(core)->GetThreadList();
+            const auto& threads = Core::System::GetInstance().Scheduler(core).GetThreadList();
             for (const auto& thread : threads) {
             for (const auto& thread : threads) {
                 buffer +=
                 buffer +=
                     fmt::format(R"*(<thread id="{:x}" core="{:d}" name="Thread {:x}"></thread>)*",
                     fmt::format(R"*(<thread id="{:x}" core="{:d}" name="Thread {:x}"></thread>)*",

+ 1 - 1
src/core/hle/kernel/address_arbiter.cpp

@@ -39,7 +39,7 @@ static std::vector<SharedPtr<Thread>> GetThreadsWaitingOnAddress(VAddr address)
                                            std::vector<SharedPtr<Thread>>& waiting_threads,
                                            std::vector<SharedPtr<Thread>>& waiting_threads,
                                            VAddr arb_addr) {
                                            VAddr arb_addr) {
         const auto& scheduler = Core::System::GetInstance().Scheduler(core_index);
         const auto& scheduler = Core::System::GetInstance().Scheduler(core_index);
-        const auto& thread_list = scheduler->GetThreadList();
+        const auto& thread_list = scheduler.GetThreadList();
 
 
         for (const auto& thread : thread_list) {
         for (const auto& thread : thread_list) {
             if (thread->GetArbiterWaitAddress() == arb_addr)
             if (thread->GetArbiterWaitAddress() == arb_addr)

+ 5 - 5
src/core/hle/kernel/process.cpp

@@ -153,11 +153,11 @@ void Process::PrepareForTermination() {
         }
         }
     };
     };
 
 
-    auto& system = Core::System::GetInstance();
-    stop_threads(system.Scheduler(0)->GetThreadList());
-    stop_threads(system.Scheduler(1)->GetThreadList());
-    stop_threads(system.Scheduler(2)->GetThreadList());
-    stop_threads(system.Scheduler(3)->GetThreadList());
+    const auto& system = Core::System::GetInstance();
+    stop_threads(system.Scheduler(0).GetThreadList());
+    stop_threads(system.Scheduler(1).GetThreadList());
+    stop_threads(system.Scheduler(2).GetThreadList());
+    stop_threads(system.Scheduler(3).GetThreadList());
 }
 }
 
 
 /**
 /**

+ 1 - 1
src/core/hle/kernel/svc.cpp

@@ -809,7 +809,7 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target
                                            std::vector<SharedPtr<Thread>>& waiting_threads,
                                            std::vector<SharedPtr<Thread>>& waiting_threads,
                                            VAddr condvar_addr) {
                                            VAddr condvar_addr) {
         const auto& scheduler = Core::System::GetInstance().Scheduler(core_index);
         const auto& scheduler = Core::System::GetInstance().Scheduler(core_index);
-        const auto& thread_list = scheduler->GetThreadList();
+        const auto& thread_list = scheduler.GetThreadList();
 
 
         for (const auto& thread : thread_list) {
         for (const auto& thread : thread_list) {
             if (thread->GetCondVarWaitAddress() == condvar_addr)
             if (thread->GetCondVarWaitAddress() == condvar_addr)

+ 8 - 8
src/core/hle/kernel/thread.cpp

@@ -97,7 +97,7 @@ void Thread::CancelWakeupTimer() {
 static boost::optional<s32> GetNextProcessorId(u64 mask) {
 static boost::optional<s32> GetNextProcessorId(u64 mask) {
     for (s32 index = 0; index < Core::NUM_CPU_CORES; ++index) {
     for (s32 index = 0; index < Core::NUM_CPU_CORES; ++index) {
         if (mask & (1ULL << index)) {
         if (mask & (1ULL << index)) {
-            if (!Core::System::GetInstance().Scheduler(index)->GetCurrentThread()) {
+            if (!Core::System::GetInstance().Scheduler(index).GetCurrentThread()) {
                 // Core is enabled and not running any threads, use this one
                 // Core is enabled and not running any threads, use this one
                 return index;
                 return index;
             }
             }
@@ -147,14 +147,14 @@ void Thread::ResumeFromWait() {
         new_processor_id = processor_id;
         new_processor_id = processor_id;
     }
     }
     if (ideal_core != -1 &&
     if (ideal_core != -1 &&
-        Core::System::GetInstance().Scheduler(ideal_core)->GetCurrentThread() == nullptr) {
+        Core::System::GetInstance().Scheduler(ideal_core).GetCurrentThread() == nullptr) {
         new_processor_id = ideal_core;
         new_processor_id = ideal_core;
     }
     }
 
 
     ASSERT(*new_processor_id < 4);
     ASSERT(*new_processor_id < 4);
 
 
     // Add thread to new core's scheduler
     // Add thread to new core's scheduler
-    auto& next_scheduler = Core::System::GetInstance().Scheduler(*new_processor_id);
+    auto* next_scheduler = &Core::System::GetInstance().Scheduler(*new_processor_id);
 
 
     if (*new_processor_id != processor_id) {
     if (*new_processor_id != processor_id) {
         // Remove thread from previous core's scheduler
         // Remove thread from previous core's scheduler
@@ -169,7 +169,7 @@ void Thread::ResumeFromWait() {
     next_scheduler->ScheduleThread(this, current_priority);
     next_scheduler->ScheduleThread(this, current_priority);
 
 
     // Change thread's scheduler
     // Change thread's scheduler
-    scheduler = next_scheduler.get();
+    scheduler = next_scheduler;
 
 
     Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule();
     Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule();
 }
 }
@@ -230,7 +230,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(KernelCore& kernel, std::string name
     thread->name = std::move(name);
     thread->name = std::move(name);
     thread->callback_handle = kernel.ThreadWakeupCallbackHandleTable().Create(thread).Unwrap();
     thread->callback_handle = kernel.ThreadWakeupCallbackHandleTable().Create(thread).Unwrap();
     thread->owner_process = &owner_process;
     thread->owner_process = &owner_process;
-    thread->scheduler = Core::System::GetInstance().Scheduler(processor_id).get();
+    thread->scheduler = &Core::System::GetInstance().Scheduler(processor_id);
     thread->scheduler->AddThread(thread, priority);
     thread->scheduler->AddThread(thread, priority);
     thread->tls_address = thread->owner_process->MarkNextAvailableTLSSlotAsUsed(*thread);
     thread->tls_address = thread->owner_process->MarkNextAvailableTLSSlotAsUsed(*thread);
 
 
@@ -375,14 +375,14 @@ void Thread::ChangeCore(u32 core, u64 mask) {
         new_processor_id = processor_id;
         new_processor_id = processor_id;
     }
     }
     if (ideal_core != -1 &&
     if (ideal_core != -1 &&
-        Core::System::GetInstance().Scheduler(ideal_core)->GetCurrentThread() == nullptr) {
+        Core::System::GetInstance().Scheduler(ideal_core).GetCurrentThread() == nullptr) {
         new_processor_id = ideal_core;
         new_processor_id = ideal_core;
     }
     }
 
 
     ASSERT(*new_processor_id < 4);
     ASSERT(*new_processor_id < 4);
 
 
     // Add thread to new core's scheduler
     // Add thread to new core's scheduler
-    auto& next_scheduler = Core::System::GetInstance().Scheduler(*new_processor_id);
+    auto* next_scheduler = &Core::System::GetInstance().Scheduler(*new_processor_id);
 
 
     if (*new_processor_id != processor_id) {
     if (*new_processor_id != processor_id) {
         // Remove thread from previous core's scheduler
         // Remove thread from previous core's scheduler
@@ -397,7 +397,7 @@ void Thread::ChangeCore(u32 core, u64 mask) {
     next_scheduler->ScheduleThread(this, current_priority);
     next_scheduler->ScheduleThread(this, current_priority);
 
 
     // Change thread's scheduler
     // Change thread's scheduler
-    scheduler = next_scheduler.get();
+    scheduler = next_scheduler;
 
 
     Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule();
     Core::System::GetInstance().CpuCore(processor_id).PrepareReschedule();
 }
 }

+ 5 - 4
src/yuzu/debugger/wait_tree.cpp

@@ -66,10 +66,11 @@ std::vector<std::unique_ptr<WaitTreeThread>> WaitTreeItem::MakeThreadItemList()
         }
         }
     };
     };
 
 
-    add_threads(Core::System::GetInstance().Scheduler(0)->GetThreadList());
-    add_threads(Core::System::GetInstance().Scheduler(1)->GetThreadList());
-    add_threads(Core::System::GetInstance().Scheduler(2)->GetThreadList());
-    add_threads(Core::System::GetInstance().Scheduler(3)->GetThreadList());
+    const auto& system = Core::System::GetInstance();
+    add_threads(system.Scheduler(0).GetThreadList());
+    add_threads(system.Scheduler(1).GetThreadList());
+    add_threads(system.Scheduler(2).GetThreadList());
+    add_threads(system.Scheduler(3).GetThreadList());
 
 
     return item_list;
     return item_list;
 }
 }