]> Chaos Git - corbenik/ctrulib.git/commitdiff
auto initialise commonly used services, prevent double initialisation
authorDave Murphy <davem@devkitpro.org>
Thu, 25 Dec 2014 23:27:36 +0000 (23:27 +0000)
committerDave Murphy <davem@devkitpro.org>
Thu, 25 Dec 2014 23:27:36 +0000 (23:27 +0000)
libctru/source/sdmc_dev.c
libctru/source/services/apt.c
libctru/source/services/fs.c
libctru/source/services/hid.c
libctru/source/srv.c
libctru/source/system/appExit.c [new file with mode: 0644]
libctru/source/system/appInit.c [new file with mode: 0644]
libctru/source/system/ctru_exit.c
libctru/source/system/initSystem.c

index c21b224a9737377098cd9151437dace71ba185ed..d9604b0f15ef26b91e23f5b5045b3a1af7051c56 100644 (file)
@@ -130,11 +130,14 @@ static const char *sdmc_fixpath(const char *path)
 extern int __system_argc;
 extern char** __system_argv;
 
+static bool sdmcInitialised = false;
+
 /*! Initialize SDMC device */
 Result sdmcInit(void)
 {
-  Result rc;
+  Result rc = 0;
 
+  if (sdmcInitialised) return rc;
 
   rc = FSUSER_OpenArchive(NULL, &sdmcArchive);
 
@@ -161,13 +164,17 @@ Result sdmcInit(void)
     }
   }
 
+  sdmcInitialised = true;
+
   return rc;
 }
 
 /*! Clean up SDMC device */
 Result sdmcExit(void)
 {
-  Result rc;
+  Result rc = 0;
+
+  if (!sdmcInitialised) return rc;
 
   rc = FSUSER_CloseArchive(NULL, &sdmcArchive);
   if(rc == 0)
index c6ea5f0594aa63294e53baa4e5c6fc4161d60fc0..d4bdd1c1305b45f911c66e1d19c8a68ec49c8ab1 100644 (file)
@@ -410,10 +410,14 @@ void aptEventHandler(u32 arg)
        svcExitThread();
 }
 
+static bool aptInitialised = false;
+
 Result aptInit(void)
 {
        Result ret=0;
 
+       if (aptInitialised) return ret;
+
        // Initialize APT stuff, escape load screen.
        ret = __apt_initservicehandle();
        if(ret!=0)return ret;
@@ -445,11 +449,15 @@ Result aptInit(void)
        } else
                aptAppStarted();
 
