diff --git a/sysmodules/rosalina/source/service_manager.c b/sysmodules/rosalina/source/service_manager.c index cb9954d..33cc78e 100644 --- a/sysmodules/rosalina/source/service_manager.c +++ b/sysmodules/rosalina/source/service_manager.c @@ -53,6 +53,14 @@ Result ServiceManager_Run(const ServiceManagerServiceEntry *services, const Serv TRY(srvEnableNotification(&waitHandles[0])); + // Subscribe to notifications if needed. + for (u32 i = 0; notifications[i].handler != NULL; i++) { + // Termination & ready for reboot events send by PM using PublishToProcess don't require subscription. + if (notifications[i].id != 0x100 && notifications[i].id != 0x179) { + TRY(srvSubscribe(notifications[i].id)); + } + } + for (u32 i = 0; i < numServices; i++) { if (!services[i].isGlobalPort) { TRY(srvRegisterService(&waitHandles[1 + i], services[i].name, (s32)services[i].maxSessions)); @@ -150,6 +158,14 @@ cleanup: svcCloseHandle(waitHandles[i]); } + // Subscribe to notifications if needed. + for (u32 i = 0; notifications[i].handler != NULL; i++) { + // Termination & ready for reboot events send by PM using PublishToProcess don't require subscription. + if (notifications[i].id != 0x100 && notifications[i].id != 0x179) { + TRY(srvUnsubscribe(notifications[i].id)); + } + } + for (u32 i = 0; i < numServices; i++) { if (!services[i].isGlobalPort) { srvUnregisterService(services[i].name);