Use netstatusGetDetails from a dedicated thread, since nifmGetInternetConnectionStatus can block for a few seconds.

This commit is contained in:
yellows8 2019-06-24 15:41:35 -04:00
parent 7c029c18b0
commit 9e257d7606
No known key found for this signature in database
GPG Key ID: 0AF90DA3F1E60E43
7 changed files with 131 additions and 3 deletions

View File

@ -10,7 +10,7 @@ EXTRA_LDFLAGS="-lws2_32"
endif endif
test : pc_main/main.cpp pc_main/pc_launch.c pc_main/pc_power.c pc_main/pc_netstatus.c \ test : pc_main/main.cpp pc_main/pc_launch.c pc_main/pc_power.c pc_main/pc_netstatus.c \
common/menu.c common/font.c common/language.c common/launch.c common/worker.c \ common/menu.c common/font.c common/language.c common/launch.c common/worker.c common/status.c \
common/menu-entry.c common/menu-list.c common/message-box.c common/text.c \ common/menu-entry.c common/menu-list.c common/message-box.c common/text.c \
common/ui.c common/assets.c common/math.c common/theme.c \ common/ui.c common/assets.c common/math.c common/theme.c \
common/netloader.c common/netloader.c

View File

@ -65,6 +65,7 @@ typedef union {
#include "power.h" #include "power.h"
#include "netloader.h" #include "netloader.h"
#include "netstatus.h" #include "netstatus.h"
#include "status.h"
void menuStartupPath(void); void menuStartupPath(void);
void menuStartup(void); void menuStartup(void);

View File

@ -438,9 +438,12 @@ void drawCharge() {
} }
void drawNetwork(int tmpX) { void drawNetwork(int tmpX) {
bool netstatusFlag=0;
AssetId id; AssetId id;
if (netstatusGetDetails(&id)) if (statusGet(&netstatusFlag, &id)) {
drawIcon(tmpX, 0 + 47 + 10 + 3, 24, 24, assetsGetDataBuffer(id), themeCurrent.textColor); if (netstatusFlag)
drawIcon(tmpX, 0 + 47 + 10 + 3, 24, 24, assetsGetDataBuffer(id), themeCurrent.textColor);
}
} }
void drawStatus() { void drawStatus() {

109
common/status.c Normal file
View File

@ -0,0 +1,109 @@
#include "status.h"
static bool s_statusInitialized = 0;
static thrd_t s_statusThread;
static cnd_t s_statusCdn;
static mtx_t s_statusMtx;
static mtx_t s_statusAccessMtx;
static bool s_statusExit;
static bool s_statusReady;
static bool s_statusNetFlag;
static AssetId s_statusNetAssetId;
// This uses netstatusGetDetails from a dedicated thread, since nifmGetInternetConnectionStatus can block for a few seconds.
static int statusThreadProc(void* unused)
{
mtx_lock(&s_statusMtx);
struct timespec timeout = {0};
clock_gettime(CLOCK_MONOTONIC, &timeout);
timeout.tv_sec++;
for (;;)
{
cnd_timedwait(&s_statusCdn, &s_statusMtx, &timeout);
if (s_statusExit)
break;
mtx_lock(&s_statusAccessMtx);
s_statusNetFlag = netstatusGetDetails(&s_statusNetAssetId);
s_statusReady = 1;
mtx_unlock(&s_statusAccessMtx);
clock_gettime(CLOCK_MONOTONIC, &timeout);
timeout.tv_sec++;
}
mtx_unlock(&s_statusMtx);
return 0;
}
bool statusGet(bool *netstatusFlag, AssetId *netstatusAssetId) {
if (!s_statusReady) return 0;
mtx_lock(&s_statusAccessMtx);
*netstatusFlag = s_statusNetFlag;
*netstatusAssetId = s_statusNetAssetId;
mtx_unlock(&s_statusAccessMtx);
return 1;
}
bool statusInit(void)
{
if (s_statusInitialized) return 1;
if (cnd_init(&s_statusCdn) != thrd_success) return 0;
if (mtx_init(&s_statusMtx, mtx_plain) != thrd_success) {
cnd_destroy(&s_statusCdn);
return 0;
}
if (mtx_init(&s_statusAccessMtx, mtx_plain) != thrd_success) {
mtx_destroy(&s_statusMtx);
cnd_destroy(&s_statusCdn);
return 0;
}
if (thrd_create(&s_statusThread, statusThreadProc, 0) != thrd_success) {
mtx_destroy(&s_statusAccessMtx);
mtx_destroy(&s_statusMtx);
cnd_destroy(&s_statusCdn);
return 0;
}
s_statusInitialized = 1;
return 1;
}
void statusExit(void)
{
int res=0;
if (!s_statusInitialized) return;
s_statusInitialized = 0;
mtx_lock(&s_statusMtx);
s_statusExit = true;
cnd_signal(&s_statusCdn);
mtx_unlock(&s_statusMtx);
thrd_join(s_statusThread, &res);
s_statusReady = 0;
mtx_destroy(&s_statusAccessMtx);
mtx_destroy(&s_statusMtx);
cnd_destroy(&s_statusCdn);
}

7
common/status.h Normal file
View File

@ -0,0 +1,7 @@
#pragma once
#include "common.h"
bool statusInit(void);
void statusExit(void);
bool statusGet(bool *netstatusFlag, AssetId *netstatusAssetId);

View File

@ -87,6 +87,11 @@ int main(int argc, char **argv)
snprintf(errormsg, sizeof(errormsg)-1, "Error: workerInit() failed."); snprintf(errormsg, sizeof(errormsg)-1, "Error: workerInit() failed.");
} }
if (R_SUCCEEDED(rc) && !statusInit()) {
rc = 1;
snprintf(errormsg, sizeof(errormsg)-1, "Error: statusInit() failed.");
}
if (R_SUCCEEDED(rc)) menuStartup(); if (R_SUCCEEDED(rc)) menuStartup();
if (R_SUCCEEDED(rc)) { if (R_SUCCEEDED(rc)) {
@ -175,6 +180,7 @@ int main(int argc, char **argv)
fontExit(); fontExit();
launchExit(); launchExit();
netloaderSignalExit(); netloaderSignalExit();
statusExit();
workerExit(); workerExit();
netloaderExit(); netloaderExit();
powerExit(); powerExit();

View File

@ -22,6 +22,7 @@ int main()
fontInitialize(); fontInitialize();
netloaderInit(); netloaderInit();
workerInit(); workerInit();
statusInit();
menuStartup(); menuStartup();
while (window.isOpen()) while (window.isOpen())
@ -56,6 +57,7 @@ int main()
} }
netloaderSignalExit(); netloaderSignalExit();
statusExit();
workerExit(); workerExit();
netloaderExit(); netloaderExit();
fontExit(); fontExit();