+       aptInitialised = true;
+
        return 0;
 }
 
 void aptExit()
 {
+       if (!aptInitialised) return;
+
        if(!(__system_runflags&RUNFLAG_APTWORKAROUND))aptAppletUtility_Exit_RetToApp(0);
 
        // This is only executed when application-termination was triggered via the home-menu power-off screen.
index cec30d140d2e2b490cdb20ff5e27307867edf1be..d7fe22e7c813ac4ab213a13bbd338f54497da96e 100644 (file)
@@ -37,12 +37,21 @@ FS_makePath(FS_pathType type,
  *
  *  @returns error
  */
+
+static bool fsInitialised = false;
+
 Result
 fsInit(void)
 {
-       Result ret;
+       Result ret = 0;
+
+       if (fsInitialised) return ret;
+
        if((ret=srvGetServiceHandle(&fsuHandle, "fs:USER"))!=0)return ret;
        if(__get_handle_from_list("fs:USER")==0)ret=FSUSER_Initialize(NULL);
+
+       fsInitialised = true;
+
        return ret;
 }
 
@@ -53,6 +62,8 @@ fsInit(void)
 Result
 fsExit(void)
 {
+       if (!fsInitialised) return 0;
+
        return svcCloseHandle(fsuHandle);
 }
 
index a66a4fd9c136d02ffa923dd681b75c9753cf03ec..54657dabaff060de7e18668794231b77a349a8b4 100644 (file)
@@ -23,13 +23,16 @@ static circlePosition cPos;
 static accelVector aVec;
 static angularRate gRate;
 
+static bool hidInitialised;
 
 Result hidInit(u32* sharedMem)
 {
        u8 val=0;
+       Result ret=0;
+
+       if(hidInitialised) return ret;
 
        if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
-       Result ret=0;
 
        // Request service.
        if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret;
@@ -61,6 +64,8 @@ cleanup1:
 
 void hidExit()
 {
+       if(!hidInitialised) return;
+
        // Unmap HID sharedmem and close handles.
        u8 val=0;
        int i; for(i=0; i<5; i++)svcCloseHandle(hidEvents[i]);
index 8f9d524132bc447a84f756ed49ad4d9034ffff17..366eca66dd088687a71dd9c898a411340a03d6ef 100644 (file)
@@ -72,10 +72,13 @@ void __destroy_handle_list(void) {
        __service_ptr->num = 0;
 }
 
+
 Result srvInit()
 {
        Result rc = 0;
 
+       if(g_srv_handle != 0) return rc;
+
        if((rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc;
 
        if((rc = srvRegisterClient())) {
diff --git a/libctru/source/system/appExit.c b/libctru/source/system/appExit.c
new file mode 100644 (file)
index 0000000..d2e9d48
--- /dev/null
@@ -0,0 +1,17 @@
+#include <3ds/types.h>
+#include <3ds/srv.h>
+#include <3ds/gfx.h>
+#include <3ds/sdmc.h>
+#include <3ds/services/apt.h>
+#include <3ds/services/fs.h>
+#include <3ds/services/hid.h>
+
+void __attribute__((weak)) __appExit() {
+       // Exit services
+       sdmcExit();
+       fsExit();
+
+       hidExit();
+       aptExit();
+       srvExit();
+}
diff --git a/libctru/source/system/appInit.c b/libctru/source/system/appInit.c
new file mode 100644 (file)
index 0000000..ac90ae6
--- /dev/null
@@ -0,0 +1,17 @@
+#include <3ds/types.h>
+#include <3ds/srv.h>
+#include <3ds/gfx.h>
+#include <3ds/sdmc.h>
+#include <3ds/services/apt.h>
+#include <3ds/services/fs.h>
+#include <3ds/services/hid.h>
+
+void __attribute__((weak)) __appInit() {
+       // Initialize services
+       srvInit();
+       aptInit();
+       hidInit(NULL);
+
+       fsInit();
+       sdmcInit();
+}
index 9a866090afbbfdc0478baa3be20028bc12ba2179..058ea7caa263e31ce1ebaccb4eb355cdfd5b692d 100644 (file)
@@ -7,6 +7,7 @@ extern u32 __heap_size, __linear_heap_size;
 extern void (*__system_retAddr)(void);
 
 void __destroy_handle_list(void);
+void __appExit();
 
 void __libc_fini_array(void);
 
@@ -17,7 +18,7 @@ void __attribute__((weak)) __attribute__((noreturn)) __ctru_exit(int rc)
        // Run the global destructors
        __libc_fini_array();
 
-       // TODO: APT exit goes here
+       __appExit();
 
        // Unmap the linear heap
        svcControlMemory(&tmp, __linear_heap, 0x0, __linear_heap_size, MEMOP_FREE, 0x0);
index be5c1189fc02d8b162034770beb73187fd01024a..080d1258c7fdf7a81f08d5ef6b342f9adacde5f2 100644 (file)
@@ -10,6 +10,7 @@ extern void* __service_ptr; // used to detect if we're run from a homebrew launc
 
 void __system_allocateHeaps();
 void __system_initArgv();
+void __appInit();
 
 // newlib definitions we need
 void __libc_init_array(void);
@@ -29,7 +30,7 @@ void __attribute__((weak)) initSystem(void (*retAddr)(void))
        // Build argc/argv if present
        __system_initArgv();
 
-       // TODO: APT init goes here
+       __appInit();
 
        // Run the global constructors
        __libc_init_array();