mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
pm: since 9.0.0, exceptions are signaled only once
This commit is contained in:
parent
1ca373cd71
commit
3b5dff0f83
2 changed files with 14 additions and 3 deletions
|
@ -35,6 +35,7 @@ namespace ams::pm::impl {
|
||||||
Flag_Application = (1 << 6),
|
Flag_Application = (1 << 6),
|
||||||
Flag_SignalOnStart = (1 << 7),
|
Flag_SignalOnStart = (1 << 7),
|
||||||
Flag_StartedStateChanged = (1 << 8),
|
Flag_StartedStateChanged = (1 << 8),
|
||||||
|
Flag_UnhandledException = (1 << 9),
|
||||||
};
|
};
|
||||||
private:
|
private:
|
||||||
util::IntrusiveListNode list_node;
|
util::IntrusiveListNode list_node;
|
||||||
|
@ -124,13 +125,18 @@ namespace ams::pm::impl {
|
||||||
/* This needs a manual setter, because it sets two flags. */
|
/* This needs a manual setter, because it sets two flags. */
|
||||||
void SetExceptionOccurred() {
|
void SetExceptionOccurred() {
|
||||||
this->SetFlag(Flag_ExceptionOccurred);
|
this->SetFlag(Flag_ExceptionOccurred);
|
||||||
this->SetFlag(Flag_ExceptionWaitingAttach);
|
this->SetFlag(Flag_UnhandledException);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_FLAG_GET(Has, ExceptionOccurred)
|
DEFINE_FLAG_GET(Has, ExceptionOccurred)
|
||||||
DEFINE_FLAG_GET(Has, ExceptionWaitingAttach)
|
DEFINE_FLAG_GET(Has, ExceptionWaitingAttach)
|
||||||
|
DEFINE_FLAG_GET(Has, UnhandledException)
|
||||||
|
|
||||||
|
DEFINE_FLAG_SET(ExceptionWaitingAttach)
|
||||||
|
|
||||||
DEFINE_FLAG_CLEAR(ExceptionOccurred)
|
DEFINE_FLAG_CLEAR(ExceptionOccurred)
|
||||||
DEFINE_FLAG_CLEAR(ExceptionWaitingAttach)
|
DEFINE_FLAG_CLEAR(ExceptionWaitingAttach)
|
||||||
|
DEFINE_FLAG_CLEAR(UnhandledException)
|
||||||
|
|
||||||
DEFINE_FLAG_SET(SignalOnDebugEvent)
|
DEFINE_FLAG_SET(SignalOnDebugEvent)
|
||||||
DEFINE_FLAG_GET(Should, SignalOnDebugEvent)
|
DEFINE_FLAG_GET(Should, SignalOnDebugEvent)
|
||||||
|
|
|
@ -343,10 +343,14 @@ namespace ams::pm::impl {
|
||||||
process_info->ClearSignalOnStart();
|
process_info->ClearSignalOnStart();
|
||||||
os::SignalSystemEvent(std::addressof(g_process_event));
|
os::SignalSystemEvent(std::addressof(g_process_event));
|
||||||
}
|
}
|
||||||
|
process_info->ClearUnhandledException();
|
||||||
break;
|
break;
|
||||||
case svc::ProcessState_Crashed:
|
case svc::ProcessState_Crashed:
|
||||||
process_info->SetExceptionOccurred();
|
if (!process_info->HasUnhandledException()) {
|
||||||
os::SignalSystemEvent(std::addressof(g_process_event));
|
process_info->SetExceptionOccurred();
|
||||||
|
os::SignalSystemEvent(std::addressof(g_process_event));
|
||||||
|
}
|
||||||
|
process_info->SetExceptionWaitingAttach();
|
||||||
break;
|
break;
|
||||||
case svc::ProcessState_RunningAttached:
|
case svc::ProcessState_RunningAttached:
|
||||||
if (process_info->ShouldSignalOnDebugEvent()) {
|
if (process_info->ShouldSignalOnDebugEvent()) {
|
||||||
|
@ -354,6 +358,7 @@ namespace ams::pm::impl {
|
||||||
process_info->SetSuspendedStateChanged();
|
process_info->SetSuspendedStateChanged();
|
||||||
os::SignalSystemEvent(std::addressof(g_process_event));
|
os::SignalSystemEvent(std::addressof(g_process_event));
|
||||||
}
|
}
|
||||||
|
process_info->ClearUnhandledException();
|
||||||
break;
|
break;
|
||||||
case svc::ProcessState_Terminated:
|
case svc::ProcessState_Terminated:
|
||||||
/* Free process resources, unlink from waitable manager. */
|
/* Free process resources, unlink from waitable manager. */
|
||||||
|
|
Loading…
Reference in a new issue