diff options
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 32 |
1 files changed, 5 insertions, 27 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 371fc439e..0bc407098 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -169,7 +169,7 @@ static ResultCode GetProcessId(u32* process_id, Handle process_handle) { | |||
| 169 | return ERR_INVALID_HANDLE; | 169 | return ERR_INVALID_HANDLE; |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | *process_id = process->process_id; | 172 | *process_id = process->GetProcessID(); |
| 173 | return RESULT_SUCCESS; | 173 | return RESULT_SUCCESS; |
| 174 | } | 174 | } |
| 175 | 175 | ||
| @@ -530,35 +530,13 @@ static ResultCode QueryMemory(MemoryInfo* memory_info, PageInfo* page_info, VAdd | |||
| 530 | 530 | ||
| 531 | /// Exits the current process | 531 | /// Exits the current process |
| 532 | static void ExitProcess() { | 532 | static void ExitProcess() { |
| 533 | LOG_INFO(Kernel_SVC, "Process {} exiting", Core::CurrentProcess()->process_id); | 533 | auto& current_process = Core::CurrentProcess(); |
| 534 | 534 | ||
| 535 | ASSERT_MSG(Core::CurrentProcess()->status == ProcessStatus::Running, | 535 | LOG_INFO(Kernel_SVC, "Process {} exiting", current_process->GetProcessID()); |
| 536 | ASSERT_MSG(current_process->GetStatus() == ProcessStatus::Running, | ||
| 536 | "Process has already exited"); | 537 | "Process has already exited"); |
| 537 | 538 | ||
| 538 | Core::CurrentProcess()->status = ProcessStatus::Exited; | 539 | current_process->PrepareForTermination(); |
| 539 | |||
| 540 | auto stop_threads = [](const std::vector<SharedPtr<Thread>>& thread_list) { | ||
| 541 | for (auto& thread : thread_list) { | ||
| 542 | if (thread->owner_process != Core::CurrentProcess()) | ||
| 543 | continue; | ||
| 544 | |||
| 545 | if (thread == GetCurrentThread()) | ||
| 546 | continue; | ||
| 547 | |||
| 548 | // TODO(Subv): When are the other running/ready threads terminated? | ||
| 549 | ASSERT_MSG(thread->status == ThreadStatus::WaitSynchAny || | ||
| 550 | thread->status == ThreadStatus::WaitSynchAll, | ||
| 551 | "Exiting processes with non-waiting threads is currently unimplemented"); | ||
| 552 | |||
| 553 | thread->Stop(); | ||
| 554 | } | ||
| 555 | }; | ||
| 556 | |||
| 557 | auto& system = Core::System::GetInstance(); | ||
| 558 | stop_threads(system.Scheduler(0)->GetThreadList()); | ||
| 559 | stop_threads(system.Scheduler(1)->GetThreadList()); | ||
| 560 | stop_threads(system.Scheduler(2)->GetThreadList()); | ||
| 561 | stop_threads(system.Scheduler(3)->GetThreadList()); | ||
| 562 | 540 | ||
| 563 | // Kill the current thread | 541 | // Kill the current thread |
| 564 | GetCurrentThread()->Stop(); | 542 | GetCurrentThread()->Stop(); |