gamecard: add smarter delay to detection thread

Lets us respond in a better way to sudden gamecard status changes during the 3 second wait period.
This commit is contained in:
Pablo Curiel 2024-04-21 13:27:06 +02:00
parent ec993864fd
commit 56053e8105
1 changed files with 20 additions and 8 deletions

View File

@ -695,17 +695,29 @@ static void gamecardDetectionThreadFunc(void *arg)
/* Free gamecard info before proceeding. */
gamecardFreeInfo(true);
/* Retrieve current gamecard insertion status. */
/* Only proceed if we're dealing with a status change. */
if (gamecardIsInserted())
{
/* Don't access the gamecard immediately to avoid conflicts with HOS / sysmodules. */
utilsSleep(GAMECARD_ACCESS_DELAY);
/* Delay gamecard access by GAMECARD_ACCESS_DELAY full seconds. This is done to to avoid conflicts with HOS / sysmodules. */
/* We will periodically check if the gamecard is still inserted during this period. */
/* If the gamecard is taken out before reaching the length of the delay, we won't try to access it. */
time_t start = time(NULL);
bool gc_delay_passed = false;
/* Load gamecard info. */
gamecardLoadInfo();
while(gamecardIsInserted())
{
time_t now = time(NULL);
time_t diff = (now - start);
if (diff >= GAMECARD_ACCESS_DELAY)
{
gc_delay_passed = true;
break;
}
utilsAppletLoopDelay();
}
/* Load gamecard info (if applicable). */
if (gc_delay_passed) gamecardLoadInfo();
/* Signal user mode gamecard status change event. */
ueventSignal(&g_gameCardStatusChangeEvent);
}