General: Fix Stop function
This commit is contained in:
		| @@ -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
	
	Block a user