static void initArgv();
static u32 heapBase;
+void __destroy_handle_list(void);
+
void __attribute__((noreturn)) __ctru_exit(int rc)
{
// Run the global destructors
// Unmap the application heap
svcControlMemory(&heapBase, heapBase, 0x0, __heap_size, MEMOP_FREE, 0x0);
+ // Close some handles
+ __destroy_handle_list();
+
// Jump to the loader if it provided a callback
if (__system_retAddr)
__system_retAddr();
svcCloseHandle(aptSleepSync);
svcCloseHandle(aptStatusMutex);
- //svcCloseHandle(aptLockHandle);
+ svcCloseHandle(aptLockHandle);
svcCloseHandle(aptStatusEvent);
}
if((ret = svcSendSyncRequest(handle)))
return ret;
- return cmdbuf[1];
+ ret = cmdbuf[1];
+ if(!ret)ret = svcCloseHandle(handle);
+
+ return ret;
}
/*! Read data from an open file
// Stop event thread
gspRunEvents = false;
svcWaitSynchronization(gspEventThread, 1000000000);
+ svcCloseHandle(gspEventThread);
// Free events
int i;
void hidExit()
{
// Unmap HID sharedmem and close handles.
+ int i; for(i=0; i<5; i++)svcCloseHandle(hidEvents[i]);
svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem);
svcCloseHandle(hidMemHandle);
svcCloseHandle(hidHandle);
void irrstExit()
{
irrstUsed = false;
+ svcCloseHandle(irrstEvent);
// Unmap ir:rst sharedmem and close handles.
svcUnmapMemoryBlock(irrstMemHandle, (u32)irrstSharedMem);
svcCloseHandle(irrstMemHandle);
return 0;
}
+void __destroy_handle_list(void) {
+ if((u32)__service_ptr == 0)
+ return;
+
+ u32 i, num = __service_ptr->num;
+
+ for(i=0; i<num; i++)
+ svcCloseHandle(__service_ptr->services[i].handle);
+
+ __service_ptr->num = 0;
+}
+
Result srvInit()
{
Result rc = 0;
if((rc = svcSendSyncRequest(g_srv_handle))) return rc;
return cmdbuf[1];
-}
\ No newline at end of file
+}