|
|
|
@ -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();
|
|
|
|
|