]> Chaos Git - corbenik/ctrulib.git/commitdiff
Revise most services to follow these guidelines:
authorfincs <fincs.alt1@gmail.com>
Sat, 7 Nov 2015 00:25:31 +0000 (01:25 +0100)
committerfincs <fincs.alt1@gmail.com>
Sat, 7 Nov 2015 00:25:31 +0000 (01:25 +0100)
- Each service must have xyzInit/xyzExit (with that name)
- xyzInit/xyzExit use reference counting
- xyzExit returns void
- The utilities in <3ds/result.h> are used instead of manual error checking
- The intrinsics in <3ds/synchronization.h> are used instead of inline asm
- Other miscellaneous changes
  - APT now uses a lightweight lock instead of a mutex
  - Initial handle parameters in PTMU were killed
  - Explicit init'ion to 0 or NULL has been removed for global variables
    since they end up on .bss anyway
  - MIC hasn't been touched because it must be rewritten first
  - CFGNOR needs a slight touch before converting
  - SOC is still to be cleaned up

45 files changed:
libctru/include/3ds/services/ac.h
libctru/include/3ds/services/am.h
libctru/include/3ds/services/cam.h
libctru/include/3ds/services/cfgu.h
libctru/include/3ds/services/csnd.h
libctru/include/3ds/services/dsp.h
libctru/include/3ds/services/fs.h
libctru/include/3ds/services/ir.h
libctru/include/3ds/services/mvd.h
libctru/include/3ds/services/news.h
libctru/include/3ds/services/ns.h
libctru/include/3ds/services/pm.h
libctru/include/3ds/services/ps.h
libctru/include/3ds/services/ptm.h
libctru/include/3ds/services/y2r.h
libctru/source/gfx.c
libctru/source/ndsp/ndsp-internal.h
libctru/source/ndsp/ndsp.c
libctru/source/os.c
libctru/source/romfs_dev.c
libctru/source/sdmc_dev.c
libctru/source/services/ac.c
libctru/source/services/am.c
libctru/source/services/apt.c
libctru/source/services/cam.c
libctru/source/services/cfgnor.c
libctru/source/services/cfgu.c
libctru/source/services/csnd.c
libctru/source/services/dsp.c
libctru/source/services/fs.c
libctru/source/services/gsp.c
libctru/source/services/hb.c
libctru/source/services/hid.c
libctru/source/services/httpc.c
libctru/source/services/ir.c
libctru/source/services/irrst.c
libctru/source/services/mvd.c
libctru/source/services/news.c
libctru/source/services/ns.c
libctru/source/services/pm.c
libctru/source/services/ps.c
libctru/source/services/ptm.c
libctru/source/services/qtm.c
libctru/source/services/y2r.c
libctru/source/srv.c

index 6e5fc0f82f439c2b9d0011c91f573fce70c93cea..c2e0c304c3f8984d1da67aadd45f01261307894a 100644 (file)
@@ -8,7 +8,7 @@
 Result acInit(void);
 
 /// Exits AC.
-Result acExit(void);
+void acExit(void);
 
 /**
  * @brief Gets the current Wifi status.
index f601d7827adf586c963f6a21969c5fc17b432179..0827d1033e94d067af894967967b949fcac99194 100644 (file)
@@ -19,7 +19,7 @@ typedef struct
 Result amInit(void);
 
 /// Exits AM.
-Result amExit(void);
+void amExit(void);
 
 /// Gets the current AM session handle.
 Handle *amGetSessionHandle(void);
index 0c771974432851b161e660500b45227965dfac18..e7803f47bb3cffec0942ce06dafa093b756c3af3 100644 (file)
@@ -257,7 +257,7 @@ Result camInit(void);
  *
  * This will internally call CAMU_DriverFinalize and close the handle of the service.
  */
-Result camExit(void);
+void camExit(void);
 
 /**
  * Begins capture on the specified camera port.
index 322bbd6725cd45d75d735301fa803c38565c4f25..d9cc53c5352067fa4419c4b0db87b11329e53d75 100644 (file)
@@ -30,10 +30,10 @@ typedef enum
 } CFG_Langage;
 
 /// Initializes CFGU.
-Result initCfgu(void);
+Result cfguInit(void);
 
 /// Exits CFGU.
-Result exitCfgu(void);
+void cfguExit(void);
 
 /**
  * @brief Gets the system's region from secure info.
index 10d4d4632b049b2d9486a825f0e5088399be77de..a40386e7346838c08bf2985ef3fb1aeff0a47d2c 100644 (file)
@@ -152,7 +152,7 @@ Result CSND_Reset(void);
 Result csndInit(void);
 
 /// Exits CSND.
-Result csndExit(void);
+void csndExit(void);
 
 /**
  * @brief Adds a command to the list, returning a buffer to write arguments to.
index 4515e38b48a41bba49ec3e2ed3c8419295e1b9b1..fcbab2662bd6db394d7aa67c95d1ec8c054a761a 100644 (file)
@@ -33,7 +33,7 @@ Result dspInit(void);
  * @brief Closes the dsp service.
  * @note This will also unload the DSP binary.
  */
-Result dspExit(void);
+void dspExit(void);
 
 /**
  * @brief Checks if a headphone is inserted.
index 159c5ddc10884175a9006978bbf282120197fb0d..14f849fd61fc7b2b10c9da5ad3b41c2186855a55 100644 (file)
@@ -113,7 +113,7 @@ typedef struct
 Result fsInit(void);
 
 /// Exits FS.
-Result fsExit(void);
+void fsExit(void);
 
 /**
  * @brief Gets the current FS session handle.
index 8e1beb143ffea8d3b4701dced8895cfe72de440e..2f9c69c0eade4acc459b97dbcf5193e79e00b69a 100644 (file)
  * @param sharedmem_addr Address of the shared memory block to use.
  * @param sharedmem_size Size of the shared memory block.
  */
-Result IRU_Initialize(u32 *sharedmem_addr, u32 sharedmem_size);
+Result iruInit(u32 *sharedmem_addr, u32 sharedmem_size);
 
 /// Shuts down IRU.
-Result IRU_Shutdown(void);
+void iruExit(void);
 
 /**
  * @brief Gets the IRU service handle.
  * @return The IRU service handle.
  */
-Handle IRU_GetServHandle(void);
+Handle iruGetServHandle(void);
 
 /**
  * @brief Sends IR data.
@@ -27,7 +27,7 @@ Handle IRU_GetServHandle(void);
  * @param size Size of the buffer.
  * @param wait Whether to wait for the data to be sent.
  */
-Result IRU_SendData(u8 *buf, u32 size, u32 wait);
+Result iruSendData(u8 *buf, u32 size, bool wait);
 
 /**
  * @brief Receives IR data.
@@ -37,7 +37,7 @@ Result IRU_SendData(u8 *buf, u32 size, u32 wait);
  * @param transfercount Pointer to write the bytes read to.
  * @param wait Whether to wait for the data to be received.
  */
-Result IRU_RecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, u32 wait);
+Result iruRecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, bool wait);
 
 /**
  * @brief Sets the IR bit rate.
index c6d5c1211c00379231e3dce202262fffb8744599..d216f4869790dc7543e1cbed224c2ac61f27569f 100644 (file)
@@ -69,7 +69,7 @@ void mvdstdGenerateDefaultConfig(mvdstdConfig *config, u32 input_width, u32 inpu
 Result mvdstdInit(mvdstdMode mode, mvdstdTypeInput input_type, mvdstdTypeOutput output_type, u32 size);
 
 /// Shuts down MVDSTD.
-Result mvdstdShutdown(void);
+void mvdstdExit(void);
 
 /**
  * @brief Sets the current configuration of MVDSTD.
index 68c11a55551fb822c90a323e3e1cabd31d8b3000..14717af79633c65b1219c25fde70c82bc93f7651 100644 (file)
@@ -8,7 +8,7 @@
 Result newsInit(void);
 
 /// Exits NEWS.
-Result newsExit(void);
+void newsExit(void);
 
 /**
  * @brief Adds a notification to the home menu Notifications applet.
index de3c7f31af8175dadaf34bc835ac63edc60587a9..5649c2c74ec67491bb75ba1f33c2742978f80e9a 100644 (file)
@@ -8,7 +8,7 @@
 Result nsInit(void);
 
 /// Exits NS.
-Result nsExit(void);
+void nsExit(void);
 
 /**
  * @brief Launches a title.
index b8fd3c4b97fe653b0edbb7a6833406c3cc794c2b..e3d3e84931d2d4a4e150a58152910bc7e2ef8fc3 100644 (file)
@@ -8,7 +8,7 @@
 Result pmInit(void);
 
 /// Exits PM.
-Result pmExit(void);
+void pmExit(void);
 
 /**
  * @brief Launches a title.
index 4667d29b0ac775f9df0321dbeffd2459eb80b079..2a6e95da05ff0216b01d7ba81f79b058b265ad86 100644 (file)
@@ -34,7 +34,7 @@ typedef enum
 Result psInit(void);
 
 /// Exits PS.
-Result psExit(void);
+void psExit(void);
 
 /**
  * @brief Encrypts/Decrypts AES data. Does not support AES CCM.
index 1ee87afeabcb6c560dfb1fe01a5db1a8a7e5ecd1..26872eaf1805da659ffdaa5223edee1af76d5d7c 100644 (file)
@@ -8,48 +8,43 @@
 Result ptmInit(void);
 
 /// Exits PTM.
-Result ptmExit(void);
+void ptmExit(void);
 
 /// Initializes ptm:sysm.
 Result ptmSysmInit(void);
 
 /// Exits ptm:sysm.
-Result ptmSysmExit(void);
+void ptmSysmExit(void);
 
 /**
  * @brief Gets the system's current shell state.
- * @param servhandle Optional pointer to the handle to use.
  * @param out Pointer to write the current shell state to. (0 = closed, 1 = open)
  */
-Result PTMU_GetShellState(Handle* servhandle, u8 *out);
+Result PTMU_GetShellState(u8 *out);
 
 /**
  * @brief Gets the system's current battery level.
- * @param servhandle Optional pointer to the handle to use.
  * @param out Pointer to write the current battery level to. (0-5)
  */
-Result PTMU_GetBatteryLevel(Handle* servhandle, u8 *out);
+Result PTMU_GetBatteryLevel(u8 *out);
 
 /**
  * @brief Gets the system's current battery charge state.
- * @param servhandle Optional pointer to the handle to use.
  * @param out Pointer to write the current battery charge state to. (0 = not charging, 1 = charging)
  */
-Result PTMU_GetBatteryChargeState(Handle* servhandle, u8 *out);
+Result PTMU_GetBatteryChargeState(u8 *out);
 
 /**
  * @brief Gets the system's current pedometer state.
- * @param servhandle Optional pointer to the handle to use.
  * @param out Pointer to write the current pedometer state to. (0 = not counting, 1 = counting)
  */
-Result PTMU_GetPedometerState(Handle* servhandle, u8 *out);
+Result PTMU_GetPedometerState(u8 *out);
 
 /**
  * @brief Gets the pedometer's total step count.
- * @param servhandle Optional pointer to the handle to use.
  * @param steps Pointer to write the total step count to.
  */
-Result PTMU_GetTotalStepCount(Handle* servhandle, u32 *steps);
+Result PTMU_GetTotalStepCount(u32 *steps);
 
 /**
  * @brief Configures the New 3DS' CPU clock speed and L2 cache.
index 9194e618d174c3df9eb22783903d6fa869e947ca..cef3dd1e0a56d02954a35c0df5da211fc2f065b6 100644 (file)
@@ -151,7 +151,7 @@ Result y2rInit(void);
  *
  * This will internally call Y2RU_DriverFinalize and close the handle of the service.
  */
