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:
parent
2e362d93da
commit
5d215ef299
1 changed files with 31 additions and 6 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue