Moved netloader to the worker thread. Minor improvements.

This commit is contained in:
yellows8 2018-10-20 11:06:53 -04:00
parent 59e2d7a306
commit 45a10488b1
6 changed files with 129 additions and 24 deletions

View File

@ -62,6 +62,7 @@ typedef union {
#include "theme.h"
#include "message-box.h"
#include "power.h"
#include "netloader.h"
void menuStartupPath(void);
void menuStartup(void);

View File

@ -43,13 +43,12 @@ static enum
void launchMenuNetloaderTask() {
if(hbmenu_state == HBMENU_DEFAULT)
if(netloader_activate() == 0) hbmenu_state = HBMENU_NETLOADER_ACTIVE;
workerSchedule(netloaderTask, NULL);
}
void launchMenuBackTask() {
if(hbmenu_state == HBMENU_NETLOADER_ACTIVE) {
netloader_deactivate();
hbmenu_state = HBMENU_DEFAULT;
netloaderSignalExit();
}
else if(hbmenu_state == HBMENU_THEME_MENU) {
hbmenu_state = HBMENU_DEFAULT;
@ -496,10 +495,13 @@ void drawButtons(menu_s* menu, bool emptyDir, int *x_image_out) {
void menuLoop(void) {
menuEntry_s* me;
menuEntry_s* netloader_me = NULL;
menu_s* menu = menuGetCurrent();
int i;
int x, y;
int menupath_x_endpos = 918 + 40;
bool netloader_activated = 0, netloader_launch_app = 0;
char netloader_errormsg[1024];
for (y=0; y<450; y++) {
for (x=0; x<1280; x+=4) {// don't draw bottom pixels as they are covered by the waves
@ -531,19 +533,23 @@ void menuLoop(void) {
drawTime();
drawCharge();
netloaderGetState(&netloader_activated, &netloader_launch_app, &netloader_me, netloader_errormsg, sizeof(netloader_errormsg));
if(hbmenu_state == HBMENU_DEFAULT && netloader_activated) {
hbmenu_state = HBMENU_NETLOADER_ACTIVE;
} else if(hbmenu_state == HBMENU_NETLOADER_ACTIVE && !netloader_activated && !netloader_launch_app) {
hbmenu_state = HBMENU_DEFAULT;
}
if (netloader_errormsg[0]) menuCreateMsgBox(780,300, netloader_errormsg);
if (menu->nEntries==0 || hbmenu_state == HBMENU_NETLOADER_ACTIVE)
{
if (hbmenu_state == HBMENU_NETLOADER_ACTIVE) {
menuEntry_s me;
menuEntryInit(&me,ENTRY_TYPE_FILE);
int netloader_result = netloader_loop(&me);
if( netloader_result != 0) {
if (netloader_launch_app) {
hbmenu_state = HBMENU_DEFAULT;
if (netloader_result == 1) {
menuCreateMsgBox(240,240, textGetString(StrId_Loading));
launchMenuEntryTask(&me);
}
menuCreateMsgBox(240,240, textGetString(StrId_Loading));
launchMenuEntryTask(netloader_me);
}
} else {
DrawText(interuiregular14, 64, 128 + 18, themeCurrent.textColor, textGetString(StrId_NoAppsFound_Msg));

View File

@ -40,20 +40,22 @@ static int netloader_datafd = -1;
#if PING_ENABLED
static int netloader_udpfd = -1;
#endif
unsigned char in[ZLIB_CHUNK];
unsigned char out[ZLIB_CHUNK];
static unsigned char in[ZLIB_CHUNK];
static unsigned char out[ZLIB_CHUNK];
static mtx_t netloader_mtx;
static bool netloader_initialized = 0;
static bool netloader_exitflag = 0;
static bool netloader_activated = 0, netloader_launchapp = 0;
static menuEntry_s netloader_me;
static char netloader_errortext[1024];
//---------------------------------------------------------------------------------
static void netloader_error(const char *func, int err) {
//---------------------------------------------------------------------------------
char errortext[1024];
memset(errortext, 0, sizeof(errortext));
snprintf(errortext, sizeof(errortext)-1, "%s: err=%d\n %s\n", func, err, strerror(errno));
menuCreateMsgBox(780,300, errortext);
netloader_deactivate();
memset(netloader_errortext, 0, sizeof(netloader_errortext));
snprintf(netloader_errortext, sizeof(netloader_errortext)-1, "%s: err=%d\n %s\n", func, err, strerror(errno));
}
//---------------------------------------------------------------------------------
@ -558,7 +560,6 @@ int netloader_loop(menuEntry_s *me) {
if(netloader_datafd >= 0)
{
int result = loadnro(me, netloader_datafd,sa_remote.sin_addr);
netloader_deactivate();
if (result== 0) {
return 1;
} else {
@ -568,3 +569,84 @@ int netloader_loop(menuEntry_s *me) {
return 0;
}
void netloaderGetState(bool *activated, bool *launch_app, menuEntry_s **me, char *errormsg, size_t errormsg_size) {
mtx_lock(&netloader_mtx);
*activated = netloader_activated;
*launch_app = netloader_launchapp;
*me = &netloader_me;
memset(errormsg, 0, errormsg_size);
if(netloader_errortext[0]) {
strncpy(errormsg, netloader_errortext, errormsg_size-1);
memset(netloader_errortext, 0, sizeof(netloader_errortext));
}
mtx_unlock(&netloader_mtx);
}
static bool netloaderGetExit(void) {
bool flag;
mtx_lock(&netloader_mtx);
flag = netloader_exitflag;
mtx_unlock(&netloader_mtx);
return flag;
}
void netloaderSignalExit(void) {
mtx_lock(&netloader_mtx);
netloader_exitflag = 1;
mtx_unlock(&netloader_mtx);
}
bool netloaderInit(void)
{
if (netloader_initialized) return 1;
if (mtx_init(&netloader_mtx, mtx_plain) != thrd_success) return 0;
netloader_initialized = 1;
return 1;
}
void netloaderExit(void)
{
if (!netloader_initialized) return;
netloader_initialized = 0;
mtx_destroy(&netloader_mtx);
}
//---------------------------------------------------------------------------------
void netloaderTask(void* arg) {
//---------------------------------------------------------------------------------
int ret=0;
menuEntryInit(&netloader_me,ENTRY_TYPE_FILE);
mtx_lock(&netloader_mtx);
netloader_exitflag = 0;
netloader_activated = 0;
netloader_launchapp = 0;
mtx_unlock(&netloader_mtx);
if(netloader_activate() == 0) {
mtx_lock(&netloader_mtx);
netloader_activated = 1;
mtx_unlock(&netloader_mtx);
}
else {
netloader_deactivate();
return;
}
while((ret = netloader_loop(&netloader_me)) == 0 && !netloaderGetExit());
netloader_deactivate();
mtx_lock(&netloader_mtx);
netloader_exitflag = 0;
netloader_activated = 0;
if (ret==1) netloader_launchapp = 1;
mtx_unlock(&netloader_mtx);
}

View File

@ -2,4 +2,12 @@
int netloader_activate(void);
int netloader_deactivate(void);
int netloader_loop( menuEntry_s *me);
int netloader_loop(menuEntry_s *me);
bool netloaderInit(void);
void netloaderExit(void);
void netloaderTask(void* arg);
void netloaderGetState(bool *activated, bool *launch_app, menuEntry_s **me, char *errormsg, size_t errormsg_size);
void netloaderSignalExit(void);

View File

@ -83,6 +83,11 @@ int main(int argc, char **argv)
snprintf(errormsg, sizeof(errormsg)-1, "Error: fontInitialize() failed.");
}
if (R_SUCCEEDED(rc) && !netloaderInit()) {
rc = 4;
snprintf(errormsg, sizeof(errormsg)-1, "Error: netloaderInit() failed.");
}
#ifdef ENABLE_AUDIO
if (R_SUCCEEDED(rc)) audio_initialize();
#endif
@ -164,6 +169,7 @@ int main(int argc, char **argv)
audio_exit();
#endif
netloaderExit();
fontExit();
launchExit();
workerExit();

View File

@ -21,6 +21,7 @@ int main()
fontInitialize();
workerInit();
menuStartup();
netloaderInit();
while (window.isOpen())
{
@ -53,6 +54,7 @@ int main()
window.display();
}
netloaderExit();
workerExit();
fontExit();