-Result y2rExit(void);
+void y2rExit(void);
 
 
 /**
index 19975f204d390a43820762537bce5d4ba30decf5..bf541e771ff538c147c4f85cb18a225f901df7a7 100644 (file)
@@ -99,7 +99,7 @@ void gfxWriteFramebufferInfo(gfxScreen_t screen)
        framebufferInfoHeader[0x1]=1;
 }
 
-void (*screenFree)(void *) = NULL;
+static void (*screenFree)(void *) = NULL;
 
 void gfxInit(GSP_FramebufferFormats topFormat, GSP_FramebufferFormats bottomFormat, bool vrambuffers)
 {
index bf37b82e459f8a4da3b49a23924c5454005752e3..18da7ea184e5a7ff4392aa7c8e66e6bc8b711902 100644 (file)
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/os.h>
 #include <3ds/synchronization.h>
index b885a2ee6c0f3be963b7f62e724ae9acfa27797e..de50b381b6fa6fddfbfdaff6ecd3ddb0d2d3056f 100644 (file)
@@ -208,16 +208,16 @@ static Result ndspInitialize(bool resume)
        Result rc;
 
        rc = ndspLoadComponent();
-       if (rc) return rc;
+       if (R_FAILED(rc)) return rc;
 
        rc = svcCreateEvent(&irqEvent, 1);
-       if (rc) goto _fail1;
+       if (R_FAILED(rc)) goto _fail1;
 
        rc = DSP_RegisterInterruptEvents(irqEvent, 2, 2);
-       if (rc) goto _fail2;
+       if (R_FAILED(rc)) goto _fail2;
 
        rc = DSP_GetSemaphoreHandle(&dspSem);
-       if (rc) goto _fail3;
+       if (R_FAILED(rc)) goto _fail3;
 
        DSP_SetSemaphoreMask(0x2000);
 
@@ -383,7 +383,7 @@ void ndspUseComponent(const void* binary, u32 size, u16 progMask, u16 dataMask)
        componentFree = false;
 }
 
-bool ndspFindAndLoadComponent(void)
+static bool ndspFindAndLoadComponent(void)
 {
        extern Handle __get_handle_from_list(const char* name);
        Result rc;
@@ -401,11 +401,11 @@ bool ndspFindAndLoadComponent(void)
                FS_path path = { PATH_CHAR, sizeof(dsp_filename), (u8*)dsp_filename };
 
                rc = FSUSER_OpenFileDirectly(&rsrc, arch, path, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
-               if (rc) break;
+               if (R_FAILED(rc)) break;
 
                u64 size = 0;
                rc = FSFILE_GetSize(rsrc, &size);
-               if (rc) { FSFILE_Close(rsrc); break; }
+               if (R_FAILED(rc)) { FSFILE_Close(rsrc); break; }
 
                bin = malloc(size);
                if (!bin) { FSFILE_Close(rsrc); break; }
@@ -413,7 +413,7 @@ bool ndspFindAndLoadComponent(void)
                u32 dummy = 0;
                rc = FSFILE_Read(rsrc, &dummy, 0, bin, size);
                FSFILE_Close(rsrc);
-               if (rc) { free(bin); return false; }
+               if (R_FAILED(rc)) { free(bin); return false; }
 
                componentBin = bin;
                componentSize = size;
@@ -428,7 +428,7 @@ bool ndspFindAndLoadComponent(void)
                extern u32 fake_heap_end;
                u32 mapAddr = (fake_heap_end+0xFFF) &~ 0xFFF;
                rc = svcMapMemoryBlock(rsrc, mapAddr, 0x3, 0x3);
-               if (rc) break;
+               if (R_FAILED(rc)) break;
 
                componentSize = *(u32*)(mapAddr + 0x104);
                bin = malloc(componentSize);
@@ -450,11 +450,11 @@ static int ndspRefCount = 0;
 Result ndspInit(void)
 {
        Result rc = 0;
-       if (ndspRefCount++) return 0;
+       if (AtomicPostIncrement(&ndspRefCount)) return 0;
 
        if (!componentBin && !ndspFindAndLoadComponent())
        {
-               rc = 1018 | (41 << 10) | (4 << 21) | (27 << 27);
+               rc = MAKERESULT(RL_PERMANENT, RS_NOTFOUND, 41, RD_NOT_FOUND);
                goto _fail0;
        }
 
@@ -462,27 +462,27 @@ Result ndspInit(void)
        ndspInitMaster();
        ndspiInitChn();
 
-       rc = initCfgu();
-       if (rc==0)
+       rc = cfguInit();
+       if (R_SUCCEEDED(rc))
        {
                u8 outMode;
                rc = CFGU_GetConfigInfoBlk2(sizeof(outMode), 0x70001, &outMode);
-               if (rc==0)
+               if (R_SUCCEEDED(rc))
                        ndspMaster.outputMode = outMode;
-               exitCfgu();
+               cfguExit();
        }
 
        rc = dspInit();
-       if (rc) return rc;
+       if (R_FAILED(rc)) return rc;
 
        rc = ndspInitialize(false);
-       if (rc) goto _fail1;
+       if (R_FAILED(rc)) goto _fail1;
 
        rc = svcCreateEvent(&sleepEvent, 0);
-       if (rc) goto _fail2;
+       if (R_FAILED(rc)) goto _fail2;
 
        rc = svcCreateThread(&ndspThread, ndspThreadMain, 0x0, (u32*)(&ndspThreadStack[NDSP_THREAD_STACK_SIZE/8]), 0x31, -2);
-       if (rc) goto _fail3;
+       if (R_FAILED(rc)) goto _fail3;
 
        aptHook(&aptCookie, ndspAptHook, NULL);
        return 0;
@@ -499,14 +499,13 @@ _fail1:
                componentBin = NULL;
        }
 _fail0:
-       ndspRefCount--;
+       AtomicDecrement(&ndspRefCount);
        return rc;
 }
 
 void ndspExit(void)
 {
-       if (!ndspRefCount) return;
-       if (--ndspRefCount) return;
+       if (AtomicDecrement(&ndspRefCount)) return;
        if (!bDspReady) return;
        ndspThreadRun = false;
        if (bSleeping)
index 029d9fc6c39e4d2ed90cf7af2b51d7a33a7090ce..885ac3ef34a89c4453694d696ef8c930aeeaeb2e 100644 (file)
@@ -1,4 +1,5 @@
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/os.h>
 #include <3ds/svc.h>
 #include <3ds/services/ptm.h>
@@ -138,7 +139,7 @@ const char* osStrError(u32 error) {
 
 void __ctru_speedup_config(void)
 {
-       if (ptmSysmInit()==0)
+       if (R_SUCCEEDED(ptmSysmInit()))
        {
                PTMSYSM_ConfigureNew3DSCPU(__ctru_speedup ? 3 : 0);
                ptmSysmExit();
index e5e6a49085edb36b635814a725640aa17705ec90..729a8ee364623b0f5c07952ab738342b17c88e7a 100644 (file)
@@ -9,6 +9,7 @@
 #include <unistd.h>
 
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/romfs.h>
 #include <3ds/services/fs.h>
@@ -40,7 +41,7 @@ static ssize_t _romfs_read(u64 offset, void* buffer, u32 size)
        u64 pos = (u64)romFS_offset + offset;
        u32 read = 0;
        Result rc = FSFILE_Read(romFS_file, &read, pos, buffer, size);
-       if (rc) return -1;
+       if (R_FAILED(rc)) return -1;
        return read;
 }
 
@@ -140,7 +141,7 @@ Result romfsInit(void)
                FS_path path = { PATH_WCHAR, (units+1)*2, (u8*)__utf16path };
 
                Result rc = FSUSER_OpenFileDirectly(&romFS_file, arch, path, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
-               if (rc) return rc;
+               if (R_FAILED(rc)) return rc;
 
                _3DSX_Header hdr;
                if (!_romfs_read_chk(0, &hdr, sizeof(hdr))) goto _fail0;
@@ -158,7 +159,7 @@ Result romfsInit(void)
                FS_path path = { PATH_BINARY, sizeof(zeros), zeros };
 
                Result rc = FSUSER_OpenFileDirectly(&romFS_file, arch, path, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
-               if (rc) return rc;
+               if (R_FAILED(rc)) return rc;
        }
 
        return romfsInitCommon();
index 734116eaced2b7e1e927c55e6a851f560bd0d0cf..47037dc6abf491cbd3293f69acbf8c771891ecce 100644 (file)
@@ -9,6 +9,7 @@
 #include <unistd.h>
 
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/sdmc.h>
 #include <3ds/services/fs.h>
 #include <3ds/util/utf.h>
@@ -228,7 +229,7 @@ Result sdmcInit(void)
     return rc;
 
   rc = FSUSER_OpenArchive(&sdmcArchive);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
   {
 
     int dev = AddDevice(&sdmc_devoptab);
@@ -288,7 +289,7 @@ Result sdmcExit(void)
   if(!sdmcInitialised) return rc;
 
   rc = FSUSER_CloseArchive(&sdmcArchive);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
   {
     RemoveDevice("sdmc");
     sdmcInitialised = false;
@@ -365,7 +366,7 @@ sdmc_open(struct _reent *r,
   if((flags & O_CREAT) && (flags & O_EXCL))
   {
     rc = FSUSER_CreateFile(sdmcArchive, fs_path, 0);
-    if(rc != 0)
+    if(R_FAILED(rc))
     {
       r->_errno = sdmc_translate_error(rc);
       return -1;
@@ -379,12 +380,12 @@ sdmc_open(struct _reent *r,
   /* open the file */
   rc = FSUSER_OpenFile(&fd, sdmcArchive, fs_path,
                        sdmc_flags, attributes);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
   {
     if((flags & O_ACCMODE) != O_RDONLY && (flags & O_TRUNC))
     {
       rc = FSFILE_SetSize(fd, 0);
-      if(rc != 0)
+      if(R_FAILED(rc))
       {
         FSFILE_Close(fd);
         r->_errno = sdmc_translate_error(rc);
@@ -420,7 +421,7 @@ sdmc_close(struct _reent *r,
   sdmc_file_t *file = (sdmc_file_t*)fd;
 
   rc = FSFILE_Close(file->fd);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
     return 0;
 
   r->_errno = sdmc_translate_error(rc);
@@ -465,7 +466,7 @@ sdmc_write(struct _reent *r,
   {
     /* append means write from the end of the file */
     rc = FSFILE_GetSize(file->fd, &file->offset);
-    if(rc != 0)
+    if(R_FAILED(rc))
     {
       r->_errno = sdmc_translate_error(rc);
       return -1;
@@ -488,7 +489,7 @@ sdmc_write(struct _reent *r,
     /* write the data */
     rc = FSFILE_Write(file->fd, &bytes, file->offset, 
                       (u32*)tmp_buffer, (u32)toWrite, sync);
-    if(rc != 0)
+    if(R_FAILED(rc))
     {
       /* return partial transfer */
       if(bytesWritten > 0)
@@ -538,7 +539,7 @@ sdmc_read(struct _reent *r,
 
   /* read the data */
   rc = FSFILE_Read(file->fd, &bytes, file->offset, (u32*)ptr, (u32)len);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
   {
     /* update current file offset */
     file->offset += bytes;
@@ -587,7 +588,7 @@ sdmc_seek(struct _reent *r,
     /* set position relative to the end of the file */
     case SEEK_END:
       rc = FSFILE_GetSize(file->fd, &offset);
-      if(rc != 0)
+      if(R_FAILED(rc))
       {
         r->_errno = sdmc_translate_error(rc);
         return -1;
@@ -632,7 +633,7 @@ sdmc_fstat(struct _reent *r,
   sdmc_file_t *file = (sdmc_file_t*)fd;
 
   rc = FSFILE_GetSize(file->fd, &size);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
   {
     memset(st, 0, sizeof(struct stat));
     st->st_size = (off_t)size;
@@ -667,8 +668,8 @@ sdmc_stat(struct _reent *r,
   if(fs_path.data == NULL)
     return -1;
 
-  if((rc = FSUSER_OpenFile(&fd, sdmcArchive, fs_path,
-                           FS_OPEN_READ, FS_ATTRIBUTE_NONE)) == 0)
+  if(R_SUCCEEDED(rc = FSUSER_OpenFile(&fd, sdmcArchive, fs_path,
+                           FS_OPEN_READ, FS_ATTRIBUTE_NONE)))
   {
     sdmc_file_t tmpfd = { .fd = fd };
     rc = sdmc_fstat(r, (int)&tmpfd, st);
@@ -676,7 +677,7 @@ sdmc_stat(struct _reent *r,
 
     return rc;
   }
-  else if((rc = FSUSER_OpenDirectory(&fd, sdmcArchive, fs_path)) == 0)
+  else if(R_SUCCEEDED(rc = FSUSER_OpenDirectory(&fd, sdmcArchive, fs_path)))
   {
     memset(st, 0, sizeof(struct stat));
     st->st_nlink = 1;
@@ -727,7 +728,7 @@ sdmc_unlink(struct _reent *r,
     return -1;
 
   rc = FSUSER_DeleteFile(sdmcArchive, fs_path);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
     return 0;
 
   r->_errno = sdmc_translate_error(rc);
@@ -755,7 +756,7 @@ sdmc_chdir(struct _reent *r,
     return -1;
 
   rc = FSUSER_OpenDirectory(&fd, sdmcArchive, fs_path);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
   {
     FSDIR_Close(fd);
     strncpy(__cwd, __fixedpath, PATH_MAX);
@@ -796,11 +797,11 @@ sdmc_rename(struct _reent *r,
     return -1;
 
   rc = FSUSER_RenameFile(sdmcArchive, fs_path_old, sdmcArchive, fs_path_new);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
     return 0;
 
   rc = FSUSER_RenameDirectory(sdmcArchive, fs_path_old, sdmcArchive, fs_path_new);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
     return 0;
 
   r->_errno = sdmc_translate_error(rc);
@@ -831,7 +832,7 @@ sdmc_mkdir(struct _reent *r,
   /* TODO: Use mode to set directory attributes. */
 
   rc = FSUSER_CreateDirectory(sdmcArchive, fs_path);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
     return 0;
 
   r->_errno = sdmc_translate_error(rc);
@@ -866,7 +867,7 @@ sdmc_diropen(struct _reent *r,
 
   /* open the directory */
   rc = FSUSER_OpenDirectory(&fd, sdmcArchive, fs_path);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
   {
     dir->fd = fd;
     memset(&dir->entry_data, 0, sizeof(dir->entry_data));
@@ -919,7 +920,7 @@ sdmc_dirnext(struct _reent *r,
   /* fetch the next entry */
   memset(&dir->entry_data, 0, sizeof(dir->entry_data));
   rc = FSDIR_Read(dir->fd, &entries, 1, &dir->entry_data);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
   {
     if(entries == 0)
     {
@@ -976,7 +977,7 @@ sdmc_dirclose(struct _reent *r,
 
   /* close the directory */
   rc = FSDIR_Close(dir->fd);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
     return 0;
 
   r->_errno = sdmc_translate_error(rc);
@@ -1006,7 +1007,7 @@ sdmc_statvfs(struct _reent  *r,
                                      &numClusters,
                                      &freeClusters);
 
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
   {
     buf->f_bsize   = clusterSize;
     buf->f_frsize  = clusterSize;
@@ -1021,7 +1022,7 @@ sdmc_statvfs(struct _reent  *r,
     buf->f_namemax = 0; //??? how to get
 
     rc = FSUSER_IsSdmcWritable(&writable);
-    if(rc != 0 || !writable)
+    if(R_FAILED(rc) || !writable)
       buf->f_flag |= ST_RDONLY;
 
     return 0;
@@ -1059,7 +1060,7 @@ sdmc_ftruncate(struct _reent *r,
 
   /* set the new file size */
   rc = FSFILE_SetSize(file->fd, len);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
     return 0;
 
   r->_errno = sdmc_translate_error(rc);
@@ -1084,7 +1085,7 @@ sdmc_fsync(struct _reent *r,
   sdmc_file_t *file = (sdmc_file_t*)fd;
 
   rc = FSFILE_Flush(file->fd);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
     return 0;
 
   r->_errno = sdmc_translate_error(rc);
@@ -1147,7 +1148,7 @@ sdmc_rmdir(struct _reent *r,
     return -1;
 
   rc = FSUSER_DeleteDirectory(sdmcArchive, fs_path);
-  if(rc == 0)
+  if(R_SUCCEEDED(rc))
     return 0;
 
   r->_errno = sdmc_translate_error(rc);
index a1a36e066b67d80e024a8965d81f1df80c3b3e23..a35a7a327c8f86b7943767228bdcfd45b0f7d3b5 100644 (file)
@@ -1,22 +1,32 @@
 #include <stdlib.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/ac.h>
 #include <3ds/ipc.h>
 
 static Handle acHandle;
+static int acRefCount;
 
 Result acInit(void)
 {
-       Result ret = srvGetServiceHandle(&acHandle, "ac:u");
-       if(!ret)return ret;
-       return srvGetServiceHandle(&acHandle, "ac:i");
+       Result ret;
+
+       if (AtomicPostIncrement(&acRefCount)) return 0;
+
+       ret = srvGetServiceHandle(&acHandle, "ac:u");
+       if(R_FAILED(ret)) ret = srvGetServiceHandle(&acHandle, "ac:i");
+       if(R_FAILED(ret)) AtomicDecrement(&acRefCount);
+
+       return ret;
 }
 
-Result acExit(void)
+void acExit(void)
 {
-       return svcCloseHandle(acHandle);
+       if (AtomicDecrement(&acRefCount)) return;
+       svcCloseHandle(acHandle);
 }
 
 // ptr=0x200-byte outbuf
@@ -33,7 +43,7 @@ Result ACU_CreateDefaultConfig(u32 *ptr)
        staticbufs[0] = IPC_Desc_StaticBuffer(0x200,0);
        staticbufs[1] = (u32)ptr;
 
-       if((ret = svcSendSyncRequest(acHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
 
        staticbufs[0] = savedValue0;
        staticbufs[1] = savedValue1;
@@ -58,7 +68,7 @@ Result ACU_cmd26(u32 *ptr, u8 val)
        cmdbuf[2] = IPC_Desc_StaticBuffer(0x200,0);
        cmdbuf[3] = (u32)ptr;
 
-       if((ret = svcSendSyncRequest(acHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
 
        staticbufs[0] = savedValue0;
        staticbufs[1] = savedValue1;
@@ -73,7 +83,7 @@ Result ACU_GetWifiStatus(u32 *out)
 
        cmdbuf[0] = IPC_MakeHeader(0xD,0,0); // 0x000D0000
 
-       if((ret = svcSendSyncRequest(acHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
 
        *out = cmdbuf[2];
 
@@ -85,12 +95,12 @@ Result ACU_WaitInternetConnection(void)
        Result ret=0;
        u32 outval=0;
 
-       if((ret = acInit())!=0)return ret;
+       if(R_FAILED(ret = acInit()))return ret;
 
        while(1)
        {
                ret = ACU_GetWifiStatus(&outval);
-               if(ret==0 && outval!=0)break;
+               if(R_SUCCEEDED(ret) && outval!=0)break;
        }
 
        acExit();
index 5b4c9041f0199f4bce0033c25e5d36c9a8aa7f3c..2a71007b45d9d26757d2dce4c48f5d2995d49c7c 100644 (file)
@@ -1,28 +1,35 @@
-#include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/am.h>
 #include <3ds/ipc.h>
 
-static Handle amHandle = 0;
+static Handle amHandle;
+static int amRefCount;
 
 Result amInit(void)
 {
-       if(srvGetServiceHandle(&amHandle, "am:net") == 0)
-               return (Result)0;
-       else if(srvGetServiceHandle(&amHandle, "am:u") == 0)
-               return (Result)0;
-       else if(srvGetServiceHandle(&amHandle, "am:sys") == 0)
-               return (Result)0;
-       else return srvGetServiceHandle(&amHandle, "am:app");
+       Result ret;
+
+       if (AtomicPostIncrement(&amRefCount)) return 0;
+
+       ret = srvGetServiceHandle(&amHandle, "am:net");
+       if (R_FAILED(ret)) ret = srvGetServiceHandle(&amHandle, "am:u");
+       if (R_FAILED(ret)) ret = srvGetServiceHandle(&amHandle, "am:sys");
+       if (R_FAILED(ret)) ret = srvGetServiceHandle(&amHandle, "am:app");
+       if (R_FAILED(ret)) AtomicDecrement(&amRefCount);
+
+       return ret;
 }
 
-Result amExit(void)
+void amExit(void)
 {
-       return svcCloseHandle(amHandle);
+       if (AtomicDecrement(&amRefCount)) return;
+       svcCloseHandle(amHandle);
 }
 
 Handle *amGetSessionHandle(void)
@@ -38,7 +45,7 @@ Result AM_GetTitleCount(u8 mediatype, u32 *count)
        cmdbuf[0] = IPC_MakeHeader(0x1,1,0); // 0x00010040
        cmdbuf[1] = mediatype;
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        *count = cmdbuf[2];
        
@@ -56,7 +63,7 @@ Result AM_GetTitleIdList(u8 mediatype, u32 count, u64 *titleIDs)
        cmdbuf[3] = IPC_Desc_Buffer(count*sizeof(u64),IPC_BUFFER_W);
        cmdbuf[4] = (u32)titleIDs;
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
        
        return (Result)cmdbuf[1];
 }
@@ -74,7 +81,7 @@ Result AM_ListTitles(u8 mediatype, u32 titleCount, u64 *titleIdList, AM_TitleEnt
        cmdbuf[5] = IPC_Desc_Buffer(titleCount*sizeof(AM_TitleEntry),IPC_BUFFER_W);
        cmdbuf[6] = (u32)titleList;
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -86,7 +93,7 @@ Result AM_GetDeviceId(u32 *deviceID)
 
        cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0x000A0000
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        *deviceID = cmdbuf[3];
        
@@ -101,7 +108,7 @@ Result AM_StartCiaInstall(u8 mediatype, Handle *ciaHandle)
        cmdbuf[0] = IPC_MakeHeader(0x402,1,0); // 0x04020040
        cmdbuf[1] = mediatype;
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        *ciaHandle = cmdbuf[3];
        
@@ -115,7 +122,7 @@ Result AM_StartDlpChildCiaInstall(Handle *ciaHandle)
 
        cmdbuf[0] = IPC_MakeHeader(0x403,0,0); // 0x04030000
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        *ciaHandle = cmdbuf[3];
        
@@ -131,7 +138,7 @@ Result AM_CancelCIAInstall(Handle *ciaHandle)
        cmdbuf[1] = IPC_Desc_MoveHandles(1);
        cmdbuf[2] = *ciaHandle;
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -145,7 +152,7 @@ Result AM_FinishCiaInstall(u8 mediatype, Handle *ciaHandle)
        cmdbuf[1] = IPC_Desc_MoveHandles(1);
        cmdbuf[2] = *ciaHandle;
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -160,7 +167,7 @@ Result AM_DeleteTitle(u8 mediatype, u64 titleID)
        cmdbuf[2] = titleID & 0xffffffff;
        cmdbuf[3] = (u32)(titleID >> 32);
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -175,7 +182,7 @@ Result AM_DeleteAppTitle(u8 mediatype, u64 titleID)
        cmdbuf[2] = titleID & 0xffffffff;
        cmdbuf[3] = (u32)(titleID >> 32);
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -187,7 +194,7 @@ Result AM_InstallNativeFirm(void)
 
        cmdbuf[0] = IPC_MakeHeader(0x40F,0,0); // 0x040F0000
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -202,10 +209,10 @@ Result AM_GetTitleProductCode(u8 mediatype, u64 titleID, char* productCode)
        cmdbuf[2] = titleID & 0xffffffff;
        cmdbuf[3] = (u32)(titleID >> 32);
        
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        // The product code string can use the full 16 bytes without NULL terminator
-       if(productCode) snprintf(productCode, 16, "%s", (char*)&cmdbuf[2]);
+       if(productCode) strncpy(productCode, (char*)&cmdbuf[2], 16);
 
        return (Result)cmdbuf[1];
 }
@@ -220,7 +227,7 @@ Result AM_GetCiaFileInfo(u8 mediatype, AM_TitleEntry *titleEntry, Handle fileHan
        cmdbuf[2] = IPC_Desc_SharedHandles(1);
        cmdbuf[3] = fileHandle;
 
-       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(titleEntry) memcpy(titleEntry, &cmdbuf[2], sizeof(AM_TitleEntry));
 
index 8fef5227c8fd82fd1f6607384b2b0432c394cbf9..62c8c08809ef6544b33dc7ff35bf2a2d4ed199d4 100644 (file)
@@ -5,8 +5,10 @@
 #include <stdlib.h>
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/apt.h>
 #include <3ds/services/gsp.h>
 #include <3ds/ipc.h>
@@ -20,11 +22,11 @@ extern u32 __system_runflags;
 
 NS_APPID currentAppId;
 
-static char *__apt_servicestr = NULL;
-static char *__apt_servicenames[3] = {"APT:U", "APT:S", "APT:A"};
+static const char *__apt_servicestr;
+static const char * const __apt_servicenames[3] = {"APT:U", "APT:S", "APT:A"};
 
-static u32 __apt_new3dsflag_initialized = 0;
-static u8 __apt_new3dsflag = 0;
+static u32 __apt_new3dsflag_initialized;
+static u8 __apt_new3dsflag;
 
 Handle aptLockHandle;
 Handle aptuHandle;
@@ -33,12 +35,12 @@ Handle aptEvents[3];
 Handle aptEventHandlerThread;
 u64 aptEventHandlerStack[APT_HANDLER_STACKSIZE/8]; // u64 so that it's 8-byte aligned
 
-Handle aptStatusMutex;
-Handle aptStatusEvent = 0;
+LightLock aptStatusMutex;
+Handle aptStatusEvent;
 APP_STATUS aptStatus = APP_NOTINITIALIZED;
 APP_STATUS aptStatusBeforeSleep = APP_NOTINITIALIZED;
-u32 aptStatusPower = 0;
-Handle aptSleepSync = 0;
+u32 aptStatusPower;
+Handle aptSleepSync;
 
 u32 aptParameters[0x1000/4]; //TEMP
 
@@ -90,7 +92,7 @@ static Result __apt_initservicehandle(void)
        for(i=0; i<3; i++)
        {
                ret = srvGetServiceHandle(&aptuHandle, __apt_servicenames[i]);
-               if(ret==0)
+               if(R_SUCCEEDED(ret))
                {
                        __apt_servicestr = __apt_servicenames[i];
                        return ret;
@@ -315,7 +317,7 @@ static void __handle_notification(void) {
        aptOpenSession();
        ret = APT_InquireNotification(currentAppId, &type);
        aptCloseSession();
-       if(ret!=0) return;
+       if(R_FAILED(ret)) return;
 
        _aptDebug(1, type);
 
@@ -445,37 +447,35 @@ void aptEventHandler(void *arg)
        svcExitThread();
 }
 
-static bool aptInitialised = false;
+static int aptRefCount = 0;
 
 Result aptInit(void)
 {
        Result ret=0;
 
-       if (aptInitialised) return ret;
-
-       aptStatusMutex = 0;
+       if (AtomicPostIncrement(&aptRefCount)) return 0;
 
        // Initialize APT stuff, escape load screen.
        ret = __apt_initservicehandle();
-       if(ret!=0)return ret;
-       if((ret=APT_GetLockHandle(0x0, &aptLockHandle)))return ret;
+       if(R_FAILED(ret)) goto _fail;
+       if(R_FAILED(ret=APT_GetLockHandle(0x0, &aptLockHandle))) goto _fail;
        svcCloseHandle(aptuHandle);
 
        currentAppId = __apt_appid;
 
        svcCreateEvent(&aptStatusEvent, 0);
        svcCreateEvent(&aptSleepSync, 0);
-       svcCreateMutex(&aptStatusMutex, false);
+       LightLock_Init(&aptStatusMutex);
        aptStatus=0;
 
        if(!aptIsCrippled())
        {
                aptOpenSession();
-               if((ret=APT_Initialize(currentAppId, &aptEvents[0], &aptEvents[1])))return ret;
+               if(R_FAILED(ret=APT_Initialize(currentAppId, &aptEvents[0], &aptEvents[1])))return ret;
                aptCloseSession();
                
                aptOpenSession();
-               if((ret=APT_Enable(0x0)))return ret;
+               if(R_FAILED(ret=APT_Enable(0x0))) goto _fail;
                aptCloseSession();
                
                // create APT close event
@@ -495,7 +495,7 @@ Result aptInit(void)
                }
                
                aptOpenSession();
-               if((ret=APT_NotifyToWait(currentAppId)))return ret;
+               if(R_FAILED(ret=APT_NotifyToWait(currentAppId)))return ret;
                aptCloseSession();
 
                // create APT event handler thread
@@ -507,14 +507,16 @@ Result aptInit(void)
        } else
                aptAppStarted();
 
-       aptInitialised = true;
-
        return 0;
+
+_fail:
+       AtomicDecrement(&aptRefCount);
+       return ret;
 }
 
 void aptExit(void)
 {
-       if (!aptInitialised) return;
+       if (AtomicDecrement(&aptRefCount)) return;
 
        if(!aptIsCrippled())aptAppletUtility_Exit_RetToApp(0);
 
@@ -559,11 +561,8 @@ void aptExit(void)
        
        svcCloseHandle(aptSleepSync);
 
-       svcCloseHandle(aptStatusMutex);
        svcCloseHandle(aptLockHandle);
        svcCloseHandle(aptStatusEvent);
-       
-       aptInitialised = false;
 }
 
 bool aptMainLoop(void)
@@ -660,15 +659,15 @@ void aptAppStarted(void)
 APP_STATUS aptGetStatus(void)
 {
        APP_STATUS ret;
-       svcWaitSynchronization(aptStatusMutex, U64_MAX);
+       LightLock_Lock(&aptStatusMutex);
        ret = aptStatus;
-       svcReleaseMutex(aptStatusMutex);
+       LightLock_Unlock(&aptStatusMutex);
        return ret;
 }
 
 void aptSetStatus(APP_STATUS status)
 {
-       svcWaitSynchronization(aptStatusMutex, U64_MAX);
+       LightLock_Lock(&aptStatusMutex);
 
        aptStatus = status;
 
@@ -680,37 +679,35 @@ void aptSetStatus(APP_STATUS status)
                        svcSignalEvent(aptStatusEvent);
        //}
 
-       svcReleaseMutex(aptStatusMutex);
+       LightLock_Unlock(&aptStatusMutex);
 }
 
 u32 aptGetStatusPower(void)
 {
        u32 ret;
-       svcWaitSynchronization(aptStatusMutex, U64_MAX);
+       LightLock_Lock(&aptStatusMutex);
        ret = aptStatusPower;
-       svcReleaseMutex(aptStatusMutex);
+       LightLock_Unlock(&aptStatusMutex);
        return ret;
 }
 
 void aptSetStatusPower(u32 status)
 {
-       svcWaitSynchronization(aptStatusMutex, U64_MAX);
+       LightLock_Lock(&aptStatusMutex);
        aptStatusPower = status;
-       svcReleaseMutex(aptStatusMutex);
+       LightLock_Unlock(&aptStatusMutex);
 }
 
 void aptOpenSession(void)
 {
-       //Result ret;
-
-       svcWaitSynchronization(aptLockHandle, U64_MAX);
+       LightLock_Lock(&aptStatusMutex);
        __apt_initservicehandle();
 }
 
 void aptCloseSession(void)
 {
        svcCloseHandle(aptuHandle);
-       svcReleaseMutex(aptLockHandle);
+       LightLock_Unlock(&aptStatusMutex);
 }
 
 void aptSignalReadyForSleep(void)
@@ -725,7 +722,7 @@ Result APT_GetLockHandle(u16 flags, Handle* lockHandle)
        cmdbuf[1]=flags;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
        
        if(lockHandle)*lockHandle=cmdbuf[5];
        
@@ -740,7 +737,7 @@ Result APT_Initialize(NS_APPID appId, Handle* eventHandle1, Handle* eventHandle2
        cmdbuf[2]=0x0;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
        
        if(eventHandle1)*eventHandle1=cmdbuf[3]; //return to menu event ?
        if(eventHandle2)*eventHandle2=cmdbuf[4];
@@ -755,7 +752,7 @@ Result APT_Finalize(NS_APPID appId)
        cmdbuf[1]=appId;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
        return cmdbuf[1];
 }
 
@@ -765,7 +762,7 @@ Result APT_HardwareResetAsync()
        cmdbuf[0]=IPC_MakeHeader(0x4E,0,0); // 0x4E0000
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
        
        return cmdbuf[1];
 }
@@ -777,7 +774,7 @@ Result APT_Enable(u32 a)
        cmdbuf[1]=a;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
        
        return cmdbuf[1];
 }
@@ -789,7 +786,7 @@ Result APT_GetAppletManInfo(u8 inval, u8 *outval8, u32 *outval32, NS_APPID *menu
        cmdbuf[1]=inval;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(outval8)*outval8=cmdbuf[2];
        if(outval32)*outval32=cmdbuf[3];
@@ -806,7 +803,7 @@ Result APT_GetAppletInfo(NS_APPID appID, u64* pProgramID, u8* pMediaType, u8* pR
        cmdbuf[1]=appID;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(pProgramID)*pProgramID=(u64)cmdbuf[2]|((u64)cmdbuf[3]<<32);
        if(pMediaType)*pMediaType=cmdbuf[4];
@@ -825,7 +822,7 @@ Result APT_GetAppletProgramInfo(u32 id, u32 flags, u16 *titleversion)
        cmdbuf[2]=flags;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(titleversion)*titleversion=cmdbuf[2];
 
@@ -839,7 +836,7 @@ Result APT_GetProgramID(u64* pProgramID)
        cmdbuf[1] = IPC_Desc_CurProcessHandle();
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(ret==0)ret = cmdbuf[1];
 
@@ -858,7 +855,7 @@ Result APT_IsRegistered(NS_APPID appID, u8* out)
        cmdbuf[1]=appID;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(out)*out=cmdbuf[2];
        
@@ -872,7 +869,7 @@ Result APT_InquireNotification(u32 appID, u8* signalType)
        cmdbuf[1]=appID;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(signalType)*signalType=cmdbuf[2];
        
@@ -885,7 +882,7 @@ Result APT_PrepareToJumpToHomeMenu(void)
        cmdbuf[0]=IPC_MakeHeader(0x2B,0,0); // 0x2B0000
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
        
        return cmdbuf[1];
 }
@@ -901,7 +898,7 @@ Result APT_JumpToHomeMenu(const u8 *param, size_t paramSize, Handle handle)
        cmdbuf[5]= (u32) param;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -913,7 +910,7 @@ Result APT_PrepareToJumpToApplication(u32 a)
        cmdbuf[1]=a;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
        
        return cmdbuf[1];
 }
@@ -929,7 +926,7 @@ Result APT_JumpToApplication(const u8 *param, size_t paramSize, Handle handle)
        cmdbuf[5]= (u32) param;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
        
        return cmdbuf[1];
 }
@@ -941,7 +938,7 @@ Result APT_NotifyToWait(NS_APPID appID)
        cmdbuf[1]=appID;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -961,7 +958,7 @@ Result APT_AppletUtility(u32* out, u32 a, u32 size1, u8* buf1, u32 size2, u8* bu
        staticbufs[1]=(u32)buf2;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(out)*out=cmdbuf[2];
 
@@ -980,7 +977,7 @@ Result APT_GlanceParameter(NS_APPID appID, u32 bufferSize, u32* buffer, u32* act
        staticbufs[1]=(u32)buffer;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(signalType)*signalType=cmdbuf[3];
        if(actualSize)*actualSize=cmdbuf[4];
@@ -1000,7 +997,7 @@ Result APT_ReceiveParameter(NS_APPID appID, u32 bufferSize, u32* buffer, u32* ac
        staticbufs[1]=(u32)buffer;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(signalType)*signalType=cmdbuf[3];
        if(actualSize)*actualSize=cmdbuf[4];
@@ -1025,7 +1022,7 @@ Result APT_SendParameter(NS_APPID src_appID, NS_APPID dst_appID, u32 bufferSize,
        cmdbuf[8] = (u32)buffer;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1040,7 +1037,7 @@ Result APT_SendCaptureBufferInfo(u32 bufferSize, u32* buffer)
        cmdbuf[3] = (u32)buffer;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1053,7 +1050,7 @@ Result APT_ReplySleepQuery(NS_APPID appID, u32 a)
        cmdbuf[2]=a;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1065,7 +1062,7 @@ Result APT_ReplySleepNotificationComplete(NS_APPID appID)
        cmdbuf[1]=appID;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1077,7 +1074,7 @@ Result APT_PrepareToCloseApplication(u8 a)
        cmdbuf[1]=a;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1093,7 +1090,7 @@ Result APT_CloseApplication(const u8 *param, size_t paramSize, Handle handle)
        cmdbuf[5]= (u32) param;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1107,7 +1104,7 @@ Result APT_SetAppCpuTimeLimit(u32 percent)
        cmdbuf[2]=percent;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1119,7 +1116,7 @@ Result APT_GetAppCpuTimeLimit(u32 *percent)
        cmdbuf[1]=1;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(percent)*percent=cmdbuf[2];
 
@@ -1133,7 +1130,7 @@ Result APT_CheckNew3DS_Application(u8 *out)
        cmdbuf[0]=IPC_MakeHeader(0x101,0,0); // 0x1010000
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(ret==0)ret = cmdbuf[1];
 
@@ -1152,7 +1149,7 @@ Result APT_CheckNew3DS_System(u8 *out)
        cmdbuf[0]=IPC_MakeHeader(0x102,0,0); // 0x1020000
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        if(ret==0)ret = cmdbuf[1];
 
@@ -1199,7 +1196,7 @@ Result APT_PrepareToDoAppJump(u8 flags, u64 programID, u8 mediatype)
        cmdbuf[4]=mediatype;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1216,7 +1213,7 @@ Result APT_DoAppJump(u32 NSbuf0Size, u32 NSbuf1Size, u8 *NSbuf0Ptr, u8 *NSbuf1Pt
        cmdbuf[6]=(u32)NSbuf1Ptr;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1228,7 +1225,7 @@ Result APT_PrepareToStartLibraryApplet(NS_APPID appID)
        cmdbuf[1]=appID;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1245,7 +1242,7 @@ Result APT_StartLibraryApplet(NS_APPID appID, Handle inhandle, u32 *parambuf, u3
        cmdbuf[6]=(u32)parambuf;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1265,7 +1262,7 @@ Result APT_LaunchLibraryApplet(NS_APPID appID, Handle inhandle, u32 *parambuf, u
        aptOpenSession();
        ret=APT_PrepareToStartLibraryApplet(appID);
        aptCloseSession();
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))return ret;
 
        memset(buf1, 0, 4);
        aptOpenSession();
@@ -1277,7 +1274,7 @@ Result APT_LaunchLibraryApplet(NS_APPID appID, Handle inhandle, u32 *parambuf, u
                aptOpenSession();
                ret=APT_IsRegistered(appID, &tmp);
                aptCloseSession();
-               if(ret!=0)return ret;
+               if(R_FAILED(ret))return ret;
 
                if(tmp!=0)break;
        }
@@ -1319,7 +1316,7 @@ Result APT_PrepareToStartSystemApplet(NS_APPID appID)
        cmdbuf[1]=appID;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -1336,7 +1333,7 @@ Result APT_StartSystemApplet(NS_APPID appID, u32 bufSize, Handle applHandle, u8
        cmdbuf[6] = (u32)buf;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
 
        return cmdbuf[1];
 }
index 7544cff39dad8465bafcfb689005dded7a3cae85..2439bb0728204d6d8887945542a529ab0e77b12d 100644 (file)
@@ -2,46 +2,33 @@
 #include <3ds/services/y2r.h>
 #include <3ds/srv.h>
 #include <3ds/svc.h>
+#include <3ds/synchronization.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 
 Handle camHandle;
-static bool initialized = false;
+static int camRefCount;
 
 Result camInit(void) {
        Result ret = 0;
 
-       if (initialized) return 0;
+       if (AtomicPostIncrement(&camRefCount)) return 0;
 
-       if (camHandle == 0)
+       ret = srvGetServiceHandle(&camHandle, "cam:u");
+       if (R_SUCCEEDED(ret))
        {
-               ret = srvGetServiceHandle(&camHandle, "cam:u");
-               if (ret < 0) return ret;
+               ret = CAMU_DriverInitialize();
+               if (R_FAILED(ret)) svcCloseHandle(camHandle);
        }
-
-       ret = CAMU_DriverInitialize();
-       if (ret < 0) return ret;
-       initialized = true;
+       if (R_FAILED(ret)) AtomicDecrement(&camRefCount);
 
        return 0;
 }
 
-Result camExit(void) {
-       Result ret = 0;
-
-       if (initialized)
-       {
-               ret = CAMU_DriverFinalize();
-               if (ret < 0) return ret;
-       }
-
-       if (camHandle != 0)
-       {
-               ret = svcCloseHandle(camHandle);
-               if (ret < 0) return ret;
-               camHandle = 0;
-       }
-
-       return 0;
+void camExit(void) {
+       if (AtomicDecrement(&camRefCount)) return;
+       CAMU_DriverFinalize();
+       svcCloseHandle(camHandle);
 }
 
 Result CAMU_StartCapture(CAMU_Port port) {
@@ -50,7 +37,7 @@ Result CAMU_StartCapture(CAMU_Port port) {
        cmdbuf[0] = 0x00010040;
        cmdbuf[1] = port;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -60,7 +47,7 @@ Result CAMU_StopCapture(CAMU_Port port) {
        cmdbuf[0] = 0x00020040;
        cmdbuf[1] = port;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -70,7 +57,7 @@ Result CAMU_IsBusy(bool* busy, CAMU_Port port) {
        cmdbuf[0] = 0x00030040;
        cmdbuf[1] = port;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *busy = (bool) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -81,7 +68,7 @@ Result CAMU_ClearBuffer(CAMU_Port port) {
        cmdbuf[0] = 0x00040040;
        cmdbuf[1] = port;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -91,7 +78,7 @@ Result CAMU_GetVsyncInterruptEvent(Handle* event, CAMU_Port port) {
        cmdbuf[0] = 0x00050040;
        cmdbuf[1] = port;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *event = cmdbuf[3];
        return cmdbuf[1];
 }
@@ -102,7 +89,7 @@ Result CAMU_GetBufferErrorInterruptEvent(Handle* event, CAMU_Port port) {
        cmdbuf[0] = 0x00060040;
        cmdbuf[1] = port;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *event = cmdbuf[3];
        return cmdbuf[1];
 }
@@ -118,7 +105,7 @@ Result CAMU_SetReceiving(Handle* event, void* dst, CAMU_Port port, u32 imageSize
        cmdbuf[5] = 0;
        cmdbuf[6] = 0xFFFF8001;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *event = cmdbuf[3];
        return cmdbuf[1];
 }
@@ -129,7 +116,7 @@ Result CAMU_IsFinishedReceiving(bool* finishedReceiving, CAMU_Port port) {
        cmdbuf[0] = 0x00080040;
        cmdbuf[1] = port;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *finishedReceiving = (bool) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -143,7 +130,7 @@ Result CAMU_SetTransferLines(CAMU_Port port, s16 lines, s16 width, s16 height) {
        cmdbuf[3] = width;
        cmdbuf[4] = height;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -154,7 +141,7 @@ Result CAMU_GetMaxLines(s16* maxLines, s16 width, s16 height) {
        cmdbuf[1] = width;
        cmdbuf[2] = height;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *maxLines = (s16) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -168,7 +155,7 @@ Result CAMU_SetTransferBytes(CAMU_Port port, u32 bytes, s16 width, s16 height) {
        cmdbuf[3] = width;
        cmdbuf[4] = height;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -178,7 +165,7 @@ Result CAMU_GetTransferBytes(u32* transferBytes, CAMU_Port port) {
        cmdbuf[0] = 0x000C0040;
        cmdbuf[1] = port;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *transferBytes = cmdbuf[2];
        return cmdbuf[1];
 }
@@ -190,7 +177,7 @@ Result CAMU_GetMaxBytes(u32* maxBytes, s16 width, s16 height) {
        cmdbuf[1] = width;
        cmdbuf[2] = height;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *maxBytes = cmdbuf[2];
        return cmdbuf[1];
 }
@@ -202,7 +189,7 @@ Result CAMU_SetTrimming(CAMU_Port port, bool trimming) {
        cmdbuf[1] = port;
        cmdbuf[2] = trimming;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -212,7 +199,7 @@ Result CAMU_IsTrimming(bool* trimming, CAMU_Port port) {
        cmdbuf[0] = 0x000F0040;
        cmdbuf[1] = port;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *trimming = (bool) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -227,7 +214,7 @@ Result CAMU_SetTrimmingParams(CAMU_Port port, s16 xStart, s16 yStart, s16 xEnd,
        cmdbuf[4] = xEnd;
        cmdbuf[5] = yEnd;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -237,7 +224,7 @@ Result CAMU_GetTrimmingParams(s16* xStart, s16* yStart, s16* xEnd, s16* yEnd, CA
        cmdbuf[0] = 0x00110040;
        cmdbuf[1] = port;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *xStart = (s16) cmdbuf[2];
        *yStart = (s16) cmdbuf[3];
        *xEnd = (s16) cmdbuf[4];
@@ -255,7 +242,7 @@ Result CAMU_SetTrimmingParamsCenter(CAMU_Port port, s16 trimWidth, s16 trimHeigh
        cmdbuf[4] = camWidth;
        cmdbuf[5] = camHeight;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -265,7 +252,7 @@ Result CAMU_Activate(CAMU_CameraSelect select) {
        cmdbuf[0] = 0x00130040;
        cmdbuf[1] = select;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -276,7 +263,7 @@ Result CAMU_SwitchContext(CAMU_CameraSelect select, CAMU_Context context) {
        cmdbuf[1] = select;
        cmdbuf[2] = context;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -287,7 +274,7 @@ Result CAMU_SetExposure(CAMU_CameraSelect select, s8 exposure) {
        cmdbuf[1] = select;
        cmdbuf[2] = exposure;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -298,7 +285,7 @@ Result CAMU_SetWhiteBalance(CAMU_CameraSelect select, CAMU_WhiteBalance whiteBal
        cmdbuf[1] = select;
        cmdbuf[2] = whiteBalance;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -309,7 +296,7 @@ Result CAMU_SetWhiteBalanceWithoutBaseUp(CAMU_CameraSelect select, CAMU_WhiteBal
        cmdbuf[1] = select;
        cmdbuf[2] = whiteBalance;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -320,7 +307,7 @@ Result CAMU_SetSharpness(CAMU_CameraSelect select, s8 sharpness) {
        cmdbuf[1] = select;
        cmdbuf[2] = sharpness;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -331,7 +318,7 @@ Result CAMU_SetAutoExposure(CAMU_CameraSelect select, bool autoExposure) {
        cmdbuf[1] = select;
        cmdbuf[2] = autoExposure;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -341,7 +328,7 @@ Result CAMU_IsAutoExposure(bool* autoExposure, CAMU_CameraSelect select) {
        cmdbuf[0] = 0x001A0040;
        cmdbuf[1] = select;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *autoExposure = (bool) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -353,7 +340,7 @@ Result CAMU_SetAutoWhiteBalance(CAMU_CameraSelect select, bool autoWhiteBalance)
        cmdbuf[1] = select;
        cmdbuf[2] = autoWhiteBalance;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -363,7 +350,7 @@ Result CAMU_IsAutoWhiteBalance(bool* autoWhiteBalance, CAMU_CameraSelect select)
        cmdbuf[0] = 0x001C0040;
        cmdbuf[1] = select;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *autoWhiteBalance = (bool) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -376,7 +363,7 @@ Result CAMU_FlipImage(CAMU_CameraSelect select, CAMU_Flip flip, CAMU_Context con
        cmdbuf[2] = flip;
        cmdbuf[3] = context;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -393,7 +380,7 @@ Result CAMU_SetDetailSize(CAMU_CameraSelect select, s16 width, s16 height, s16 c
        cmdbuf[7] = cropY1;
        cmdbuf[8] = context;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -405,7 +392,7 @@ Result CAMU_SetSize(CAMU_CameraSelect select, CAMU_Size size, CAMU_Context conte
        cmdbuf[2] = size;
        cmdbuf[3] = context;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -416,7 +403,7 @@ Result CAMU_SetFrameRate(CAMU_CameraSelect select, CAMU_FrameRate frameRate) {
        cmdbuf[1] = select;
        cmdbuf[2] = frameRate;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -427,7 +414,7 @@ Result CAMU_SetPhotoMode(CAMU_CameraSelect select, CAMU_PhotoMode photoMode) {
        cmdbuf[1] = select;
        cmdbuf[2] = photoMode;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -439,7 +426,7 @@ Result CAMU_SetEffect(CAMU_CameraSelect select, CAMU_Effect effect, CAMU_Context
        cmdbuf[2] = effect;
        cmdbuf[3] = context;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -450,7 +437,7 @@ Result CAMU_SetContrast(CAMU_CameraSelect select, CAMU_Contrast contrast) {
        cmdbuf[1] = select;
        cmdbuf[2] = contrast;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -461,7 +448,7 @@ Result CAMU_SetLensCorrection(CAMU_CameraSelect select, CAMU_LensCorrection lens
        cmdbuf[1] = select;
        cmdbuf[2] = lensCorrection;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -473,7 +460,7 @@ Result CAMU_SetOutputFormat(CAMU_CameraSelect select, CAMU_OutputFormat format,
        cmdbuf[2] = format;
        cmdbuf[3] = context;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -487,7 +474,7 @@ Result CAMU_SetAutoExposureWindow(CAMU_CameraSelect select, s16 x, s16 y, s16 wi
        cmdbuf[4] = width;
        cmdbuf[5] = height;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -501,7 +488,7 @@ Result CAMU_SetAutoWhiteBalanceWindow(CAMU_CameraSelect select, s16 x, s16 y, s1
        cmdbuf[4] = width;
        cmdbuf[5] = height;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -512,7 +499,7 @@ Result CAMU_SetNoiseFilter(CAMU_CameraSelect select, bool noiseFilter) {
        cmdbuf[1] = select;
        cmdbuf[2] = noiseFilter;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -523,7 +510,7 @@ Result CAMU_SynchronizeVsyncTiming(CAMU_CameraSelect select1, CAMU_CameraSelect
        cmdbuf[1] = select1;
        cmdbuf[2] = select2;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -536,7 +523,7 @@ Result CAMU_GetLatestVsyncTiming(s64* timing, CAMU_Port port, u32 past) {
        cmdbuf[49] = (past << 17) | 2;
        cmdbuf[50] = (u32) timing;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -545,7 +532,7 @@ Result CAMU_GetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData* dat
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = 0x002B0000;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *data = *(CAMU_StereoCameraCalibrationData*) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -556,7 +543,7 @@ Result CAMU_SetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData data
        cmdbuf[0] = 0x002C0400;
        *(CAMU_StereoCameraCalibrationData*) cmdbuf[1] = data;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -568,7 +555,7 @@ Result CAMU_WriteRegisterI2c(CAMU_CameraSelect select, u16 addr, u16 data) {
        cmdbuf[2] = addr;
        cmdbuf[3] = data;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -580,7 +567,7 @@ Result CAMU_WriteMcuVariableI2c(CAMU_CameraSelect select, u16 addr, u16 data) {
        cmdbuf[2] = addr;
        cmdbuf[3] = data;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -591,7 +578,7 @@ Result CAMU_ReadRegisterI2cExclusive(u16* data, CAMU_CameraSelect select, u16 ad
        cmdbuf[1] = select;
        cmdbuf[2] = addr;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *data = (u16) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -603,7 +590,7 @@ Result CAMU_ReadMcuVariableI2cExclusive(u16* data, CAMU_CameraSelect select, u16
        cmdbuf[1] = select;
        cmdbuf[2] = addr;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *data = (u16) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -614,7 +601,7 @@ Result CAMU_SetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData data
        cmdbuf[0] = 0x00310180;
        *(CAMU_ImageQualityCalibrationData*) cmdbuf[1] = data;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -623,7 +610,7 @@ Result CAMU_GetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData* dat
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = 0x00320000;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *data = *(CAMU_ImageQualityCalibrationData*) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -634,7 +621,7 @@ Result CAMU_SetPackageParameterWithoutContext(CAMU_PackageParameterCameraSelect
        cmdbuf[0] = 0x003302C0;
        *(CAMU_PackageParameterCameraSelect*) cmdbuf[1] = param;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -644,7 +631,7 @@ Result CAMU_SetPackageParameterWithContext(CAMU_PackageParameterContext param) {
        cmdbuf[0] = 0x00340140;
        *(CAMU_PackageParameterContext*) cmdbuf[1] = param;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -654,7 +641,7 @@ Result CAMU_SetPackageParameterWithContextDetail(CAMU_PackageParameterContextDet
        cmdbuf[0] = 0x003501C0;
        *(CAMU_PackageParameterContextDetail*) cmdbuf[1] = param;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -663,7 +650,7 @@ Result CAMU_GetSuitableY2rStandardCoefficient(Y2R_StandardCoefficient* coefficie
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = 0x00360000;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *coefficient = (Y2R_StandardCoefficient) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -674,7 +661,7 @@ Result CAMU_PlayShutterSound(CAMU_ShutterSoundType sound) {
        cmdbuf[0] = 0x00380040;
        cmdbuf[1] = sound;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -683,7 +670,7 @@ Result CAMU_DriverInitialize(void) {
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = 0x00390000;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -692,7 +679,7 @@ Result CAMU_DriverFinalize(void) {
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = 0x003A0000;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -701,7 +688,7 @@ Result CAMU_GetActivatedCamera(CAMU_CameraSelect* select) {
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = 0x003B0000;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *select = (CAMU_CameraSelect) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -711,7 +698,7 @@ Result CAMU_GetSleepCamera(CAMU_CameraSelect* select) {
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = 0x003C0000;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        *select = (CAMU_CameraSelect) cmdbuf[2];
        return cmdbuf[1];
 }
@@ -722,7 +709,7 @@ Result CAMU_SetSleepCamera(CAMU_CameraSelect select) {
        cmdbuf[0] = 0x003D0040;
        cmdbuf[1] = select;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -732,7 +719,7 @@ Result CAMU_SetBrightnessSynchronization(bool brightnessSynchronization) {
        cmdbuf[0] = 0x003E0040;
        cmdbuf[1] = brightnessSynchronization;
 
-       if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
        return cmdbuf[1];
 }
 
index 7918496918be7fcfed670617be0abe7a280bcebb..12d7a1995b35bbc3012b1a41d6cce102fec09a48 100644 (file)
@@ -1,11 +1,12 @@
 #include <stdlib.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
 #include <3ds/services/cfgnor.h>
 #include <3ds/ipc.h>
 
-Handle CFGNOR_handle = 0;
+Handle CFGNOR_handle;
 
 Result CFGNOR_Initialize(u8 value)
 {
@@ -13,12 +14,12 @@ Result CFGNOR_Initialize(u8 value)
        u32 *cmdbuf = getThreadCommandBuffer();
 
        ret = srvGetServiceHandle(&CFGNOR_handle, "cfg:nor");
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))return ret;
 
        cmdbuf[0] = IPC_MakeHeader(0x1,1,0); // 0x10040
        cmdbuf[1] = (u32)value;
 
-       if((ret = svcSendSyncRequest(CFGNOR_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
 
        ret = (Result)cmdbuf[1];
        return ret;
@@ -31,7 +32,7 @@ Result CFGNOR_Shutdown(void)
 
        cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
 
-       if((ret = svcSendSyncRequest(CFGNOR_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        svcCloseHandle(CFGNOR_handle);
@@ -51,7 +52,7 @@ Result CFGNOR_ReadData(u32 offset, u32 *buf, u32 size)
        cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
        cmdbuf[4] = (u32)buf;
 
-       if((ret = svcSendSyncRequest(CFGNOR_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
 
        ret = (Result)cmdbuf[1];
        return ret;
@@ -68,7 +69,7 @@ Result CFGNOR_WriteData(u32 offset, u32 *buf, u32 size)
        cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
        cmdbuf[4] = (u32)buf;
 
-       if((ret = svcSendSyncRequest(CFGNOR_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
 
        ret = (Result)cmdbuf[1];
        return ret;
@@ -85,7 +86,7 @@ Result CFGNOR_DumpFlash(u32 *buf, u32 size)
                if(size-pos < chunksize)chunksize = size-pos;
 
                ret = CFGNOR_ReadData(pos, &buf[pos>>2], chunksize);
-               if(ret!=0)break;
+               if(R_FAILED(ret))break;
        }
 
        return ret;
index c8ad1345dfb9d0038d80c12e87cce29378b1528c..80eacd296bce55788532b241e05a528b87c645bf 100644 (file)
@@ -1,30 +1,34 @@
 #include <stdlib.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/cfgu.h>
 #include <3ds/ipc.h>
 
-static Handle CFGU_handle = 0;
+static Handle CFGU_handle;
+static int CFGU_refCount;
 
-Result initCfgu()
+Result cfguInit(void)
 {
        Result ret;
 
+       if (AtomicPostIncrement(&CFGU_refCount)) return 0;
+
        // cfg:i has the most commands, then cfg:s, then cfg:u
        ret = srvGetServiceHandle(&CFGU_handle, "cfg:i");
-       if(ret) ret = srvGetServiceHandle(&CFGU_handle, "cfg:s");
-       if(ret) ret = srvGetServiceHandle(&CFGU_handle, "cfg:u");
+       if(R_FAILED(ret)) ret = srvGetServiceHandle(&CFGU_handle, "cfg:s");
+       if(R_FAILED(ret)) ret = srvGetServiceHandle(&CFGU_handle, "cfg:u");
+       if(R_FAILED(ret)) AtomicDecrement(&CFGU_refCount);
 
        return ret;
 }
 
-Result exitCfgu()
+void cfguExit(void)
 {
-       Result ret = svcCloseHandle(CFGU_handle);
-       CFGU_handle = 0;
-
-       return ret;
+       if (AtomicDecrement(&CFGU_refCount)) return;
+       svcCloseHandle(CFGU_handle);
 }
 
 Result CFGU_SecureInfoGetRegion(u8* region)
@@ -34,7 +38,7 @@ Result CFGU_SecureInfoGetRegion(u8* region)
 
        cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
 
-       if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
 
        *region = (u8)cmdbuf[2];
 
@@ -49,7 +53,7 @@ Result CFGU_GenHashConsoleUnique(u32 appIDSalt, u64* hash)
        cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040
        cmdbuf[1] = appIDSalt;
 
-       if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
 
        *hash = (u64)cmdbuf[2];
        *hash |= ((u64)cmdbuf[3])<<32;
@@ -64,7 +68,7 @@ Result CFGU_GetRegionCanadaUSA(u8* value)
 
        cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000
 
-       if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
 
        *value = (u8)cmdbuf[2];
 
@@ -78,7 +82,7 @@ Result CFGU_GetSystemModel(u8* model)
 
        cmdbuf[0] = IPC_MakeHeader(0x5,0,0); // 0x50000
 
-       if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
 
        *model = (u8)cmdbuf[2];
 
@@ -92,7 +96,7 @@ Result CFGU_GetModelNintendo2DS(u8* value)
 
        cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
 
-       if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
 
        *value = (u8)cmdbuf[2];
 
@@ -107,7 +111,7 @@ Result CFGU_GetCountryCodeString(u16 code, u16* string)
        cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040
        cmdbuf[1] = (u32)code;
 
-       if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
 
        *string = (u16)cmdbuf[2];
 
@@ -122,7 +126,7 @@ Result CFGU_GetCountryCodeID(u16 string, u16* code)
        cmdbuf[0] = IPC_MakeHeader(0xA,1,0); // 0xA0040
        cmdbuf[1] = (u32)string;
 
-       if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
 
        *code = (u16)cmdbuf[2];
 
@@ -142,7 +146,7 @@ Result CFGU_GetConfigInfoBlk2(u32 size, u32 blkID, u8* outData)
        cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
        cmdbuf[4] = (u32)outData;
 
-       if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
 
        return (Result)cmdbuf[1];
 }
index 3f865c6f7bd266d732a48169e2918bd9df560aa3..5a1ffa927ae315eba640a8c6f55da673c219c4a4 100644 (file)
@@ -1,27 +1,30 @@
 #include <stdlib.h>
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
 #include <3ds/mappable.h>
 #include <3ds/os.h>
 #include <3ds/services/csnd.h>
 #include <3ds/ipc.h>
+#include <3ds/synchronization.h>
 
 // See here regarding CSND shared-mem commands, etc: http://3dbrew.org/wiki/CSND_Shared_Memory
 
-vu32* csndSharedMem = NULL;
+vu32* csndSharedMem;
 u32 csndSharedMemSize;
-u32 csndChannels = 0;
+u32 csndChannels;
 u32 csndOffsets[4];
 
-static Handle csndHandle = 0;
-static Handle csndMutex = 0;
-static Handle csndSharedMemBlock = 0;
+static Handle csndHandle;
+static Handle csndMutex;
+static Handle csndSharedMemBlock;
 
+static int csndRefCount;
 static u32 csndCmdBlockSize = 0x2000;
-static u32 csndCmdStartOff = 0;
-static u32 csndCmdCurOff = 0;
+static u32 csndCmdStartOff;
+static u32 csndCmdCurOff;
 
 static Result CSND_Initialize(void)
 {
@@ -32,7 +35,7 @@ static Result CSND_Initialize(void)
        cmdbuf[1] = csndSharedMemSize;
        memcpy(&cmdbuf[2], &csndOffsets[0], 4*sizeof(u32));
 
-       if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
 
        csndMutex = cmdbuf[3];
        csndSharedMemBlock = cmdbuf[4];
@@ -47,7 +50,7 @@ static Result CSND_Shutdown()
 
        cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
 
-       if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -59,7 +62,7 @@ static Result CSND_AcquireSoundChannels(u32* channelMask)
 
        cmdbuf[0] = IPC_MakeHeader(0x5,0,0); // 0x50000
 
-       if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
 
        *channelMask = cmdbuf[2];
 
@@ -73,7 +76,7 @@ static Result CSND_ReleaseSoundChannels(void)
 
        cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
 
-       if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -85,7 +88,7 @@ Result CSND_AcquireCapUnit(u32* capUnit)
 
        cmdbuf[0] = IPC_MakeHeader(0x7,0,0); // 0x70000
 
-       if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
 
        *capUnit = cmdbuf[2];
 
@@ -100,7 +103,7 @@ Result CSND_ReleaseCapUnit(u32 capUnit)
        cmdbuf[0] = IPC_MakeHeader(0x8,1,0); // 0x80040
        cmdbuf[1] = capUnit;
 
-       if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -112,7 +115,7 @@ Result CSND_Reset(void)
 
        cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
 
-       if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -121,10 +124,10 @@ Result csndInit(void)
 {
        Result ret=0;
 
-       // TODO: proper error handling!
+       if (AtomicPostIncrement(&csndRefCount)) return ret;
 
        ret = srvGetServiceHandle(&csndHandle, "csnd:SND");
-       if (ret != 0) return ret;
+       if (R_FAILED(ret)) goto cleanup0;
 
        // Calculate offsets and sizes required by the CSND module
        csndOffsets[0] = csndCmdBlockSize;                         // Offset to DSP semaphore and irq disable flags
@@ -134,7 +137,7 @@ Result csndInit(void)
        csndSharedMemSize = csndOffsets[3] + 0x3C;                 // Total size of the CSND shared memory
 
        ret = CSND_Initialize();
-       if (ret != 0) goto cleanup1;
+       if (R_FAILED(ret)) goto cleanup1;
 
        csndSharedMem = (vu32*)mappableAlloc(csndSharedMemSize);
        if(!csndSharedMem)
@@ -144,12 +147,12 @@ Result csndInit(void)
        }
 
        ret = svcMapMemoryBlock(csndSharedMemBlock, (u32)csndSharedMem, 3, 0x10000000);
-       if (ret != 0) goto cleanup2;
+       if (R_FAILED(ret)) goto cleanup2;
 
        memset((void*)csndSharedMem, 0, csndSharedMemSize);
 
        ret = CSND_AcquireSoundChannels(&csndChannels);
-       if (!ret) return 0;
+       if (R_FAILED(ret)) return 0;
 
 cleanup2:
        svcCloseHandle(csndSharedMemBlock);
@@ -160,23 +163,22 @@ cleanup2:
        }
 cleanup1:
        svcCloseHandle(csndHandle);
+cleanup0:
+       AtomicDecrement(&csndRefCount);
        return ret;
 }
 
-Result csndExit(void)
+void csndExit(void)
 {
-       Result ret;
-
-       //ret = CSND_Reset();
-       //if (ret != 0) return ret;
+       if (AtomicDecrement(&csndRefCount)) return;
 
-       ret = CSND_ReleaseSoundChannels();
-       if (ret != 0) return ret;
+       //CSND_Reset();
+       CSND_ReleaseSoundChannels();
 
        svcUnmapMemoryBlock(csndSharedMemBlock, (u32)csndSharedMem);
        svcCloseHandle(csndSharedMemBlock);
 
-       ret = CSND_Shutdown();
+       CSND_Shutdown();
        svcCloseHandle(csndHandle);
 
        if(csndSharedMem != NULL)
@@ -184,8 +186,6 @@ Result csndExit(void)
                mappableFree((void*) csndSharedMem);
                csndSharedMem = NULL;
        }
-
-       return ret;
 }
 
 static Result CSND_ExecuteCommands(u32 offset)
@@ -196,7 +196,7 @@ static Result CSND_ExecuteCommands(u32 offset)
        cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040
        cmdbuf[1] = offset;
 
-       if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -253,7 +253,7 @@ Result csndExecCmds(bool waitDone)
 
        ret = CSND_ExecuteCommands(csndCmdStartOff);
        csndCmdStartOff = csndCmdCurOff;
-       if (ret != 0) return ret;
+       if (R_FAILED(ret)) return ret;
 
        // FIXME: This is a really ugly busy waiting loop!
        while (waitDone && *flag == 0);
@@ -535,7 +535,7 @@ Result csndGetState(u32 channel, CSND_ChnInfo* out)
        Result ret = 0;
        channel = chnGetSharedMemIdx(channel);
 
-       if ((ret = CSND_UpdateInfo(true)) != 0)return ret;
+       if (R_FAILED(ret = CSND_UpdateInfo(true)))return ret;
 
        memcpy(out, (const void*)&csndSharedMem[(csndOffsets[1] + channel*0xc) >> 2], 0xc);
        //out[2] -= 0x0c000000;
@@ -549,7 +549,7 @@ Result csndIsPlaying(u32 channel, u8* status)
        CSND_ChnInfo entry;
 
        ret = csndGetState(channel, &entry);
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))return ret;
 
        *status = entry.active;
 
index 46f5598e45a9c71632e97b19b9966db9a1073dd0..1a66441c0afa4b807823245e43e708467f90b2f8 100644 (file)
@@ -1,35 +1,31 @@
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
 #include <3ds/ipc.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/dsp.h>
 
-static Handle dspHandle = 0;
+static Handle dspHandle;
+static int dspRefCount;
 
 Result dspInit(void)
 {
        Result ret = 0;
-       if (dspHandle == 0)
-       {
-               ret = srvGetServiceHandle(&dspHandle, "dsp::DSP");
-               if (ret < 0) return ret;
-       }
-       DSP_UnloadComponent();
-       return 0;
+
+       if (AtomicPostIncrement(&dspRefCount)) return 0;
+
+       ret = srvGetServiceHandle(&dspHandle, "dsp::DSP");
+       if (R_SUCCEEDED(ret)) DSP_UnloadComponent();
+       else                  AtomicDecrement(&dspRefCount);
+
+       return ret;
 }
 
-Result dspExit(void)
+void dspExit(void)
 {
-       Result ret = 0;
-       //No need to call unload, it will be done automatically by closing the handle
-       if (dspHandle != 0)
-       {
-               ret = svcCloseHandle(dspHandle);
-               if (ret < 0) return ret;
-               dspHandle = 0;
-       }
-
-       return 0;
+       if (AtomicDecrement(&dspRefCount)) return;
+       svcCloseHandle(dspHandle);
 }
 
 Result DSP_GetHeadphoneStatus(bool* is_inserted)
@@ -37,7 +33,7 @@ Result DSP_GetHeadphoneStatus(bool* is_inserted)
        Result ret = 0;
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x1F,0,0);
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        *is_inserted = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -51,7 +47,7 @@ Result DSP_FlushDataCache(const void* address, u32 size)
        cmdbuf[2] = size;
        cmdbuf[3] = IPC_Desc_SharedHandles(1);
        cmdbuf[4] = CUR_PROCESS_HANDLE;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -64,7 +60,7 @@ Result DSP_InvalidateDataCache(const void* address, u32 size)
        cmdbuf[2] = size;
        cmdbuf[3] = IPC_Desc_SharedHandles(1);
        cmdbuf[4] = CUR_PROCESS_HANDLE;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -74,7 +70,7 @@ Result DSP_SetSemaphore(u16 value)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x7,1,0);
        cmdbuf[1] = value;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -84,7 +80,7 @@ Result DSP_SetSemaphoreMask(u16 mask)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x17,1,0);
        cmdbuf[1] = mask;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -93,7 +89,7 @@ Result DSP_GetSemaphoreHandle(Handle* semaphore)
        Result ret = 0;
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x16,0,0);
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        *semaphore = cmdbuf[3];
        return cmdbuf[1];
 }
@@ -108,7 +104,7 @@ Result DSP_LoadComponent(const void* component, u32 size, u16 prog_mask, u16 dat
        cmdbuf[3] = data_mask;
        cmdbuf[4] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
        cmdbuf[5] = (u32) component;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        *is_loaded = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -118,7 +114,7 @@ Result DSP_UnloadComponent(void)
        Result ret = 0;
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x12,0,0);
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -131,7 +127,7 @@ Result DSP_RegisterInterruptEvents(Handle handle, u32 interrupt, u32 channel)
        cmdbuf[2] = channel;
        cmdbuf[3] = IPC_Desc_SharedHandles(1);
        cmdbuf[4] = handle;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -152,7 +148,7 @@ Result DSP_ReadPipeIfPossible(u32 channel, u32 peer, void* buffer, u16 length, u
        staticbufs[0] = IPC_Desc_StaticBuffer(length,0);
        staticbufs[1] = (u32)buffer;
 
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
 
        staticbufs[0] = saved1;
        staticbufs[1] = saved2;
@@ -171,7 +167,7 @@ Result DSP_WriteProcessPipe(u32 channel, const void* buffer, u32 length)
        cmdbuf[2] = length;
        cmdbuf[3] = IPC_Desc_StaticBuffer(length,1);
        cmdbuf[4] = (u32)buffer;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -181,7 +177,7 @@ Result DSP_ConvertProcessAddressFromDspDram(u32 dsp_address, u32* arm_address)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0xC,1,0);
        cmdbuf[1] = dsp_address;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        *arm_address = cmdbuf[2];
        return cmdbuf[1];
 }
@@ -192,7 +188,7 @@ Result DSP_RecvData(u16 regNo, u16* value)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x1,1,0);
        cmdbuf[1] = regNo;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        *value = cmdbuf[2] & 0xFFFF;
        return cmdbuf[1];
 }
@@ -203,7 +199,7 @@ Result DSP_RecvDataIsReady(u16 regNo, bool* is_ready)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x2,1,0);
        cmdbuf[1] = regNo;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        *is_ready = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -217,7 +213,7 @@ Result DSP_SendData(u16 regNo, u16 value)
        cmdbuf[0] = IPC_MakeHeader(0x3,2,0);
        cmdbuf[1] = regNo;
        cmdbuf[2] = value;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -227,7 +223,7 @@ Result DSP_SendDataIsEmpty(u16 regNo, bool* is_empty)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x4,1,0);
        cmdbuf[1] = regNo;
-       if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
        *is_empty = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
index e9c6fa6d1f1b55b573ecff2f578749aa7924bb4b..2dbaf7447a0aa9f85d4412305440b3917cadfe9a 100644 (file)
@@ -1,7 +1,9 @@
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/fs.h>
 #include <3ds/ipc.h>
 
@@ -34,40 +36,33 @@ FS_makePath(FS_pathType type,
        return (FS_path){type, strlen(path)+1, (const u8*)path};
 }
 
+static int fsRefCount;
+
 /*! Initialize FS service
  *
  *  @returns error
  */
-
-static bool fsInitialised = false;
-
-Result
-fsInit(void)
+Result fsInit(void)
 {
        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(fsuHandle);
-
-       fsInitialised = true;
+       if (AtomicPostIncrement(&fsRefCount)) return 0;
 
+       ret = srvGetServiceHandle(&fsuHandle, "fs:USER");
+       if (R_SUCCEEDED(ret) && __get_handle_from_list("fs:USER")==0)
+       {
+               ret = FSUSER_Initialize(fsuHandle);
+               if (R_FAILED(ret)) svcCloseHandle(fsuHandle);
+       }
+       if (R_FAILED(ret)) AtomicDecrement(&fsRefCount);
        return ret;
 }
 
-/*! Deinitialize FS service
- *
- *  @returns error
- */
-Result
-fsExit(void)
+/// Deinitialize FS service
+void fsExit(void)
 {
-       if (!fsInitialised) return 0;
-       
-       fsInitialised = false;
-
-       return svcCloseHandle(fsuHandle);
+       if (AtomicDecrement(&fsRefCount)) return;
+       svcCloseHandle(fsuHandle);
 }
 
 /*! Gets the fsuser service session handle.
@@ -110,7 +105,7 @@ FSUSER_Initialize(Handle handle)
        cmdbuf[1] = IPC_Desc_CurProcessHandle();
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
 
        return cmdbuf[1];
@@ -178,7 +173,7 @@ FSUSER_OpenFile(Handle     *out,
        cmdbuf[9] = (u32)fileLowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        if(out)
@@ -255,7 +250,7 @@ FSUSER_OpenFileDirectly(Handle     *out,
        cmdbuf[12] = (u32)fileLowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        if(out)
@@ -309,7 +304,7 @@ FSUSER_DeleteFile(FS_archive archive,
        cmdbuf[7] = (u32)fileLowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        return cmdbuf[1];
@@ -376,7 +371,7 @@ FSUSER_RenameFile(FS_archive srcArchive,
        cmdbuf[13] = (u32)destFileLowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        return cmdbuf[1];
@@ -427,7 +422,7 @@ FSUSER_DeleteDirectory(FS_archive archive,
        cmdbuf[7] = (u32)dirLowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        return cmdbuf[1];
@@ -478,7 +473,7 @@ FSUSER_DeleteDirectoryRecursively(FS_archive archive,
        cmdbuf[7] = (u32)dirLowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        return cmdbuf[1];
@@ -537,7 +532,7 @@ FSUSER_CreateFile(FS_archive archive,
        cmdbuf[10] = (u32)fileLowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        return cmdbuf[1];
@@ -590,7 +585,7 @@ FSUSER_CreateDirectory(FS_archive archive,
        cmdbuf[8] = (u32)dirLowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        return cmdbuf[1];
@@ -657,7 +652,7 @@ FSUSER_RenameDirectory(FS_archive srcArchive,
        cmdbuf[13] = (u32)destDirLowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        return cmdbuf[1];
@@ -709,7 +704,7 @@ FSUSER_OpenDirectory(Handle     *out,
        cmdbuf[6] = (u32)dirLowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        if(out)
@@ -762,7 +757,7 @@ FSUSER_OpenArchive(FS_archive *archive)
        cmdbuf[5] = (u32)archive->lowPath.data;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        archive->handleLow  = cmdbuf[2];
@@ -808,7 +803,7 @@ FSUSER_CloseArchive(FS_archive *archive)
        cmdbuf[2] = archive->handleHigh;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        return cmdbuf[1];
@@ -853,7 +848,7 @@ FSUSER_GetSdmcArchiveResource(u32    *sectorSize,
        cmdbuf[0] = IPC_MakeHeader(0x814,0,0); // 0x8140000
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        if(sectorSize)
@@ -910,7 +905,7 @@ FSUSER_GetNandArchiveResource(u32    *sectorSize,
        cmdbuf[0] = IPC_MakeHeader(0x815,0,0); // 0x8150000
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        if(sectorSize)
@@ -958,7 +953,7 @@ FSUSER_IsSdmcDetected(u8    *detected)
        cmdbuf[0] = IPC_MakeHeader(0x817,0,0); // 0x8170000
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        if(detected)
@@ -996,7 +991,7 @@ FSUSER_GetMediaType(u8* mediatype)
        cmdbuf[0] = IPC_MakeHeader(0x868,0,0); // 0x8680000
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        if(mediatype)
@@ -1035,7 +1030,7 @@ FSUSER_IsSdmcWritable(u8 *writable)
        cmdbuf[0] = IPC_MakeHeader(0x818,0,0); // 0x8180000
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(fsuHandle)))
+       if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
                return ret;
 
        if(writable)
@@ -1073,11 +1068,11 @@ FSFILE_Close(Handle handle)
        cmdbuf[0] = IPC_MakeHeader(0x808,0,0); // 0x8080000
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
 
        ret = cmdbuf[1];
-       if(!ret)ret = svcCloseHandle(handle);
+       if(R_SUCCEEDED(ret))ret = svcCloseHandle(handle);
 
        return ret;
 }
@@ -1130,7 +1125,7 @@ FSFILE_Read(Handle handle,
        cmdbuf[5] = (u32)buffer;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
 
        if(bytesRead)
@@ -1199,7 +1194,7 @@ FSFILE_Write(Handle     handle,
        cmdbuf[6] = (u32)buffer;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
 
        if(bytesWritten)
@@ -1241,7 +1236,7 @@ FSFILE_GetSize(Handle handle,
        cmdbuf[0] = IPC_MakeHeader(0x804,0,0); // 0x8040000
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
 
        if(size)
@@ -1285,7 +1280,7 @@ FSFILE_SetSize(Handle handle,
        cmdbuf[2] = (u32)(size >> 32);
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
 
 
@@ -1324,7 +1319,7 @@ FSFILE_GetAttributes(Handle handle,
        cmdbuf[0] = IPC_MakeHeader(0x806,0,0); // 0x8060000
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
 
        if(attributes)
@@ -1366,7 +1361,7 @@ FSFILE_SetAttributes(Handle handle,
        cmdbuf[1] = attributes;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
 
        return cmdbuf[1];
@@ -1401,7 +1396,7 @@ FSFILE_Flush(Handle handle)
        cmdbuf[0] = IPC_MakeHeader(0x809,0,0); // 0x8090000
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
 
        return cmdbuf[1];
@@ -1449,7 +1444,7 @@ FSDIR_Read(Handle    handle,
        cmdbuf[3] = (u32)buffer;
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
 
        if(entriesRead)
@@ -1487,9 +1482,9 @@ FSDIR_Close(Handle handle)
        cmdbuf[0] = IPC_MakeHeader(0x802,0,0); // 0x8020000
 
        Result ret = 0;
-       if((ret = svcSendSyncRequest(handle)))
+       if(R_FAILED(ret = svcSendSyncRequest(handle)))
                return ret;
        ret = cmdbuf[1];
-       if(!ret)ret = svcCloseHandle(handle);
+       if(R_SUCCEEDED(ret))ret = svcCloseHandle(handle);
        return ret;
 }
index 9971a73da1faaa8fb70457760d6a72b378aae473..4db0d551ce6f23de5367e29fd8ad942ad96f0cba 100644 (file)
@@ -5,14 +5,16 @@
 #include <stdlib.h>
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/gsp.h>
 
 #define GSP_EVENT_STACK_SIZE 0x1000
 
-Handle gspGpuHandle=0;
-Handle gspLcdHandle=0;
+Handle gspGpuHandle;
+Handle gspLcdHandle;
 Handle gspEvents[GSPEVENT_MAX];
 vu32 gspEventCounts[GSPEVENT_MAX];
 u64 gspEventStack[GSP_EVENT_STACK_SIZE/sizeof(u64)]; //u64 so that it's 8-byte aligned
@@ -20,18 +22,24 @@ volatile bool gspRunEvents;
 Handle gspEventThread;
 
 static Handle gspEvent;
+static int gspRefCount, gspLcdRefCount;
 static vu8* gspEventData;
 
 static void gspEventThreadMain(void *arg);
 
 Result gspInit(void)
 {
-       return srvGetServiceHandle(&gspGpuHandle, "gsp::Gpu");
+       Result res=0;
+       if (AtomicPostIncrement(&gspRefCount)) return 0;
+       res = srvGetServiceHandle(&gspGpuHandle, "gsp::Gpu");
+       if (R_FAILED(res)) AtomicDecrement(&gspRefCount);
+       return res;
 }
 
 void gspExit(void)
 {
-       if(gspGpuHandle)svcCloseHandle(gspGpuHandle);
+       if (AtomicDecrement(&gspRefCount)) return;
+       svcCloseHandle(gspGpuHandle);
 }
 
 Result gspInitEventHandler(Handle _gspEvent, vu8* _gspSharedMem, u8 gspThreadId)
@@ -85,7 +93,7 @@ void gspWaitForEvent(GSP_Event id, bool nextEvent)
 static int popInterrupt()
 {
        int curEvt;
-       u32 strexFailed;
+       bool strexFailed;
        do {
                union {
                        struct {
@@ -97,16 +105,11 @@ static int popInterrupt()
                        u32 as_u32;
                } header;
 
-               u32* gsp_header_ptr = (u32*)(gspEventData + 0);
-
                // Do a load on all header fields as an atomic unit
-               __asm__ volatile (
-                               "ldrex %[result], %[addr]" :
-                               [result]"=r"(header.as_u32) :
-                               [addr]"Q"(*gsp_header_ptr));
+               header.as_u32 = __ldrex((s32*)gspEventData);
 
                if (__builtin_expect(header.count == 0, 0)) {
-                       __asm__ volatile ("clrex");
+                       __clrex();
                        return -1;
                }
 
@@ -117,10 +120,7 @@ static int popInterrupt()
                header.count -= 1;
                header.err = 0; // Should this really be set?
 
-               __asm__ volatile (
-                               "strex %[result], %[val], %[addr]" :
-                               [result]"=&r"(strexFailed), [addr]"=Q"(*gsp_header_ptr) :
-                               [val]"r"(header.as_u32));
+               strexFailed = __strex((s32*)gspEventData, header.as_u32);
        } while (__builtin_expect(strexFailed, 0));
 
        return curEvt;
@@ -161,7 +161,7 @@ Result GSPGPU_WriteHWRegs(u32 regAddr, u32* data, u8 size)
        cmdbuf[4]=(u32)data;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -180,7 +180,7 @@ Result GSPGPU_WriteHWRegsWithMask(u32 regAddr, u32* data, u8 datasize, u32* mask
        cmdbuf[6]=(u32)maskdata;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -197,7 +197,7 @@ Result GSPGPU_ReadHWRegs(u32 regAddr, u32* data, u8 size)
        cmdbuf[0x40+1]=(u32)data;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -211,7 +211,7 @@ Result GSPGPU_SetBufferSwap(u32 screenid, GSP_FramebufferInfo *framebufinfo)
        memcpy(&cmdbuf[2], framebufinfo, sizeof(GSP_FramebufferInfo));
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -226,7 +226,7 @@ Result GSPGPU_FlushDataCache(const void* adr, u32 size)
        cmdbuf[4]=CUR_PROCESS_HANDLE;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -242,7 +242,7 @@ Result GSPGPU_InvalidateDataCache(const void* adr, u32 size)
        cmdbuf[4] = CUR_PROCESS_HANDLE;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -254,7 +254,7 @@ Result GSPGPU_SetLcdForceBlack(u8 flags)
        cmdbuf[1]=flags;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -265,7 +265,7 @@ Result GSPGPU_TriggerCmdReqQueue(void)
        cmdbuf[0]=0x000C0000; //request header code
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -279,7 +279,7 @@ Result GSPGPU_RegisterInterruptRelayQueue(Handle eventHandle, u32 flags, Handle*
        cmdbuf[3]=eventHandle;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        if(threadID)*threadID=cmdbuf[2];
        if(outMemHandle)*outMemHandle=cmdbuf[4];
@@ -293,7 +293,7 @@ Result GSPGPU_UnregisterInterruptRelayQueue(void)
        cmdbuf[0]=0x00140000; //request header code
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -307,7 +307,7 @@ Result GSPGPU_AcquireRight(u8 flags)
        cmdbuf[3]=CUR_PROCESS_HANDLE;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -318,7 +318,7 @@ Result GSPGPU_ReleaseRight(void)
        cmdbuf[0]=0x170000; //request header code
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -329,14 +329,12 @@ Result GSPGPU_ImportDisplayCaptureInfo(GSP_CaptureInfo *captureinfo)
        cmdbuf[0]=0x00180000; //request header code
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        ret = cmdbuf[1];
 
-       if(ret==0)
-       {
+       if(R_SUCCEEDED(ret))
                memcpy(captureinfo, &cmdbuf[2], 0x20);
-       }
 
        return ret;
 }
@@ -347,7 +345,7 @@ Result GSPGPU_SaveVramSysArea(void)
        cmdbuf[0]=0x00190000; //request header code
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -358,7 +356,7 @@ Result GSPGPU_RestoreVramSysArea(void)
        cmdbuf[0]=0x001A0000; //request header code
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -370,8 +368,7 @@ Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8])
 {
        if(!sharedGspCmdBuf || !gxCommand)return -1;
 
-       u32 cmdBufHeader;
-       __asm__ __volatile__ ("ldrex %[result], [%[adr]]" : [result] "=r" (cmdBufHeader) : [adr] "r" (sharedGspCmdBuf));
+       u32 cmdBufHeader = __ldrex((s32*)sharedGspCmdBuf);
 
        u8 commandIndex=cmdBufHeader&0xFF;
        u8 totalCommands=(cmdBufHeader>>8)&0xFF;
@@ -382,18 +379,15 @@ Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8])
        u32* dst=&sharedGspCmdBuf[8*(1+nextCmd)];
        memcpy(dst, gxCommand, 0x20);
 
-       u32 mcrVal=0x0;
-       __asm__ __volatile__ ("mcr p15, 0, %[val], c7, c10, 4" :: [val] "r" (mcrVal)); //Data Synchronization Barrier Register
+       __dsb();
        totalCommands++;
        cmdBufHeader=((cmdBufHeader)&0xFFFF00FF)|(((u32)totalCommands)<<8);
 
        while(1)
        {
-               u32 strexResult;
-               __asm__ __volatile__ ("strex %[result], %[val], [%[adr]]" : [result] "=&r" (strexResult) : [adr] "r" (sharedGspCmdBuf), [val] "r" (cmdBufHeader));
-               if(!strexResult)break;
+               if (!__strex((s32*)sharedGspCmdBuf, cmdBufHeader)) break;
 
-               __asm__ __volatile__ ("ldrex %[result], [%[adr]]" : [result] "=r" (cmdBufHeader) : [adr] "r" (sharedGspCmdBuf));
+               cmdBufHeader = __ldrex((s32*)sharedGspCmdBuf);
                totalCommands=((cmdBufHeader&0xFF00)>>8)+1;
                cmdBufHeader=((cmdBufHeader)&0xFFFF00FF)|((totalCommands<<8)&0xFF00);
        }
@@ -404,12 +398,17 @@ Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8])
 
 Result gspLcdInit(void)
 {
-       return srvGetServiceHandle(&gspLcdHandle, "gsp::Lcd");
+       Result res=0;
+       if (AtomicPostIncrement(&gspLcdRefCount)) return 0;
+       res = srvGetServiceHandle(&gspLcdHandle, "gsp::Lcd");
+       if (R_FAILED(res)) AtomicDecrement(&gspLcdRefCount);
+       return res;
 }
 
 void gspLcdExit(void)
 {
-       if(gspLcdHandle)svcCloseHandle(gspLcdHandle);
+       if (AtomicDecrement(&gspLcdRefCount)) return;
+       svcCloseHandle(gspLcdHandle);
 }
 
 Result GSPLCD_PowerOffBacklight(GSPLCD_Screens screen)
@@ -420,7 +419,7 @@ Result GSPLCD_PowerOffBacklight(GSPLCD_Screens screen)
        cmdbuf[1] = screen;
 
        Result ret=0;
-       if ((ret = svcSendSyncRequest(gspLcdHandle)))return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -433,7 +432,7 @@ Result GSPLCD_PowerOnBacklight(GSPLCD_Screens screen)
        cmdbuf[1] = screen;
 
        Result ret=0;
-       if ((ret = svcSendSyncRequest(gspLcdHandle)))return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle)))return ret;
 
        return cmdbuf[1];
 }
index 777b2b378ed89199c4307c4df191be0b473eaa43..af6e3eaecbf8c55da21a61ba3d1c086f4ac1fd34 100644 (file)
@@ -1,18 +1,26 @@
 #include <3ds/types.h>\r
+#include <3ds/result.h>\r
 #include <3ds/svc.h>\r
 #include <3ds/srv.h>\r
+#include <3ds/synchronization.h>\r
 #include <3ds/services/hb.h>\r
 #include <3ds/ipc.h>\r
 \r
 static Handle hbHandle;\r
+static int hbRefCount;\r
 \r
 Result hbInit(void)\r
 {\r
-       return srvGetServiceHandle(&hbHandle, "hb:HB");\r
+       Result res=0;\r
+       if (AtomicPostIncrement(&hbRefCount)) return 0;\r
+       res = srvGetServiceHandle(&hbHandle, "hb:HB");\r
+       if (R_FAILED(res)) AtomicDecrement(&hbRefCount);\r
+       return res;\r
 }\r
 \r
 void hbExit(void)\r
 {\r
+       if (AtomicDecrement(&hbRefCount)) return;\r
        svcCloseHandle(hbHandle);\r
 }\r
 \r
@@ -26,7 +34,7 @@ Result HB_FlushInvalidateCache(void)
        cmdbuf[2] = IPC_Desc_SharedHandles(1);\r
        cmdbuf[3] = CUR_PROCESS_HANDLE;\r
 \r
-       if((ret = svcSendSyncRequest(hbHandle))!=0) return ret;\r
+       if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret;\r
        \r
        return (Result)cmdbuf[1];\r
 }\r
@@ -38,7 +46,7 @@ Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv)
 \r
        cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000\r
 \r
-       if((ret = svcSendSyncRequest(hbHandle))!=0) return ret;\r
+       if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret;\r
 \r
        if(load3dsx)*load3dsx=(void*)cmdbuf[2];\r
        if(setArgv)*setArgv=(void*)cmdbuf[3];\r
@@ -56,11 +64,11 @@ Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages)
        cmdbuf[2] = pages;\r
        cmdbuf[3] = mode;\r
 \r
-       if((ret = svcSendSyncRequest(hbHandle))!=0) return ret;\r
+       if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret;\r
 \r
        if(reprotectedPages)\r
        {\r
-               if(!ret)*reprotectedPages=(u32)cmdbuf[2];\r
+               if(R_SUCCEEDED(ret))*reprotectedPages=(u32)cmdbuf[2];\r
                else *reprotectedPages=0;\r
        }\r
        \r
index afe3d19e4f2bccdda398709b8c1c85f7e68bca6f..ef213cfc1a618b5cf299d0d366a2e7aa4e50dca6 100644 (file)
@@ -4,9 +4,11 @@
 #include <stdlib.h>
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
 #include <3ds/mappable.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/apt.h>
 #include <3ds/services/hid.h>
 #include <3ds/services/irrst.h>
@@ -25,20 +27,22 @@ static circlePosition cPos;
 static accelVector aVec;
 static angularRate gRate;
 
-static bool hidInitialised;
+static int hidRefCount;
 
 Result hidInit(void)
 {
        u8 val=0;
        Result ret=0;
 
-       if(hidInitialised) return ret;
+       if (AtomicPostIncrement(&hidRefCount)) return 0;
 
        // Request service.
-       if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")) && (ret=srvGetServiceHandle(&hidHandle, "hid:SPVR")))return ret;
+       ret = srvGetServiceHandle(&hidHandle, "hid:USER");
+       if (R_FAILED(ret)) ret = srvGetServiceHandle(&hidHandle, "hid:SPVR");
+       if (R_FAILED(ret)) goto cleanup0;
 
        // Get sharedmem handle.
-       if((ret=HIDUSER_GetHandles(&hidMemHandle, &hidEvents[HIDEVENT_PAD0], &hidEvents[HIDEVENT_PAD1], &hidEvents[HIDEVENT_Accel], &hidEvents[HIDEVENT_Gyro], &hidEvents[HIDEVENT_DebugPad]))) goto cleanup1;
+       if(R_FAILED(ret=HIDUSER_GetHandles(&hidMemHandle, &hidEvents[HIDEVENT_PAD0], &hidEvents[HIDEVENT_PAD1], &hidEvents[HIDEVENT_Accel], &hidEvents[HIDEVENT_Gyro], &hidEvents[HIDEVENT_DebugPad]))) goto cleanup1;
 
        // Map HID shared memory.
        hidSharedMem=(vu32*)mappableAlloc(0x2b0);
@@ -48,7 +52,7 @@ Result hidInit(void)
                goto cleanup1;
        }
 
-       if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
+       if(R_FAILED(ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
 
        APT_CheckNew3DS(&val);
 
@@ -58,7 +62,6 @@ Result hidInit(void)
        }
 
        // Reset internal state.
-       hidInitialised = true;
        kOld = kHeld = kDown = kUp = 0;
        return ret;
 
@@ -71,12 +74,14 @@ cleanup2:
        }
 cleanup1:
        svcCloseHandle(hidHandle);
+cleanup0:
+       AtomicDecrement(&hidRefCount);
        return ret;
 }
 
 void hidExit(void)
 {
-       if(!hidInitialised) return;
+       if (AtomicDecrement(&hidRefCount)) return;
 
        // Unmap HID sharedmem and close handles.
        u8 val=0;
@@ -97,8 +102,6 @@ void hidExit(void)
                mappableFree((void*) hidSharedMem);
                hidSharedMem = NULL;
        }
-       
-       hidInitialised = false;
 }
 
 void hidWaitForEvent(HID_Event id, bool nextEvent)
@@ -218,7 +221,7 @@ Result HIDUSER_GetHandles(Handle* outMemHandle, Handle *eventpad0, Handle *event
        cmdbuf[0]=IPC_MakeHeader(0xA,0,0); // 0xA0000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(hidHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
 
        if(outMemHandle)*outMemHandle=cmdbuf[3];
 
@@ -237,7 +240,7 @@ Result HIDUSER_EnableAccelerometer(void)
        cmdbuf[0]=IPC_MakeHeader(0x11,0,0); // 0x110000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(hidHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -248,7 +251,7 @@ Result HIDUSER_DisableAccelerometer(void)
        cmdbuf[0]=IPC_MakeHeader(0x12,0,0); // 0x120000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(hidHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -259,7 +262,7 @@ Result HIDUSER_EnableGyroscope(void)
        cmdbuf[0]=IPC_MakeHeader(0x13,0,0); // 0x130000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(hidHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -270,7 +273,7 @@ Result HIDUSER_DisableGyroscope(void)
        cmdbuf[0]=IPC_MakeHeader(0x14,0,0); // 0x140000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(hidHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -281,7 +284,7 @@ Result HIDUSER_GetGyroscopeRawToDpsCoefficient(float *coeff)
        cmdbuf[0]=IPC_MakeHeader(0x15,0,0); // 0x150000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(hidHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
 
        *coeff = (float)cmdbuf[2];
 
@@ -294,7 +297,7 @@ Result HIDUSER_GetSoundVolume(u8 *volume)
        cmdbuf[0]=IPC_MakeHeader(0x17,0,0); // 0x170000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(hidHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
 
        *volume = (u8)cmdbuf[2];
 
index 71e694fe69069b8a0d0dcc599afa4815c6c25aa3..25097ac0f9dfa4216023ee1c8a73203a83135ec7 100644 (file)
@@ -1,32 +1,36 @@
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/httpc.h>
 #include <3ds/ipc.h>
 
-Handle __httpc_servhandle = 0;
+Handle __httpc_servhandle;
+static int __httpc_refcount;
 
 Result httpcInit(void)
 {
        Result ret=0;
 
-       if(__httpc_servhandle)return 0;
-       if((ret=srvGetServiceHandle(&__httpc_servhandle, "http:C")))return ret;
+       if (AtomicPostIncrement(&__httpc_refcount)) return 0;
 
-       ret = HTTPC_Initialize(__httpc_servhandle);
-       if(ret!=0)return ret;
+       ret = srvGetServiceHandle(&__httpc_servhandle, "http:C");
+       if (R_SUCCEEDED(ret))
+       {
+               ret = HTTPC_Initialize(__httpc_servhandle);
+               if (R_FAILED(ret)) svcCloseHandle(__httpc_servhandle);
+       }
+       if (R_FAILED(ret)) AtomicDecrement(&__httpc_refcount);
 
-       return 0;
+       return ret;
 }
 
 void httpcExit(void)
 {
-       if(__httpc_servhandle==0)return;
-
+       if (AtomicDecrement(&__httpc_refcount)) return;
        svcCloseHandle(__httpc_servhandle);
-
-       __httpc_servhandle = 0;
 }
 
 Result httpcOpenContext(httpcContext *context, char* url, u32 use_defaultproxy)
@@ -34,16 +38,16 @@ Result httpcOpenContext(httpcContext *context, char* url, u32 use_defaultproxy)
        Result ret=0;
 
        ret = HTTPC_CreateContext(__httpc_servhandle, url, &context->httphandle);
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))return ret;
 
        ret = srvGetServiceHandle(&context->servhandle, "http:C");
-       if(ret!=0) {
+       if(R_FAILED(ret)) {
                HTTPC_CloseContext(__httpc_servhandle, context->httphandle);
                return ret;
         }
 
        ret = HTTPC_InitializeConnectionSession(context->servhandle, context->httphandle);
-       if(ret!=0) {
+       if(R_FAILED(ret)) {
                svcCloseHandle(context->servhandle);
                HTTPC_CloseContext(__httpc_servhandle, context->httphandle);
                return ret;
@@ -52,7 +56,7 @@ Result httpcOpenContext(httpcContext *context, char* url, u32 use_defaultproxy)
        if(use_defaultproxy==0)return 0;
 
        ret = HTTPC_SetProxyDefault(context->servhandle, context->httphandle);
-       if(ret!=0) {
+       if(R_FAILED(ret)) {
                svcCloseHandle(context->servhandle);
                HTTPC_CloseContext(__httpc_servhandle, context->httphandle);
                return ret;
@@ -115,7 +119,7 @@ Result httpcDownloadData(httpcContext *context, u8* buffer, u32 size, u32 *downl
        if(downloadedsize)*downloadedsize = 0;
 
        ret=httpcGetDownloadSizeState(context, NULL, &contentsize);
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))return ret;
 
        while(pos < size)
        {
@@ -126,9 +130,9 @@ Result httpcDownloadData(httpcContext *context, u8* buffer, u32 size, u32 *downl
                if(ret==HTTPC_RESULTCODE_DOWNLOADPENDING)
                {
                        ret=httpcGetDownloadSizeState(context, &pos, NULL);
-                       if(ret!=0)return ret;
+                       if(R_FAILED(ret))return ret;
                }
-               else if(ret!=0)
+               else if(R_FAILED(ret))
                {
                        return ret;
                }
@@ -154,7 +158,7 @@ Result HTTPC_Initialize(Handle handle)
        cmdbuf[5]=0;//Some sort of handle.
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        return cmdbuf[1];
 }
@@ -171,7 +175,7 @@ Result HTTPC_CreateContext(Handle handle, char* url, Handle* contextHandle)
        cmdbuf[4]=(u32)url;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
        
        if(contextHandle)*contextHandle=cmdbuf[2];
 
@@ -187,7 +191,7 @@ Result HTTPC_InitializeConnectionSession(Handle handle, Handle contextHandle)
        cmdbuf[2]=IPC_Desc_CurProcessHandle();
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        return cmdbuf[1];
 }
@@ -200,7 +204,7 @@ Result HTTPC_SetProxyDefault(Handle handle, Handle contextHandle)
        cmdbuf[1]=contextHandle;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        return cmdbuf[1];
 }
@@ -213,7 +217,7 @@ Result HTTPC_CloseContext(Handle handle, Handle contextHandle)
        cmdbuf[1]=contextHandle;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        return cmdbuf[1];
 }
@@ -235,7 +239,7 @@ Result HTTPC_AddRequestHeaderField(Handle handle, Handle contextHandle, char* na
        cmdbuf[7]=(u32)value;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        return cmdbuf[1];
 }
@@ -248,7 +252,7 @@ Result HTTPC_BeginRequest(Handle handle, Handle contextHandle)
        cmdbuf[1]=contextHandle;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        return cmdbuf[1];
 }
@@ -264,7 +268,7 @@ Result HTTPC_ReceiveData(Handle handle, Handle contextHandle, u8* buffer, u32 si
        cmdbuf[4]=(u32)buffer;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        return cmdbuf[1];
 }
@@ -277,7 +281,7 @@ Result HTTPC_GetRequestState(Handle handle, Handle contextHandle, httpcReqStatus
        cmdbuf[1]=contextHandle;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        *out = cmdbuf[2];
 
@@ -292,7 +296,7 @@ Result HTTPC_GetDownloadSizeState(Handle handle, Handle contextHandle, u32* down
        cmdbuf[1]=contextHandle;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        if(downloadedsize)*downloadedsize = cmdbuf[2];
        if(contentsize)*contentsize = cmdbuf[3];
@@ -316,7 +320,7 @@ Result HTTPC_GetResponseHeader(Handle handle, Handle contextHandle, char* name,
        cmdbuf[7]=(u32)value;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        return cmdbuf[1];
 }
@@ -329,7 +333,7 @@ Result HTTPC_GetResponseStatusCode(Handle handle, Handle contextHandle, u32* out
        cmdbuf[1]=contextHandle;
        
        Result ret=0;
-       if((ret=svcSendSyncRequest(handle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
        *out = cmdbuf[2];
 
index b883fcbe479bbee6777cff34ac695a1fee1687a4..3492b299adab249246a0e6a51e3a35a18a3f70b3 100644 (file)
@@ -1,15 +1,18 @@
 #include <stdlib.h>
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/ir.h>
 #include <3ds/ipc.h>
 
-static Handle iru_handle=0;
-static Handle iru_sharedmem_handle=0;
-static u32 *iru_sharedmem = NULL;
-static u32 iru_sharedmem_size = 0;
+static Handle iru_handle;
+static Handle iru_sharedmem_handle;
+static u32 *iru_sharedmem;
+static u32 iru_sharedmem_size;
+static int iru_refcount;
 
 Result irucmd_Initialize(void)
 {
@@ -18,7 +21,7 @@ Result irucmd_Initialize(void)
 
        cmdbuf[0] = IPC_MakeHeader(0x1,0,0); // 0x10000
 
-       if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        return ret;
@@ -31,7 +34,7 @@ Result irucmd_Shutdown(void)
 
        cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
 
-       if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        return ret;
@@ -47,7 +50,7 @@ Result irucmd_StartSendTransfer(u8 *buf, u32 size)
        cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
        cmdbuf[3] = (u32)buf;
 
-       if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        return ret;
@@ -60,7 +63,7 @@ Result irucmd_WaitSendTransfer(void)
 
        cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000
 
-       if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        return ret;
@@ -78,7 +81,7 @@ Result irucmd_StartRecvTransfer(u32 size, u8 flag)
        cmdbuf[4] = IPC_Desc_SharedHandles(1);
        cmdbuf[5] = iru_sharedmem_handle;
 
-       if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        return ret;
@@ -91,7 +94,7 @@ Result irucmd_WaitRecvTransfer(u32 *transfercount)
 
        cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
 
-       if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        *transfercount = cmdbuf[2];
@@ -107,7 +110,7 @@ Result IRU_SetBitRate(u8 value)
        cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040
        cmdbuf[1] = (u32)value;
 
-       if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        return ret;
@@ -120,7 +123,7 @@ Result IRU_GetBitRate(u8 *out)
 
        cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0xA0000
 
-       if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        *out = (u8)cmdbuf[2];
@@ -136,7 +139,7 @@ Result IRU_SetIRLEDState(u32 value)
        cmdbuf[0] = IPC_MakeHeader(0xB,1,0); // 0xB0040
        cmdbuf[1] = value;
 
-       if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        return ret;
@@ -149,7 +152,7 @@ Result IRU_GetIRLEDRecvState(u32 *out)
 
        cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
 
-       if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
        ret = (Result)cmdbuf[1];
 
        *out = cmdbuf[2];
@@ -157,75 +160,77 @@ Result IRU_GetIRLEDRecvState(u32 *out)
        return ret;
 }
 
-Result IRU_Initialize(u32 *sharedmem_addr, u32 sharedmem_size)
+Result iruInit(u32 *sharedmem_addr, u32 sharedmem_size)
 {
        Result ret = 0;
 
-       if(iru_handle)return 0;
+       if(AtomicPostIncrement(&iru_refcount)) return 0;
 
        ret = srvGetServiceHandle(&iru_handle, "ir:u");
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))goto cleanup0;
 
        ret = irucmd_Initialize();
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))goto cleanup1;
 
        ret = svcCreateMemoryBlock(&iru_sharedmem_handle, (u32)sharedmem_addr, sharedmem_size, 1, 3);
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))goto cleanup2;
 
        iru_sharedmem = sharedmem_addr;
        iru_sharedmem_size = sharedmem_size;
 
        return ret;
+
+cleanup2:
+       irucmd_Shutdown();
+cleanup1:
+       svcCloseHandle(iru_handle);
+cleanup0:
+       AtomicDecrement(&iru_refcount);
+       return ret;
 }
 
-Result IRU_Shutdown(void)
+void iruExit(void)
 {
-       Result ret = 0;
-
-       if(iru_handle==0)return 0;
-
-       ret = irucmd_Shutdown();
-       if(ret!=0)return ret;
+       if(AtomicDecrement(&iru_refcount)) return;
 
+       irucmd_Shutdown();
        svcCloseHandle(iru_handle);
        svcCloseHandle(iru_sharedmem_handle);
 
        iru_handle = 0;
        iru_sharedmem_handle = 0;
-
-       return 0;
 }
 
-Handle IRU_GetServHandle(void)
+Handle iruGetServHandle(void)
 {
        return iru_handle;
 }
 
-Result IRU_SendData(u8 *buf, u32 size, u32 wait)
+Result iruSendData(u8 *buf, u32 size, bool wait)
 {
        Result ret = 0;
 
        ret = irucmd_StartSendTransfer(buf, size);
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))return ret;
 
-       if(wait==0)return 0;
+       if(!wait)return 0;
 
        return irucmd_WaitSendTransfer();
 }
 
-Result IRU_RecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, u32 wait)
+Result iruRecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, bool wait)
 {
        Result ret = 0;
 
        *transfercount = 0;
 
        ret = irucmd_StartRecvTransfer(size, flag);
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))return ret;
 
        if(wait)
        {
                ret = irucmd_WaitRecvTransfer(transfercount);
-               if(ret!=0)return ret;
+               if(R_FAILED(ret))return ret;
 
                if(buf)memcpy(buf, iru_sharedmem, size);
        }
index b336f3703963f72d5dc9f869fb4e88882769e1c7..ff55d5ab750fd53c7bf1b7733ce99da52b09bdd0 100644 (file)
@@ -4,9 +4,11 @@
 #include <stdlib.h>
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
 #include <3ds/mappable.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/irrst.h>
 #include <3ds/ipc.h>
 
@@ -21,19 +23,19 @@ vu32* irrstSharedMem;
 
 static u32 kHeld;
 static circlePosition csPos;
-static bool irrstUsed = false;
+static int irrstRefCount;
 
 Result irrstInit(void)
 {
-       if(irrstUsed)return 0;
+       if (AtomicPostIncrement(&irrstRefCount)) return 0;
 
        Result ret=0;
 
        // Request service.
-       if((ret=srvGetServiceHandle(&irrstHandle, "ir:rst")))return ret;
+       if(R_FAILED(ret=srvGetServiceHandle(&irrstHandle, "ir:rst"))) goto cleanup0;
 
        // Get sharedmem handle.
-       if((ret=IRRST_GetHandles(&irrstMemHandle, &irrstEvent))) goto cleanup1;
+       if(R_FAILED(ret=IRRST_GetHandles(&irrstMemHandle, &irrstEvent))) goto cleanup1;
 
        // Initialize ir:rst
        if(__get_handle_from_list("ir:rst")==0)ret=IRRST_Initialize(10, 0);
@@ -46,10 +48,9 @@ Result irrstInit(void)
                goto cleanup1;
        }
 
-       if((ret=svcMapMemoryBlock(irrstMemHandle, (u32)irrstSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
+       if(R_FAILED(ret=svcMapMemoryBlock(irrstMemHandle, (u32)irrstSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
 
        // Reset internal state.
-       irrstUsed = true;
        kHeld = 0;
        return 0;
 
@@ -62,14 +63,15 @@ cleanup2:
        }
 cleanup1:
        svcCloseHandle(irrstHandle);
+cleanup0:
+       AtomicDecrement(&irrstRefCount);
        return ret;
 }
 
 void irrstExit(void)
 {
-       if(!irrstUsed)return;
+       if (AtomicDecrement(&irrstRefCount)) return;
 
-       irrstUsed = false;
        svcCloseHandle(irrstEvent);
        // Unmap ir:rst sharedmem and close handles.
        svcUnmapMemoryBlock(irrstMemHandle, (u32)irrstSharedMem);
@@ -108,7 +110,7 @@ u32 irrstCheckSectionUpdateTime(vu32 *sharedmem_section, u32 id)
 
 void irrstScanInput(void)
 {
-       if(!irrstUsed)return;
+       if(irrstRefCount==0)return;
        
        u32 Id=0;
        kHeld = 0;
@@ -125,7 +127,7 @@ void irrstScanInput(void)
 
 u32 irrstKeysHeld(void)
 {
-       if(irrstUsed)return kHeld;
+       if(irrstRefCount>0)return kHeld;
        return 0;
 }
 
@@ -140,7 +142,7 @@ Result IRRST_GetHandles(Handle* outMemHandle, Handle* outEventHandle)
        cmdbuf[0]=IPC_MakeHeader(0x1,0,0); // 0x10000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(irrstHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(irrstHandle)))return ret;
 
        if(outMemHandle)*outMemHandle=cmdbuf[3];
        if(outEventHandle)*outEventHandle=cmdbuf[4];
@@ -156,7 +158,7 @@ Result IRRST_Initialize(u32 unk1, u8 unk2)
        cmdbuf[2]=unk2;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(irrstHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(irrstHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -167,7 +169,7 @@ Result IRRST_Shutdown(void)
        cmdbuf[0]=IPC_MakeHeader(0x3,0,0); // 0x30000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(irrstHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(irrstHandle)))return ret;
 
        return cmdbuf[1];
 }
index fdad9c1ce51ec702bcc190f47cc4dc30c6336bfe..ab3e574dbd96b0e127f5e49105babdd46d2f91ed 100644 (file)
@@ -5,20 +5,22 @@
 #include <stdlib.h>
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
 #include <3ds/os.h>
 #include <3ds/linear.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/mvd.h>
 #include <3ds/ipc.h>
 
 Handle mvdstdHandle;
-static u32 mvdstdInitialized = 0;
+static int mvdstdRefCount;
 static mvdstdMode mvdstd_mode;
 static mvdstdTypeInput mvdstd_input_type;
 static mvdstdTypeOutput mvdstd_output_type;
-static u32 *mvdstd_workbuf = NULL;
-static size_t mvdstd_workbufsize = 0;
+static u32 *mvdstd_workbuf;
+static size_t mvdstd_workbufsize;
 
 static Result mvdstdipc_Initialize(u32 *buf, u32 bufsize, Handle kprocess)
 {
@@ -30,7 +32,7 @@ static Result mvdstdipc_Initialize(u32 *buf, u32 bufsize, Handle kprocess)
        cmdbuf[4] = kprocess;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(mvdstdHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -52,7 +54,7 @@ static Result mvdstdipc_cmd18(void)
        cmdbuf[0] = IPC_MakeHeader(0x18,0,0); // 0x180000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(mvdstdHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -63,7 +65,7 @@ static Result mvdstdipc_cmd19(void)
        cmdbuf[0] = IPC_MakeHeader(0x19,0,0); // 0x190000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(mvdstdHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -74,7 +76,7 @@ static Result mvdstdipc_cmd1a(void)
        cmdbuf[0] = IPC_MakeHeader(0x1A,0,0); // 0x1A0000
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(mvdstdHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -90,7 +92,7 @@ Result mvdstdSetConfig(mvdstdConfig *config)
        cmdbuf[5] = (u32)config;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(mvdstdHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
 
        return cmdbuf[1];
 }
@@ -137,8 +139,6 @@ Result mvdstdInit(mvdstdMode mode, mvdstdTypeInput input_type, mvdstdTypeOutput
 {
        Result ret=0;
 
-       if(mvdstdInitialized)return 0;
-
        mvdstd_workbufsize = size;
        mvdstd_mode = mode;
        mvdstd_input_type = input_type;
@@ -147,36 +147,35 @@ Result mvdstdInit(mvdstdMode mode, mvdstdTypeInput input_type, mvdstdTypeOutput
        if(mvdstd_mode==MVDMODE_COLORFORMATCONV)mvdstd_workbufsize = 1;
        if(mvdstd_mode!=MVDMODE_COLORFORMATCONV)return -2;//Video processing / H.264 isn't supported atm.
 
-       if((ret=srvGetServiceHandle(&mvdstdHandle, "mvd:STD")))return ret;
+       if (AtomicPostIncrement(&mvdstdRefCount)) return 0;
+
+       if(R_FAILED(ret=srvGetServiceHandle(&mvdstdHandle, "mvd:STD"))) goto cleanup0;
 
        mvdstd_workbuf = linearAlloc(mvdstd_workbufsize);
-       if(mvdstd_workbuf==NULL)return -1;
+       if(mvdstd_workbuf==NULL) goto cleanup1;
 
        ret = mvdstdipc_Initialize((u32*)osConvertOldLINEARMemToNew((u32)mvdstd_workbuf), mvdstd_workbufsize, CUR_PROCESS_HANDLE);
-       if(ret<0)
-       {
-               svcCloseHandle(mvdstdHandle);
-               linearFree(mvdstd_workbuf);
-               return ret;
-       }
+       if(R_FAILED(ret)) goto cleanup2;
 
        ret = mvdstdipc_cmd18();
-       if(ret<0)
-       {
-               mvdstdipc_Shutdown();
-               svcCloseHandle(mvdstdHandle);
-               linearFree(mvdstd_workbuf);
-               return ret;
-       }
+       if(R_FAILED(ret)) goto cleanup3;
 
-       mvdstdInitialized = 1;
+       return ret;
 
-       return 0;
+cleanup3:
+       mvdstdipc_Shutdown();
+cleanup2:
+       linearFree(mvdstd_workbuf);
+cleanup1:
+       svcCloseHandle(mvdstdHandle);
+cleanup0:
+       AtomicDecrement(&mvdstdRefCount);
+       return ret;
 }
 
-Result mvdstdShutdown(void)
+void mvdstdExit(void)
 {
-       if(!mvdstdInitialized)return 0;
+       if (AtomicDecrement(&mvdstdRefCount)) return;
 
        if(mvdstd_mode==MVDMODE_COLORFORMATCONV)
        {
@@ -188,20 +187,18 @@ Result mvdstdShutdown(void)
        svcCloseHandle(mvdstdHandle);
 
        linearFree(mvdstd_workbuf);
-
-       return 0;
 }
 
 Result mvdstdProcessFrame(mvdstdConfig *config, u32 *h264_vaddr_inframe, u32 h264_inframesize, u32 h264_frameid)
 {
        Result ret;
 
-       if(!mvdstdInitialized)return 0;
+       if(mvdstdRefCount==0)return 0;
        if(config==NULL)return -1;
        if(mvdstd_mode!=MVDMODE_COLORFORMATCONV)return -2;
 
        ret = mvdstdSetConfig(config);
-       if(ret<0)return ret;
+       if(R_FAILED(ret))return ret;
 
        return mvdstdipc_cmd1a();
 }
index 75b415d20f02233cc93112a376ef92f76a42cf1c..50ee1a324e8be97025db975a95be4c550bce7fd1 100644 (file)
@@ -1,8 +1,10 @@
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/os.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/news.h>
 #include <3ds/ipc.h>
 
@@ -18,14 +20,20 @@ typedef struct {
        u16 title[32];
 } NotificationHeader;
 
-static Handle newsHandle = 0;
+static Handle newsHandle;
+static int newsRefCount;
 
 Result newsInit(void) {
-       return srvGetServiceHandle(&newsHandle, "news:u");
+       Result res;
+       if (AtomicPostIncrement(&newsRefCount)) return 0;
+       res = srvGetServiceHandle(&newsHandle, "news:u");
+       if (R_FAILED(res)) AtomicDecrement(&newsRefCount);
+       return res;
 }
 
-Result newsExit(void) {
-       return svcCloseHandle(newsHandle);
+void newsExit(void) {
+       if (AtomicDecrement(&newsRefCount)) return;
+       svcCloseHandle(newsHandle);
 }
 
 Result NEWSU_AddNotification(const u16* title, u32 titleLength, const u16* message, u32 messageLength, const void* imageData, u32 imageSize, bool jpeg)
@@ -54,7 +62,7 @@ Result NEWSU_AddNotification(const u16* title, u32 titleLength, const u16* messa
        cmdbuf[10] = IPC_Desc_Buffer(imageSize,IPC_BUFFER_R);
        cmdbuf[11] = (u32) imageData;
 
-       if((ret = svcSendSyncRequest(newsHandle))!=0) return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
 
        return (Result)cmdbuf[1];
 }
index 84501f2173523b053c688755eb01f8e687543240..14a972a83a14fbe9b149bc892adcc7322dae4e63 100644 (file)
@@ -1,20 +1,28 @@
 #include <stdlib.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/ns.h>
 #include <3ds/ipc.h>
 
 static Handle nsHandle;
+static int nsRefCount;
 
 Result nsInit(void)
 {
-       return srvGetServiceHandle(&nsHandle, "ns:s");  
+       Result res;
+       if (AtomicPostIncrement(&nsRefCount)) return 0;
+       res = srvGetServiceHandle(&nsHandle, "ns:s");
+       if (R_FAILED(res)) AtomicDecrement(&nsRefCount);
+       return res;
 }
 
-Result nsExit(void)
+void nsExit(void)
 {
-       return svcCloseHandle(nsHandle);
+       if (AtomicDecrement(&nsRefCount)) return;
+       svcCloseHandle(nsHandle);
 }
 
 Result NS_LaunchTitle(u64 titleid, u32 launch_flags, u32 *procid)
@@ -27,7 +35,7 @@ Result NS_LaunchTitle(u64 titleid, u32 launch_flags, u32 *procid)
        cmdbuf[2] = (titleid >> 32) & 0xffffffff;
        cmdbuf[3] = launch_flags;
        
-       if((ret = svcSendSyncRequest(nsHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
 
        if(procid != NULL)
                *procid = cmdbuf[2];
@@ -48,7 +56,7 @@ Result NS_RebootToTitle(u8 mediatype, u64 titleid)
        cmdbuf[5] = 0x0; // reserved
        cmdbuf[6] = 0x0;
        
-       if((ret = svcSendSyncRequest(nsHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
 
        return (Result)cmdbuf[1];
 }
\ No newline at end of file
index a21de43665f36229468003fdee15e5b44c070f13..f0133c9f61cd1c78c0d5afe5596438fedf3327ea 100644 (file)
@@ -1,21 +1,29 @@
 #include <stdlib.h>
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/pm.h>
 #include <3ds/ipc.h>
 
 static Handle pmHandle;
+static int pmRefCount;
 
 Result pmInit(void)
 {
-       return srvGetServiceHandle(&pmHandle, "pm:app");        
+       Result res;
+       if (AtomicPostIncrement(&pmRefCount)) return 0;
+       res = srvGetServiceHandle(&pmHandle, "pm:app");
+       if (R_FAILED(res)) AtomicDecrement(&pmRefCount);
+       return res;
 }
 
-Result pmExit(void)
+void pmExit(void)
 {
-       return svcCloseHandle(pmHandle);
+       if (AtomicDecrement(&pmRefCount)) return;
+       svcCloseHandle(pmHandle);
 }
 
 Result PM_LaunchTitle(u8 mediatype, u64 titleid, u32 launch_flags)
@@ -30,7 +38,7 @@ Result PM_LaunchTitle(u8 mediatype, u64 titleid, u32 launch_flags)
        cmdbuf[4] = 0x0;
        cmdbuf[5] = launch_flags;
        
-       if((ret = svcSendSyncRequest(pmHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
        
        return (Result)cmdbuf[1];
 }
@@ -46,7 +54,7 @@ Result PM_GetTitleExheaderFlags(u8 mediatype, u64 titleid, u8* out)
        cmdbuf[3] = mediatype;
        cmdbuf[4] = 0x0;
        
-       if((ret = svcSendSyncRequest(pmHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
        
        memcpy(out, (u8*)(&cmdbuf[2]), 8);
        
@@ -63,7 +71,7 @@ Result PM_SetFIRMLaunchParams(u32 size, u8* in)
        cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
        cmdbuf[3] = (u32)in;
        
-       if((ret = svcSendSyncRequest(pmHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
                
        return (Result)cmdbuf[1];
 }
@@ -78,7 +86,7 @@ Result PM_GetFIRMLaunchParams(u32 size, u8* out)
        cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
        cmdbuf[3] = (u32)out;
        
-       if((ret = svcSendSyncRequest(pmHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
                
        return (Result)cmdbuf[1];
 }
@@ -94,7 +102,7 @@ Result PM_LaunchFIRMSetParams(u32 firm_titleid_low, u32 size, u8* in)
        cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
        cmdbuf[4] = (u32)in;
        
-       if((ret = svcSendSyncRequest(pmHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
                
        return (Result)cmdbuf[1];
 }
\ No newline at end of file
index 482fd4ae1cf2200121ae5baf9cc74954e7382465..e1b90104b9eac1a9e774d48c4725dc76b606ad5a 100644 (file)
@@ -1,20 +1,28 @@
 #include <stdlib.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/ps.h>
 #include <3ds/ipc.h>
 
 static Handle psHandle;
+static int psRefCount;
 
 Result psInit(void)
 {
-       return srvGetServiceHandle(&psHandle, "ps:ps");
+       Result res;
+       if (AtomicPostIncrement(&psRefCount)) return 0;
+       res = srvGetServiceHandle(&psHandle, "ps:ps");
+       if (R_FAILED(res)) AtomicDecrement(&psRefCount);
+       return res;
 }
 
-Result psExit(void)
+void psExit(void)
 {
-       return svcCloseHandle(psHandle);
+       if (AtomicDecrement(&psRefCount)) return;
+       svcCloseHandle(psHandle);
 }
 
 Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, u32 aes_algo, u32 key_type, u8* iv)
@@ -37,7 +45,7 @@ Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, u32 aes_algo, u32 key_typ
        cmdbuf[10] = IPC_Desc_PXIBuffer(size,1,false);
        cmdbuf[11] = (u32)out;
 
-       if((ret = svcSendSyncRequest(psHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret;
 
        _iv[0] = cmdbuf[2];
        _iv[1] = cmdbuf[3];
@@ -70,7 +78,7 @@ Result PS_EncryptSignDecryptVerifyAesCcm(u8* in, u32 in_size, u8* out, u32 out_s
        cmdbuf[10] = IPC_Desc_PXIBuffer(out_size,1,false);
        cmdbuf[11] = (u32)out;
 
-       if((ret = svcSendSyncRequest(psHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret;
 
        return (Result)cmdbuf[1];
 }
@@ -82,7 +90,7 @@ Result PS_GetLocalFriendCodeSeed(u64* seed)
 
        cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0xA0000
 
-       if((ret = svcSendSyncRequest(psHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret;
 
        *seed = (u64)cmdbuf[2] | (u64)cmdbuf[3] << 32;
 
@@ -96,7 +104,7 @@ Result PS_GetDeviceId(u32* device_id)
 
        cmdbuf[0] = IPC_MakeHeader(0xB,0,0); // 0xB0000
 
-       if((ret = svcSendSyncRequest(psHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret;
 
        *device_id = cmdbuf[2];
 
index c3851c1540f95ee21826614f4a6e206c8e0e4a48..a986d2fd44cee07dfda9b6f062d1bbb53152d4d6 100644 (file)
 #include <stdlib.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/ptm.h>
 #include <3ds/ipc.h>
 
-
 static Handle ptmHandle, ptmSysmHandle;
+static int ptmRefCount, ptmSysmRefCount;
 
 Result ptmInit(void)
 {
-       return srvGetServiceHandle(&ptmHandle, "ptm:u");
+       if (AtomicPostIncrement(&ptmRefCount)) return 0;
+       Result res = srvGetServiceHandle(&ptmHandle, "ptm:u");
+       if (R_FAILED(res)) AtomicDecrement(&ptmRefCount);
+       return res;
 }
 
-Result ptmExit(void)
+void ptmExit(void)
 {
-       return svcCloseHandle(ptmHandle);
+       if (AtomicDecrement(&ptmRefCount)) return;
+       svcCloseHandle(ptmHandle);
 }
 
 Result ptmSysmInit(void)
 {
-       return srvGetServiceHandle(&ptmSysmHandle, "ptm:sysm");
+       if (AtomicPostIncrement(&ptmSysmRefCount)) return 0;
+       Result res = srvGetServiceHandle(&ptmSysmHandle, "ptm:sysm");
+       if (R_FAILED(res)) AtomicDecrement(&ptmSysmHandle);
+       return res;
 }
 
-Result ptmSysmExit(void)
+void ptmSysmExit(void)
 {
-       return svcCloseHandle(ptmSysmHandle);
+       if (AtomicDecrement(&ptmSysmHandle)) return;
+       svcCloseHandle(ptmSysmHandle);
 }
 
-Result PTMU_GetShellState(Handle* servhandle, u8 *out)
+Result PTMU_GetShellState(u8 *out)
 {
-       if(!servhandle)servhandle=&ptmHandle;
        Result ret=0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
 
-       if((ret = svcSendSyncRequest(*servhandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
 
        *out = (u8)cmdbuf[2];
 
        return (Result)cmdbuf[1];
 }
 
-Result PTMU_GetBatteryLevel(Handle* servhandle, u8 *out)
+Result PTMU_GetBatteryLevel(u8 *out)
 {
-       if(!servhandle)servhandle=&ptmHandle;
        Result ret=0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = IPC_MakeHeader(0x7,0,0); // 0x70000
 
-       if((ret = svcSendSyncRequest(*servhandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
 
        *out = (u8)cmdbuf[2];
 
        return (Result)cmdbuf[1];
 }
 
-Result PTMU_GetBatteryChargeState(Handle* servhandle, u8 *out)
+Result PTMU_GetBatteryChargeState(u8 *out)
 {
-       if(!servhandle)servhandle=&ptmHandle;
        Result ret=0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = IPC_MakeHeader(0x8,0,0); // 0x80000
 
-       if((ret = svcSendSyncRequest(*servhandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
 
        *out = (u8)cmdbuf[2];
 
        return (Result)cmdbuf[1];
 }
 
-Result PTMU_GetPedometerState(Handle* servhandle, u8 *out)
+Result PTMU_GetPedometerState(u8 *out)
 {
-       if(!servhandle)servhandle=&ptmHandle;
        Result ret=0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = IPC_MakeHeader(0x9,0,0); // 0x90000
 
-       if((ret = svcSendSyncRequest(*servhandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
 
        *out = (u8)cmdbuf[2];
 
        return (Result)cmdbuf[1];
 }
 
-Result PTMU_GetTotalStepCount(Handle* servhandle, u32 *steps)
+Result PTMU_GetTotalStepCount(u32 *steps)
 {
-       if(!servhandle)servhandle=&ptmHandle;
        Result ret=0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
 
-       if((ret = svcSendSyncRequest(*servhandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
 
        *steps = cmdbuf[2];
 
@@ -111,7 +116,7 @@ Result PTMSYSM_ConfigureNew3DSCPU(u8 value)
        cmdbuf[0] = IPC_MakeHeader(0x818,1,0); // 0x08180040
        cmdbuf[1] = value;
 
-       if((ret = svcSendSyncRequest(ptmSysmHandle))!=0)return ret;
+       if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
 
        return (Result)cmdbuf[1];
 }
index 3d8e4c0f57a14464aecad82e1ac8f6b1cc2a0088..5978b2864e39ae3c46d819f3bed29140de9446c4 100644 (file)
@@ -4,56 +4,55 @@
 #include <stdlib.h>
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/svc.h>
 #include <3ds/srv.h>
+#include <3ds/synchronization.h>
 #include <3ds/services/qtm.h>
 #include <3ds/ipc.h>
 
 Handle qtmHandle;
-
-static bool qtmInitialized = false;
+static int qtmRefCount;
 
 Result qtmInit(void)
 {
        Result ret=0;
 
-       if(qtmInitialized)return 0;
-
-       if((ret=srvGetServiceHandle(&qtmHandle, "qtm:u")) && (ret=srvGetServiceHandle(&qtmHandle, "qtm:s")) && (ret=srvGetServiceHandle(&qtmHandle, "qtm:sp")))return ret;
-
-       qtmInitialized = true;
+       if (AtomicPostIncrement(&qtmRefCount)) return 0;
 
-       return 0;
+       ret = srvGetServiceHandle(&qtmHandle, "qtm:u");
+       if (R_FAILED(ret)) ret = srvGetServiceHandle(&qtmHandle, "qtm:s");
+       if (R_FAILED(ret)) ret = srvGetServiceHandle(&qtmHandle, "qtm:sp");
+       if (R_FAILED(ret)) AtomicDecrement(&qtmRefCount);
+       return ret;
 }
 
 void qtmExit(void)
 {
-       if(!qtmInitialized)return;
-
+       if (AtomicDecrement(&qtmRefCount)) return;
        svcCloseHandle(qtmHandle);
-       qtmInitialized = false;
 }
 
 bool qtmCheckInitialized(void)
 {
-       return qtmInitialized;
+       return qtmRefCount>0;
 }
 
 Result qtmGetHeadtrackingInfo(u64 val, qtmHeadtrackingInfo *out)
 {
        u32* cmdbuf=getThreadCommandBuffer();
 
-       if(!qtmInitialized)return -1;
+       if(!qtmCheckInitialized())return -1;
 
        cmdbuf[0]=IPC_MakeHeader(0x2,2,0); // 0x20080
        cmdbuf[1] = val&0xFFFFFFFF;
        cmdbuf[2] = val>>32;
 
        Result ret=0;
-       if((ret=svcSendSyncRequest(qtmHandle)))return ret;
+       if(R_FAILED(ret=svcSendSyncRequest(qtmHandle)))return ret;
 
        ret = (Result)cmdbuf[1];
-       if(ret!=0)return ret;
+       if(R_FAILED(ret))return ret;
 
        if(out)memcpy(out, &cmdbuf[2], sizeof(qtmHeadtrackingInfo));
 
index fcacfbebe41042736fcc09138ae9c862fd7e27cb..e34e95c5cba3195914e74da1b4ca0009c127d76d 100644 (file)
@@ -4,48 +4,34 @@
 #include <3ds/srv.h>
 #include <3ds/svc.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/ipc.h>
+#include <3ds/synchronization.h>
 
-Handle y2rHandle = 0;
-static bool initialized = false;
+Handle y2rHandle;
+static int y2rRefCount;
 
 Result y2rInit(void)
 {
        Result ret = 0;
 
-       if (initialized) return 0;
+       if (AtomicPostIncrement(&y2rRefCount)) return 0;
 
-       if (y2rHandle == 0)
+       ret = srvGetServiceHandle(&y2rHandle, "y2r:u");
+       if (R_SUCCEEDED(ret))
        {
-               ret = srvGetServiceHandle(&y2rHandle, "y2r:u");
-               if (ret < 0) return ret;
+               ret = Y2RU_DriverInitialize();
+               if (R_FAILED(ret)) svcCloseHandle(y2rHandle);
        }
-
-       ret = Y2RU_DriverInitialize();
-       if (ret < 0) return ret;
-       initialized = true;
-
-       return 0;
+       if (R_FAILED(ret)) AtomicDecrement(&y2rRefCount);
+       return ret;
 }
 
-Result y2rExit(void)
+void y2rExit(void)
 {
-       Result ret = 0;
-
-       if (initialized)
-       {
-               ret = Y2RU_DriverFinalize();
-               if (ret < 0) return ret;
-       }
-
-       if (y2rHandle != 0)
-       {
-               ret = svcCloseHandle(y2rHandle);
-               if (ret < 0) return ret;
-               y2rHandle = 0;
-       }
-
-       return 0;
+       if (AtomicDecrement(&y2rRefCount)) return;
+       Y2RU_DriverFinalize();
+       svcCloseHandle(y2rHandle);
 }
 
 Result Y2RU_SetInputFormat(Y2R_InputFormat format)
@@ -55,7 +41,7 @@ Result Y2RU_SetInputFormat(Y2R_InputFormat format)
        cmdbuf[0] = IPC_MakeHeader(0x1,1,0); // 0x10040
        cmdbuf[1] = format;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -65,7 +51,7 @@ Result Y2RU_GetInputFormat(Y2R_InputFormat* format)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *format = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -77,7 +63,7 @@ Result Y2RU_SetOutputFormat(Y2R_OutputFormat format)
        cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040
        cmdbuf[1] = format;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -87,7 +73,7 @@ Result Y2RU_GetOutputFormat(Y2R_OutputFormat* format)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *format = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -99,7 +85,7 @@ Result Y2RU_SetRotation(Y2R_Rotation rotation)
        cmdbuf[0] = IPC_MakeHeader(0x5,1,0); // 0x50040
        cmdbuf[1] = rotation;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -109,7 +95,7 @@ Result Y2RU_GetRotation(Y2R_Rotation* rotation)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *rotation = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -121,7 +107,7 @@ Result Y2RU_SetBlockAlignment(Y2R_BlockAlignment alignment)
        cmdbuf[0] = IPC_MakeHeader(0x7,1,0); // 0x70040
        cmdbuf[1] = alignment;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -131,7 +117,7 @@ Result Y2RU_GetBlockAlignment(Y2R_BlockAlignment* alignment)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x8,0,0); // 0x80000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *alignment = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -143,7 +129,7 @@ Result Y2RU_SetSpacialDithering(bool enable)
        cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040
        cmdbuf[1] = enable;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -153,7 +139,7 @@ Result Y2RU_GetSpacialDithering(bool* enabled)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0xA0000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *enabled = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -165,7 +151,7 @@ Result Y2RU_SetTemporalDithering(bool enable)
        cmdbuf[0] = IPC_MakeHeader(0xB,1,0); // 0xB0040
        cmdbuf[1] = enable;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -175,7 +161,7 @@ Result Y2RU_GetTemporalDithering(bool* enabled)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *enabled = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -187,7 +173,7 @@ Result Y2RU_SetTransferEndInterrupt(bool should_interrupt)
        cmdbuf[0] = IPC_MakeHeader(0xD,1,0); // 0xD0040
        cmdbuf[1] = should_interrupt;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -197,7 +183,7 @@ Result Y2RU_GetTransferEndInterrupt(bool* should_interrupt)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0xE,0,0); // 0xE0000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *should_interrupt = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -214,7 +200,7 @@ Result Y2RU_GetTransferEndEvent(Handle* end_event)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0xF,0,0); // 0xF0000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
 
        *end_event = cmdbuf[3];
        return cmdbuf[1];
@@ -232,7 +218,7 @@ Result Y2RU_SetSendingY(const void* src_buf, u32 image_size, s16 transfer_unit,
        cmdbuf[5] = IPC_Desc_SharedHandles(1);
        cmdbuf[6] = CUR_PROCESS_HANDLE;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -248,7 +234,7 @@ Result Y2RU_SetSendingU(const void* src_buf, u32 image_size, s16 transfer_unit,
        cmdbuf[5] = IPC_Desc_SharedHandles(1);
        cmdbuf[6] = CUR_PROCESS_HANDLE;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -264,7 +250,7 @@ Result Y2RU_SetSendingV(const void* src_buf, u32 image_size, s16 transfer_unit,
        cmdbuf[5] = IPC_Desc_SharedHandles(1);
        cmdbuf[6] = CUR_PROCESS_HANDLE;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -280,7 +266,7 @@ Result Y2RU_SetSendingYUYV(const void* src_buf, u32 image_size, s16 transfer_uni
        cmdbuf[5] = IPC_Desc_SharedHandles(1);
        cmdbuf[6] = CUR_PROCESS_HANDLE;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -290,7 +276,7 @@ Result Y2RU_IsDoneSendingYUYV(bool* is_done)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x14,0,0); // 0x140000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *is_done = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -301,7 +287,7 @@ Result Y2RU_IsDoneSendingY(bool* is_done)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x15,0,0); // 0x150000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *is_done = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -312,7 +298,7 @@ Result Y2RU_IsDoneSendingU(bool* is_done)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x16,0,0); // 0x160000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *is_done = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -323,7 +309,7 @@ Result Y2RU_IsDoneSendingV(bool* is_done)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x17,0,0); // 0x170000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *is_done = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -340,7 +326,7 @@ Result Y2RU_SetReceiving(void* dst_buf, u32 image_size, s16 transfer_unit, s16 t
        cmdbuf[5] = IPC_Desc_SharedHandles(1);
        cmdbuf[6] = CUR_PROCESS_HANDLE;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -350,7 +336,7 @@ Result Y2RU_IsDoneReceiving(bool* is_done)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x19,0,0); // 0x190000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *is_done = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -362,7 +348,7 @@ Result Y2RU_SetInputLineWidth(u16 line_width)
        cmdbuf[0] = IPC_MakeHeader(0x1A,1,0); // 0x1A0040
        cmdbuf[1] = line_width;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -372,7 +358,7 @@ Result Y2RU_GetInputLineWidth(u16* line_width)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x1B,0,0); // 0x1B0000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *line_width = cmdbuf[2] & 0xFFFF;
        return cmdbuf[1];
 }
@@ -384,7 +370,7 @@ Result Y2RU_SetInputLines(u16 num_lines)
        cmdbuf[0] = IPC_MakeHeader(0x1C,1,0); // 0x1C0040
        cmdbuf[1] = num_lines;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -394,7 +380,7 @@ Result Y2RU_GetInputLines(u16* num_lines)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x1D,0,0); // 0x1D0000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *num_lines = cmdbuf[2] & 0xFFFF;
        return cmdbuf[1];
 }
@@ -406,7 +392,7 @@ Result Y2RU_SetCoefficients(const Y2R_ColorCoefficients* coefficients)
        cmdbuf[0] = IPC_MakeHeader(0x1E,4,0); // 0x1E0100
        memcpy(&cmdbuf[1], coefficients, sizeof(Y2R_ColorCoefficients));
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -416,7 +402,7 @@ Result Y2RU_GetCoefficients(Y2R_ColorCoefficients* coefficients)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x1F,0,0); // 0x1F0000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        memcpy(coefficients,cmdbuf + 2, sizeof(Y2R_ColorCoefficients));
        return cmdbuf[1];
 }
@@ -428,7 +414,7 @@ Result Y2RU_SetStandardCoefficient(Y2R_StandardCoefficient coefficient)
        cmdbuf[0] = IPC_MakeHeader(0x20,1,0); // 0x200040
        cmdbuf[1] = coefficient;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -439,7 +425,7 @@ Result Y2RU_GetStandardCoefficient(Y2R_ColorCoefficients* coefficients, Y2R_Stan
        cmdbuf[0] = IPC_MakeHeader(0x21,1,0); // 0x210040
        cmdbuf[1] = standardCoeff;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        memcpy(coefficients,cmdbuf + 2, sizeof(Y2R_ColorCoefficients));
        return cmdbuf[1];
 }
@@ -451,7 +437,7 @@ Result Y2RU_SetAlpha(u16 alpha)
        cmdbuf[0] = IPC_MakeHeader(0x22,1,0); // 0x220040
        cmdbuf[1] = alpha;
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -461,7 +447,7 @@ Result Y2RU_GetAlpha(u16* alpha)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x23,0,0); // 0x230000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *alpha = cmdbuf[2] & 0xFFFF;
        return cmdbuf[1];
 }
@@ -474,7 +460,7 @@ Result Y2RU_SetDitheringWeightParams(const Y2R_DitheringWeightParams* params)
        cmdbuf[0] = IPC_MakeHeader(0x24,8,0); // 0x240200
        memcpy(&cmdbuf[1], params, sizeof(Y2R_DitheringWeightParams));
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -484,7 +470,7 @@ Result Y2RU_GetDitheringWeightParams(Y2R_DitheringWeightParams* params)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x25,0,0); // 0x250000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        memcpy(params,cmdbuf+2, sizeof(Y2R_DitheringWeightParams));
        return cmdbuf[1];
 }
@@ -495,7 +481,7 @@ Result Y2RU_StartConversion(void)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x26,0,0); // 0x260000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -505,7 +491,7 @@ Result Y2RU_StopConversion(void)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x27,0,0); // 0x270000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -515,7 +501,7 @@ Result Y2RU_IsBusyConversion(bool* is_busy)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x28,0,0); // 0x280000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *is_busy = cmdbuf[2] & 0xFF;
        return cmdbuf[1];
 }
@@ -527,7 +513,7 @@ Result Y2RU_SetConversionParams(const Y2R_ConversionParams* params)
        cmdbuf[0] = IPC_MakeHeader(0x29,7,0); // 0x2901C0
        memcpy(&cmdbuf[1], params, sizeof(Y2R_ConversionParams));
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -537,7 +523,7 @@ Result Y2RU_PingProcess(u8* ping)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x2A,0,0); // 0x2A0000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        *ping = (u8)cmdbuf[2];
        return cmdbuf[1];
 }
@@ -548,7 +534,7 @@ Result Y2RU_DriverInitialize(void)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x2B,0,0); // 0x2B0000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
 
@@ -558,6 +544,6 @@ Result Y2RU_DriverFinalize(void)
        u32* cmdbuf = getThreadCommandBuffer();
        cmdbuf[0] = IPC_MakeHeader(0x2C,0,0); // 0x2C0000
 
-       if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+       if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
        return cmdbuf[1];
 }
index 25b42339363185cb4f10aab39347e0b611a9d5d1..259d9baa9aa8aaf42d89ce45f044cae0277047bf 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <string.h>
 #include <3ds/types.h>
+#include <3ds/result.h>
 #include <3ds/srv.h>
 #include <3ds/svc.h>
 #include <3ds/ipc.h>
@@ -31,7 +32,7 @@ typedef struct {
 
 extern service_list_t* __service_ptr;
 
-static Handle g_srv_handle = 0;
+static Handle g_srv_handle;
 
 
 static int __name_cmp(const char* a, const char* b) {
@@ -80,9 +81,9 @@ Result srvInit(void)
 
        if(g_srv_handle != 0) return rc;
 
-       if((rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc;
+       if(R_FAILED(rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc;
 
-       if((rc = srvRegisterClient())) {
+       if(R_FAILED(rc = srvRegisterClient())) {
                svcCloseHandle(g_srv_handle);
                g_srv_handle = 0;
        }
@@ -112,7 +113,7 @@ Result srvRegisterClient(void)
        cmdbuf[0] = IPC_MakeHeader(0x1,0,2); // 0x10002
        cmdbuf[1] = IPC_Desc_CurProcessHandle();
 
-       if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
+       if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
 
        return cmdbuf[1];
 }
@@ -127,7 +128,7 @@ Result srvGetServiceHandleDirect(Handle* out, const char* name)
        cmdbuf[3] = strlen(name);
        cmdbuf[4] = 0x0;
        
-       if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
+       if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
 
        *out = cmdbuf[3];
        return cmdbuf[1];
@@ -156,7 +157,7 @@ Result srvRegisterService(Handle* out, const char* name, int maxSessions)
        cmdbuf[4] = maxSessions;
        
        Result rc;
-       if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
+       if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
 
        *out = cmdbuf[3];
        return cmdbuf[1];
@@ -170,7 +171,7 @@ Result srvUnregisterService(const char* name)
        cmdbuf[3] = strlen(name);
        
        Result rc;
-       if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
+       if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
 
        return cmdbuf[1];
 }
@@ -180,9 +181,9 @@ Result srvPmInit(void)
 {      
        Result rc = 0;
        
-       if((rc = svcConnectToPort(&g_srv_handle, "srv:pm")))return rc;
+       if(R_FAILED(rc = svcConnectToPort(&g_srv_handle, "srv:pm")))return rc;
        
-       if((rc = srvRegisterClient())) {
+       if(R_FAILED(rc = srvRegisterClient())) {
                svcCloseHandle(g_srv_handle);
                g_srv_handle = 0;
        }
@@ -202,7 +203,7 @@ Result srvRegisterProcess(u32 procid, u32 count, void *serviceaccesscontrol)
        cmdbuf[3] = IPC_Desc_StaticBuffer(count*4,0);
        cmdbuf[4] = (u32)serviceaccesscontrol;
        
-       if((rc = svcSendSyncRequest(g_srv_handle))) return rc;
+       if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle))) return rc;
                
        return cmdbuf[1];
 }
@@ -216,7 +217,7 @@ Result srvUnregisterProcess(u32 procid)
        cmdbuf[0] = IPC_MakeHeader(0x404,1,0); // 0x4040040 // <7.x
        cmdbuf[1] = procid;
        
-       if((rc = svcSendSyncRequest(g_srv_handle))) return rc;
+       if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle))) return rc;
                
        return cmdbuf[1];
 }