diff options
| -rw-r--r-- | src/common/multi_level_queue.h | 7 | ||||
| -rw-r--r-- | src/core/core_cpu.cpp | 4 | ||||
| -rw-r--r-- | src/core/core_cpu.h | 2 | ||||
| -rw-r--r-- | src/core/cpu_core_manager.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/scheduler.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/scheduler.h | 7 |
7 files changed, 31 insertions, 0 deletions
diff --git a/src/common/multi_level_queue.h b/src/common/multi_level_queue.h index 9cb448f56..50acfdbf2 100644 --- a/src/common/multi_level_queue.h +++ b/src/common/multi_level_queue.h | |||
| @@ -304,6 +304,13 @@ public: | |||
| 304 | return levels[priority == Depth ? 63 : priority].back(); | 304 | return levels[priority == Depth ? 63 : priority].back(); |
| 305 | } | 305 | } |
| 306 | 306 | ||
| 307 | void clear() { | ||
| 308 | used_priorities = 0; | ||
| 309 | for (std::size_t i = 0; i < Depth; i++) { | ||
| 310 | levels[i].clear(); | ||
| 311 | } | ||
| 312 | } | ||
| 313 | |||
| 307 | private: | 314 | private: |
| 308 | using const_list_iterator = typename std::list<T>::const_iterator; | 315 | using const_list_iterator = typename std::list<T>::const_iterator; |
| 309 | 316 | ||
diff --git a/src/core/core_cpu.cpp b/src/core/core_cpu.cpp index a6f63e437..233ea572c 100644 --- a/src/core/core_cpu.cpp +++ b/src/core/core_cpu.cpp | |||
| @@ -117,4 +117,8 @@ void Cpu::Reschedule() { | |||
| 117 | scheduler->TryDoContextSwitch(); | 117 | scheduler->TryDoContextSwitch(); |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | void Cpu::Shutdown() { | ||
| 121 | scheduler->Shutdown(); | ||
| 122 | } | ||
| 123 | |||
| 120 | } // namespace Core | 124 | } // namespace Core |
diff --git a/src/core/core_cpu.h b/src/core/core_cpu.h index 80261daf7..cafca8df7 100644 --- a/src/core/core_cpu.h +++ b/src/core/core_cpu.h | |||
| @@ -84,6 +84,8 @@ public: | |||
| 84 | return core_index; | 84 | return core_index; |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | void Shutdown(); | ||
| 88 | |||
| 87 | static std::unique_ptr<ExclusiveMonitor> MakeExclusiveMonitor(std::size_t num_cores); | 89 | static std::unique_ptr<ExclusiveMonitor> MakeExclusiveMonitor(std::size_t num_cores); |
| 88 | 90 | ||
| 89 | private: | 91 | private: |
diff --git a/src/core/cpu_core_manager.cpp b/src/core/cpu_core_manager.cpp index 16b384076..8efd410bb 100644 --- a/src/core/cpu_core_manager.cpp +++ b/src/core/cpu_core_manager.cpp | |||
| @@ -58,6 +58,7 @@ void CpuCoreManager::Shutdown() { | |||
| 58 | 58 | ||
| 59 | thread_to_cpu.clear(); | 59 | thread_to_cpu.clear(); |
| 60 | for (auto& cpu_core : cores) { | 60 | for (auto& cpu_core : cores) { |
| 61 | cpu_core->Shutdown(); | ||
| 61 | cpu_core.reset(); | 62 | cpu_core.reset(); |
| 62 | } | 63 | } |
| 63 | 64 | ||
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 002c5af2b..0d6286f84 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -116,6 +116,8 @@ struct KernelCore::Impl { | |||
| 116 | thread_wakeup_event_type = nullptr; | 116 | thread_wakeup_event_type = nullptr; |
| 117 | preemption_event = nullptr; | 117 | preemption_event = nullptr; |
| 118 | 118 | ||
| 119 | global_scheduler.Shutdown(); | ||
| 120 | |||
| 119 | named_ports.clear(); | 121 | named_ports.clear(); |
| 120 | } | 122 | } |
| 121 | 123 | ||
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp index 226d15d88..122106267 100644 --- a/src/core/hle/kernel/scheduler.cpp +++ b/src/core/hle/kernel/scheduler.cpp | |||
| @@ -342,6 +342,14 @@ bool GlobalScheduler::AskForReselectionOrMarkRedundant(Thread* current_thread, T | |||
| 342 | } | 342 | } |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | void GlobalScheduler::Shutdown() { | ||
| 346 | for (std::size_t core = 0; core < NUM_CPU_CORES; core++) { | ||
| 347 | scheduled_queue[core].clear(); | ||
| 348 | suggested_queue[core].clear(); | ||
| 349 | } | ||
| 350 | thread_list.clear(); | ||
| 351 | } | ||
| 352 | |||
| 345 | GlobalScheduler::~GlobalScheduler() = default; | 353 | GlobalScheduler::~GlobalScheduler() = default; |
| 346 | 354 | ||
| 347 | Scheduler::Scheduler(Core::System& system, Core::ARM_Interface& cpu_core, u32 core_id) | 355 | Scheduler::Scheduler(Core::System& system, Core::ARM_Interface& cpu_core, u32 core_id) |
diff --git a/src/core/hle/kernel/scheduler.h b/src/core/hle/kernel/scheduler.h index 408e20c88..617553ae3 100644 --- a/src/core/hle/kernel/scheduler.h +++ b/src/core/hle/kernel/scheduler.h | |||
| @@ -147,6 +147,8 @@ public: | |||
| 147 | return reselection_pending.load(); | 147 | return reselection_pending.load(); |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | void Shutdown(); | ||
| 151 | |||
| 150 | private: | 152 | private: |
| 151 | bool AskForReselectionOrMarkRedundant(Thread* current_thread, Thread* winner); | 153 | bool AskForReselectionOrMarkRedundant(Thread* current_thread, Thread* winner); |
| 152 | 154 | ||
| @@ -189,6 +191,11 @@ public: | |||
| 189 | return context_switch_pending; | 191 | return context_switch_pending; |
| 190 | } | 192 | } |
| 191 | 193 | ||
| 194 | void Shutdown() { | ||
| 195 | current_thread = nullptr; | ||
| 196 | selected_thread = nullptr; | ||
| 197 | } | ||
| 198 | |||
| 192 | private: | 199 | private: |
| 193 | friend class GlobalScheduler; | 200 | friend class GlobalScheduler; |
| 194 | /** | 201 | /** |