1
0
Fork 0
mirror of https://github.com/Atmosphere-NX/Atmosphere.git synced 2024-11-05 19:51:45 +00:00

Process Manager: Make process flag updating version agnostic, handle 5.x dead process semantics.

This commit is contained in:
Michael Scire 2018-05-04 17:55:39 -06:00
parent 2e362d93da
commit 5d215ef299

View file

@ -6,6 +6,7 @@
#include "pm_process_wait.hpp" #include "pm_process_wait.hpp"
static ProcessList g_process_list; static ProcessList g_process_list;
static ProcessList g_dead_process_list;
static HosSemaphore g_sema_finish_launch; static HosSemaphore g_sema_finish_launch;
@ -271,6 +272,20 @@ void Registration::HandleSignaledProcess(Process *process) {
case ProcessState_Exiting: case ProcessState_Exiting:
break; break;
case ProcessState_DebugDetached: case ProcessState_DebugDetached:
if (process->flags & 8) {
process->flags &= ~0x30;
process->flags |= 0x10;
g_process_event->signal_event();
}
if (kernelAbove200() && process->flags & 0x80) {
process->flags &= ~0x180;
process->flags |= 0x100;
}
break;
case ProcessState_Crashed:
process->flags |= 6;
g_process_event->signal_event();
break;
case ProcessState_Running: case ProcessState_Running:
if (process->flags & 8) { if (process->flags & 8) {
process->flags &= ~0x30; process->flags &= ~0x30;
@ -278,12 +293,8 @@ void Registration::HandleSignaledProcess(Process *process) {
g_process_event->signal_event(); g_process_event->signal_event();
} }
break; break;
case ProcessState_Crashed:
process->flags |= 6;
g_process_event->signal_event();
break;
case ProcessState_Exited: case ProcessState_Exited:
if (process->flags & 1) { if (process->flags & 1 && !kernelAbove500()) {
g_process_event->signal_event(); g_process_event->signal_event();
} else { } else {
FinalizeExitedProcess(process); FinalizeExitedProcess(process);
@ -299,6 +310,7 @@ void Registration::HandleSignaledProcess(Process *process) {
} }
void Registration::FinalizeExitedProcess(Process *process) { void Registration::FinalizeExitedProcess(Process *process) {
bool signal_debug_process_5x = kernelAbove500() && process->flags & 1;
g_process_list.Lock(); g_process_list.Lock();
/* Unregister with FS. */ /* Unregister with FS. */
if (R_FAILED(fsprUnregisterProgram(process->pid))) { if (R_FAILED(fsprUnregisterProgram(process->pid))) {
@ -313,10 +325,23 @@ void Registration::FinalizeExitedProcess(Process *process) {
/* TODO: Panic. */ /* TODO: Panic. */
} }
/* Remove. */ /* Close the process's handle. */
svcCloseHandle(process->handle);
/* Insert into dead process list, if relevant. */
if (signal_debug_process_5x) {
g_dead_process_list.Lock();
g_dead_process_list.process_waiters.push_back(new ProcessWaiter(process));
g_dead_process_list.Unlock();
}
/* Remove NOTE: This probably frees process. */
RemoveProcessFromList(process->pid); RemoveProcessFromList(process->pid);
g_process_list.Unlock(); g_process_list.Unlock();
if (signal_debug_process_5x) {
g_process_event->signal_event();
}
} }
void Registration::AddProcessToList(Process *process) { void Registration::AddProcessToList(Process *process) {