General: Fix Stop function
This commit is contained in:
parent
f370de84b1
commit
e6f8bde74b
|
@ -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();
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -56,11 +56,13 @@ void Thread::Stop() {
|
||||||
Signal();
|
Signal();
|
||||||
kernel.GlobalHandleTable().Close(global_handle);
|
kernel.GlobalHandleTable().Close(global_handle);
|
||||||
|
|
||||||
|
if (owner_process) {
|
||||||
owner_process->UnregisterThread(this);
|
owner_process->UnregisterThread(this);
|
||||||
|
|
||||||
// Mark the TLS slot in the thread's page as free.
|
// Mark the TLS slot in the thread's page as free.
|
||||||
owner_process->FreeTLSRegion(tls_address);
|
owner_process->FreeTLSRegion(tls_address);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
global_handle = 0;
|
global_handle = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -89,8 +89,10 @@ void EmuThread::run() {
|
||||||
}
|
}
|
||||||
running_guard = false;
|
running_guard = false;
|
||||||
|
|
||||||
|
if (!stop_run) {
|
||||||
was_active = true;
|
was_active = true;
|
||||||
emit DebugModeEntered();
|
emit DebugModeEntered();
|
||||||
|
}
|
||||||
} else if (exec_step) {
|
} else if (exec_step) {
|
||||||
UNIMPLEMENTED();
|
UNIMPLEMENTED();
|
||||||
} else {
|
} else {
|
||||||
|
|
Reference in New Issue