redefine exit methods for sysmodules. Partially fixes the shutdown issue
This commit is contained in:
@@ -14,10 +14,27 @@
|
||||
#include "service_manager.h"
|
||||
|
||||
static MyThread processMonitorThread, taskRunnerThread;
|
||||
static u8 ALIGN(8) processDataBuffer[0x40 * sizeof(ProcessData)] = {0};
|
||||
static u8 ALIGN(8) exheaderInfoBuffer[6 * sizeof(ExHeader_Info)] = {0};
|
||||
static u8 ALIGN(8) threadStacks[2][THREAD_STACK_SIZE] = {0};
|
||||
|
||||
// this is called before main
|
||||
void __appInit()
|
||||
// this is called after main exits
|
||||
void exit(int rc)
|
||||
{
|
||||
(void)rc;
|
||||
// Not supposed to terminate... kernel will clean up the handles if it does happen anyway
|
||||
svcExitProcess();
|
||||
}
|
||||
|
||||
Result __sync_init(void);
|
||||
//void __libc_init_array(void);
|
||||
|
||||
// Called before main
|
||||
void initSystem()
|
||||
{
|
||||
__sync_init();
|
||||
//__libc_init_array();
|
||||
|
||||
// Wait for sm
|
||||
for(Result res = 0xD88007FA; res == (Result)0xD88007FA; svcSleepThread(500 * 1000LL)) {
|
||||
res = srvPmInit();
|
||||
@@ -28,56 +45,10 @@ void __appInit()
|
||||
loaderInit();
|
||||
fsRegInit();
|
||||
|
||||
static u8 ALIGN(8) processDataBuffer[0x40 * sizeof(ProcessData)] = {0};
|
||||
static u8 ALIGN(8) exheaderInfoBuffer[6 * sizeof(ExHeader_Info)] = {0};
|
||||
static u8 ALIGN(8) threadStacks[2][THREAD_STACK_SIZE] = {0};
|
||||
|
||||
// Init objects
|
||||
Manager_Init(processDataBuffer, 0x40);
|
||||
ExHeaderInfoHeap_Init(exheaderInfoBuffer, 6);
|
||||
TaskRunner_Init();
|
||||
|
||||
// Init the reslimits, register the KIPs and map the firmlaunch parameters
|
||||
initializeReslimits();
|
||||
Manager_RegisterKips();
|
||||
mapFirmlaunchParameters();
|
||||
|
||||
// Create the threads
|
||||
assertSuccess(MyThread_Create(&processMonitorThread, processMonitor, NULL, threadStacks[0], THREAD_STACK_SIZE, 0x17, -2));
|
||||
assertSuccess(MyThread_Create(&taskRunnerThread, TaskRunner_HandleTasks, NULL, threadStacks[1], THREAD_STACK_SIZE, 0x17, -2));
|
||||
|
||||
// Launch NS, etc.
|
||||
autolaunchSysmodules();
|
||||
}
|
||||
|
||||
// this is called after main exits
|
||||
void __appExit()
|
||||
{
|
||||
// We don't clean up g_manager's handles because it could hang the process monitor thread, etc.
|
||||
fsRegExit();
|
||||
loaderExit();
|
||||
srvPmExit();
|
||||
}
|
||||
|
||||
|
||||
Result __sync_init(void);
|
||||
Result __sync_fini(void);
|
||||
void __libc_init_array(void);
|
||||
void __libc_fini_array(void);
|
||||
|
||||
void __ctru_exit()
|
||||
{
|
||||
__libc_fini_array();
|
||||
__appExit();
|
||||
__sync_fini();
|
||||
svcExitProcess();
|
||||
}
|
||||
|
||||
void initSystem()
|
||||
{
|
||||
__sync_init();
|
||||
__appInit();
|
||||
__libc_init_array();
|
||||
}
|
||||
|
||||
static const ServiceManagerServiceEntry services[] = {
|
||||
@@ -90,9 +61,24 @@ static const ServiceManagerNotificationEntry notifications[] = {
|
||||
{ 0x000, NULL },
|
||||
};
|
||||
|
||||
void __ctru_exit(int rc) { (void)rc; } // needed to avoid linking error
|
||||
|
||||
int main(void)
|
||||
{
|
||||
Result res = 0;
|
||||
|
||||
// Init the reslimits, register the KIPs and map the firmlaunch parameters
|
||||
initializeReslimits();
|
||||
Manager_RegisterKips();
|
||||
mapFirmlaunchParameters();
|
||||
|
||||
// Create the threads
|
||||
assertSuccess(MyThread_Create(&processMonitorThread, processMonitor, NULL, threadStacks[0], THREAD_STACK_SIZE, 0x17, -2));
|
||||
assertSuccess(MyThread_Create(&taskRunnerThread, TaskRunner_HandleTasks, NULL, threadStacks[1], THREAD_STACK_SIZE, 0x17, -2));
|
||||
|
||||
// Launch NS, etc.
|
||||
autolaunchSysmodules();
|
||||
|
||||
if (R_FAILED(res = ServiceManager_Run(services, notifications, NULL))) {
|
||||
panic(res);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user