Browse Source

General: Fix Stop function

pull/15/merge
Fernando Sahmkow 6 years ago
parent
commit
e6f8bde74b
  1. 1
      src/core/core_timing.cpp
  2. 15
      src/core/hle/kernel/kernel.cpp
  3. 8
      src/core/hle/kernel/thread.cpp
  4. 6
      src/yuzu/bootmanager.cpp

1
src/core/core_timing.cpp

@ -61,6 +61,7 @@ void CoreTiming::Initialize(std::function<void(void)>&& on_thread_init_) {
void CoreTiming::Shutdown() { void CoreTiming::Shutdown() {
paused = true; paused = true;
shutting_down = true; shutting_down = true;
pause_event.Set();
event.Set(); event.Set();
timer_thread->join(); timer_thread->join();
ClearPendingEvents(); ClearPendingEvents();

15
src/core/hle/kernel/kernel.cpp

@ -119,6 +119,7 @@ struct KernelCore::Impl {
void Initialize(KernelCore& kernel) { void Initialize(KernelCore& kernel) {
Shutdown(); Shutdown();
RegisterHostThread();
InitializePhysicalCores(); InitializePhysicalCores();
InitializeSystemResourceLimit(kernel); InitializeSystemResourceLimit(kernel);
@ -135,6 +136,19 @@ struct KernelCore::Impl {
next_user_process_id = Process::ProcessIDMin; next_user_process_id = Process::ProcessIDMin;
next_thread_id = 1; next_thread_id = 1;
for (std::size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) {
if (suspend_threads[i]) {
suspend_threads[i].reset();
}
}
for (std::size_t i = 0; i < cores.size(); i++) {
cores[i].Shutdown();
}
cores.clear();
registered_core_threads.reset();
process_list.clear(); process_list.clear();
current_process = nullptr; current_process = nullptr;
@ -154,6 +168,7 @@ struct KernelCore::Impl {
cores.clear(); cores.clear();
exclusive_monitor.reset(); exclusive_monitor.reset();
host_thread_ids.clear();
} }
void InitializePhysicalCores() { void InitializePhysicalCores() {

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

@ -56,10 +56,12 @@ void Thread::Stop() {
Signal(); Signal();
kernel.GlobalHandleTable().Close(global_handle); kernel.GlobalHandleTable().Close(global_handle);
owner_process->UnregisterThread(this);
if (owner_process) {
owner_process->UnregisterThread(this);
// Mark the TLS slot in the thread's page as free.
owner_process->FreeTLSRegion(tls_address);
// Mark the TLS slot in the thread's page as free.
owner_process->FreeTLSRegion(tls_address);
}
} }
global_handle = 0; global_handle = 0;
} }

6
src/yuzu/bootmanager.cpp

@ -89,8 +89,10 @@ void EmuThread::run() {
} }
running_guard = false; running_guard = false;
was_active = true;
emit DebugModeEntered();
if (!stop_run) {
was_active = true;
emit DebugModeEntered();
}
} else if (exec_step) { } else if (exec_step) {
UNIMPLEMENTED(); UNIMPLEMENTED();
} else { } else {

Loading…
Cancel
Save