Browse Source

Kernel Scheduler: Make sure the global scheduler shutdowns correctly.

pull/15/merge
Fernando Sahmkow 6 years ago
committed by FernandoS27
parent
commit
25f8606a6d
  1. 7
      src/common/multi_level_queue.h
  2. 4
      src/core/core_cpu.cpp
  3. 2
      src/core/core_cpu.h
  4. 1
      src/core/cpu_core_manager.cpp
  5. 2
      src/core/hle/kernel/kernel.cpp
  6. 8
      src/core/hle/kernel/scheduler.cpp
  7. 7
      src/core/hle/kernel/scheduler.h

7
src/common/multi_level_queue.h

@ -304,6 +304,13 @@ public:
return levels[priority == Depth ? 63 : priority].back();
}
void clear() {
used_priorities = 0;
for (std::size_t i = 0; i < Depth; i++) {
levels[i].clear();
}
}
private:
using const_list_iterator = typename std::list<T>::const_iterator;

4
src/core/core_cpu.cpp

@ -117,4 +117,8 @@ void Cpu::Reschedule() {
scheduler->TryDoContextSwitch();
}
void Cpu::Shutdown() {
scheduler->Shutdown();
}
} // namespace Core

2
src/core/core_cpu.h

@ -84,6 +84,8 @@ public:
return core_index;
}
void Shutdown();
static std::unique_ptr<ExclusiveMonitor> MakeExclusiveMonitor(std::size_t num_cores);
private:

1
src/core/cpu_core_manager.cpp

@ -58,6 +58,7 @@ void CpuCoreManager::Shutdown() {
thread_to_cpu.clear();
for (auto& cpu_core : cores) {
cpu_core->Shutdown();
cpu_core.reset();
}

2
src/core/hle/kernel/kernel.cpp

@ -116,6 +116,8 @@ struct KernelCore::Impl {
thread_wakeup_event_type = nullptr;
preemption_event = nullptr;
global_scheduler.Shutdown();
named_ports.clear();
}

8
src/core/hle/kernel/scheduler.cpp

@ -342,6 +342,14 @@ bool GlobalScheduler::AskForReselectionOrMarkRedundant(Thread* current_thread, T
}
}
void GlobalScheduler::Shutdown() {
for (std::size_t core = 0; core < NUM_CPU_CORES; core++) {
scheduled_queue[core].clear();
suggested_queue[core].clear();
}
thread_list.clear();
}
GlobalScheduler::~GlobalScheduler() = default;
Scheduler::Scheduler(Core::System& system, Core::ARM_Interface& cpu_core, u32 core_id)

7
src/core/hle/kernel/scheduler.h

@ -147,6 +147,8 @@ public:
return reselection_pending.load();
}
void Shutdown();
private:
bool AskForReselectionOrMarkRedundant(Thread* current_thread, Thread* winner);
@ -189,6 +191,11 @@ public:
return context_switch_pending;
}
void Shutdown() {
current_thread = nullptr;
selected_thread = nullptr;
}
private:
friend class GlobalScheduler;
/**

Loading…
Cancel
Save