1
0
Fork 0
mirror of https://github.com/DarkMatterCore/nxdumptool.git synced 2024-11-26 12:12:02 +00:00

Gamecard usermode status change event.

Useful to wait for gamecard status changes on other threads.
This commit is contained in:
Pablo Curiel 2020-05-03 04:40:08 -04:00
parent 109913cb18
commit 08b2aed130
2 changed files with 28 additions and 13 deletions

View file

@ -76,7 +76,7 @@ typedef struct {
/* Global variables. */ /* Global variables. */
static Mutex g_gamecardMutex = 0; static Mutex g_gamecardMutex = 0;
static bool g_gamecardInitialized = false; static bool g_gamecardInterfaceInit = false;
static FsDeviceOperator g_deviceOperator = {0}; static FsDeviceOperator g_deviceOperator = {0};
static FsEventNotifier g_gameCardEventNotifier = {0}; static FsEventNotifier g_gameCardEventNotifier = {0};
@ -84,7 +84,7 @@ static Event g_gameCardKernelEvent = {0};
static bool g_openDeviceOperator = false, g_openEventNotifier = false, g_loadKernelEvent = false; static bool g_openDeviceOperator = false, g_openEventNotifier = false, g_loadKernelEvent = false;
static thrd_t g_gameCardDetectionThread; static thrd_t g_gameCardDetectionThread;
static UEvent g_gameCardDetectionThreadExitEvent = {0}; static UEvent g_gameCardDetectionThreadExitEvent = {0}, g_gameCardStatusChangeEvent = {0};
static bool g_gameCardDetectionThreadCreated = false, g_gameCardInserted = false, g_gameCardInfoLoaded = false; static bool g_gameCardDetectionThreadCreated = false, g_gameCardInserted = false, g_gameCardInfoLoaded = false;
static FsGameCardHandle g_gameCardHandle = {0}; static FsGameCardHandle g_gameCardHandle = {0};
@ -133,7 +133,7 @@ bool gamecardInitialize(void)
Result rc = 0; Result rc = 0;
bool ret = g_gamecardInitialized; bool ret = g_gamecardInterfaceInit;
if (ret) goto out; if (ret) goto out;
/* Allocate memory for the gamecard read buffer */ /* Allocate memory for the gamecard read buffer */
@ -175,17 +175,15 @@ bool gamecardInitialize(void)
g_loadKernelEvent = true; g_loadKernelEvent = true;
/* Create usermode exit event */ /* Create usermode exit event */
ueventCreate(&g_gameCardDetectionThreadExitEvent, false); ueventCreate(&g_gameCardDetectionThreadExitEvent, true);
/* Create usermode gamecard status change event */
ueventCreate(&g_gameCardStatusChangeEvent, true);
/* Create gamecard detection thread */ /* Create gamecard detection thread */
g_gameCardDetectionThreadCreated = gamecardCreateDetectionThread(); if (!(g_gameCardDetectionThreadCreated = gamecardCreateDetectionThread())) goto out;
if (!g_gameCardDetectionThreadCreated)
{
LOGFILE("Failed to create gamecard detection thread!");
goto out;
}
ret = g_gamecardInitialized = true; ret = g_gamecardInterfaceInit = true;
out: out:
mutexUnlock(&g_gamecardMutex); mutexUnlock(&g_gamecardMutex);
@ -232,11 +230,19 @@ void gamecardExit(void)
g_gameCardReadBuf = NULL; g_gameCardReadBuf = NULL;
} }
g_gamecardInitialized = false; g_gamecardInterfaceInit = false;
mutexUnlock(&g_gamecardMutex); mutexUnlock(&g_gamecardMutex);
} }
UEvent *gamecardGetStatusChangeUserEvent(void)
{
mutexLock(&g_gamecardMutex);
UEvent *event = (g_gamecardInterfaceInit ? &g_gameCardStatusChangeEvent : NULL);
mutexUnlock(&g_gamecardMutex);
return event;
}
bool gamecardIsReady(void) bool gamecardIsReady(void)
{ {
bool ret = false; bool ret = false;
@ -524,6 +530,7 @@ static int gamecardDetectionThreadFunc(void *arg)
/* Load gamecard info right away if a gamecard is inserted */ /* Load gamecard info right away if a gamecard is inserted */
g_gameCardInserted = prev_status = gamecardIsInserted(); g_gameCardInserted = prev_status = gamecardIsInserted();
if (g_gameCardInserted) gamecardLoadInfo(); if (g_gameCardInserted) gamecardLoadInfo();
ueventSignal(&g_gameCardStatusChangeEvent);
while(true) while(true)
{ {
@ -555,6 +562,8 @@ static int gamecardDetectionThreadFunc(void *arg)
prev_status = g_gameCardInserted; prev_status = g_gameCardInserted;
mutexUnlock(&g_gamecardMutex); mutexUnlock(&g_gamecardMutex);
ueventSignal(&g_gameCardStatusChangeEvent);
} }
/* Free gamecard info and close gamecard handle */ /* Free gamecard info and close gamecard handle */

View file

@ -19,6 +19,7 @@
#ifndef __GAMECARD_H__ #ifndef __GAMECARD_H__
#define __GAMECARD_H__ #define __GAMECARD_H__
#include <switch/kernel/uevent.h>
#include "fs_ext.h" #include "fs_ext.h"
#define GAMECARD_HEAD_MAGIC 0x48454144 /* "HEAD" */ #define GAMECARD_HEAD_MAGIC 0x48454144 /* "HEAD" */
@ -134,7 +135,12 @@ bool gamecardInitialize(void);
/// This includes destroying the background gamecard detection thread and freeing all cached gamecard data. /// This includes destroying the background gamecard detection thread and freeing all cached gamecard data.
void gamecardExit(void); void gamecardExit(void);
/// Used to check if a gamecard has been inserted and if info could be loaded from it. /// Returns an usermode gamecard status change event that can be used to wait for status changes on other threads.
/// If the gamecard interface hasn't been initialized, this returns NULL.
UEvent *gamecardGetStatusChangeUserEvent(void);
/// Used to check if a gamecard has been inserted and if info could be loaded from it (e.g. physical storage access is possible).
/// If this call returns false, it pretty much means nothing can be done with the inserted gamecard.
bool gamecardIsReady(void); bool gamecardIsReady(void);
/// Used to read data from the inserted gamecard. /// Used to read data from the inserted gamecard.