summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/multi_level_queue.h7
-rw-r--r--src/core/core_cpu.cpp4
-rw-r--r--src/core/core_cpu.h2
-rw-r--r--src/core/cpu_core_manager.cpp1
-rw-r--r--src/core/hle/kernel/kernel.cpp2
-rw-r--r--src/core/hle/kernel/scheduler.cpp8
-rw-r--r--src/core/hle/kernel/scheduler.h7
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
307private: 314private:
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
120void 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
89private: 91private:
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
345void 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
345GlobalScheduler::~GlobalScheduler() = default; 353GlobalScheduler::~GlobalScheduler() = default;
346 354
347Scheduler::Scheduler(Core::System& system, Core::ARM_Interface& cpu_core, u32 core_id) 355Scheduler::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
150private: 152private:
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
192private: 199private:
193 friend class GlobalScheduler; 200 friend class GlobalScheduler;
194 /** 201 /**