|
|
@@ -169,7 +169,7 @@ static ResultCode GetProcessId(u32* process_id, Handle process_handle) {
|
|
|
return ERR_INVALID_HANDLE;
|
|
|
}
|
|
|
|
|
|
- *process_id = process->process_id;
|
|
|
+ *process_id = process->GetProcessID();
|
|
|
return RESULT_SUCCESS;
|
|
|
}
|
|
|
|
|
|
@@ -530,35 +530,13 @@ static ResultCode QueryMemory(MemoryInfo* memory_info, PageInfo* page_info, VAdd
|
|
|
|
|
|
/// Exits the current process
|
|
|
static void ExitProcess() {
|
|
|
- LOG_INFO(Kernel_SVC, "Process {} exiting", Core::CurrentProcess()->process_id);
|
|
|
+ auto& current_process = Core::CurrentProcess();
|
|
|
|
|
|
- ASSERT_MSG(Core::CurrentProcess()->status == ProcessStatus::Running,
|
|
|
+ LOG_INFO(Kernel_SVC, "Process {} exiting", current_process->GetProcessID());
|
|
|
+ ASSERT_MSG(current_process->GetStatus() == ProcessStatus::Running,
|
|
|
"Process has already exited");
|
|
|
|
|
|
- Core::CurrentProcess()->status = ProcessStatus::Exited;
|
|
|
-
|
|
|
- auto stop_threads = [](const std::vector<SharedPtr<Thread>>& thread_list) {
|
|
|
- for (auto& thread : thread_list) {
|
|
|
- if (thread->owner_process != Core::CurrentProcess())
|
|
|
- continue;
|
|
|
-
|
|
|
- if (thread == GetCurrentThread())
|
|
|
- continue;
|
|
|
-
|
|
|
- // TODO(Subv): When are the other running/ready threads terminated?
|
|
|
- ASSERT_MSG(thread->status == ThreadStatus::WaitSynchAny ||
|
|
|
- thread->status == ThreadStatus::WaitSynchAll,
|
|
|
- "Exiting processes with non-waiting threads is currently unimplemented");
|
|
|
-
|
|
|
- thread->Stop();
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- auto& system = Core::System::GetInstance();
|
|
|
- stop_threads(system.Scheduler(0)->GetThreadList());
|
|
|
- stop_threads(system.Scheduler(1)->GetThreadList());
|
|
|
- stop_threads(system.Scheduler(2)->GetThreadList());
|
|
|
- stop_threads(system.Scheduler(3)->GetThreadList());
|
|
|
+ current_process->PrepareForTermination();
|
|
|
|
|
|
// Kill the current thread
|
|
|
GetCurrentThread()->Stop();
|