diff --git a/source/fileop.cpp b/source/fileop.cpp index 7f0dca2..865ae9c 100644 --- a/source/fileop.cpp +++ b/source/fileop.cpp @@ -88,11 +88,6 @@ HaltDeviceThread() #ifdef HW_RVL deviceHalt = true; - #ifdef HW_RVL - if(inNetworkInit) // don't wait for network to initialize - return; - #endif - // wait for thread to finish while(!LWP_ThreadIsSuspended(devicethread)) usleep(THREAD_SLEEP); @@ -121,19 +116,11 @@ HaltParseThread() * initializes the network in the background ***************************************************************************/ #ifdef HW_RVL -static int devsleep = 1*1000*1000; +static int devsleep; static void * devicecallback (void *arg) { - while(devsleep > 0) - { - if(deviceHalt) - LWP_SuspendThread(devicethread); - usleep(THREAD_SLEEP); - devsleep -= THREAD_SLEEP; - } - while (1) { if(isMounted[DEVICE_SD]) @@ -154,9 +141,6 @@ devicecallback (void *arg) } } - UpdateCheck(); - InitializeNetwork(SILENT); - if(isMounted[DEVICE_DVD]) { if(!dvd->isInserted()) // check if the device was removed @@ -175,6 +159,7 @@ devicecallback (void *arg) usleep(THREAD_SLEEP); devsleep -= THREAD_SLEEP; } + UpdateCheck(); } return NULL; } @@ -767,7 +752,7 @@ LoadFile (char * rbuffer, char *filepath, size_t length, bool silent) HaltParseThread(); // open the file - while(!size && retry) + while(retry) { if(!ChangeInterface(device, silent)) break; @@ -795,6 +780,7 @@ LoadFile (char * rbuffer, char *filepath, size_t length, bool silent) { unmountRequired[device] = true; retry = ErrorPromptRetry("Error reading file!"); + fclose (file); continue; } @@ -822,6 +808,7 @@ LoadFile (char * rbuffer, char *filepath, size_t length, bool silent) CancelAction(); } } + retry = 0; fclose (file); } diff --git a/source/networkop.cpp b/source/networkop.cpp index c0573ab..953a618 100644 --- a/source/networkop.cpp +++ b/source/networkop.cpp @@ -19,9 +19,10 @@ ConnectShare (bool silent) #else #include +#include +#include #include #include -#include #include "snes9xgx.h" #include "menu.h" @@ -31,10 +32,10 @@ ConnectShare (bool silent) #include "utils/unzip/unzip.h" #include "utils/unzip/miniunz.h" -bool inNetworkInit = false; +static int netHalt = 0; static bool networkInit = false; -static bool autoNetworkInit = true; static bool networkShareInit = false; +char wiiIP[16] = { 0 }; static bool updateChecked = false; // true if checked for app update static char updateURL[128]; // URL of app update bool updateFound = false; // true if an app update was found @@ -179,49 +180,124 @@ bool DownloadUpdate() * Initializes the Wii/GameCube network interface ***************************************************************************/ -void InitializeNetwork(bool silent) +static lwp_t networkthread = LWP_THREAD_NULL; +static u8 netstack[8192] ATTRIBUTE_ALIGN (32); + +static void * netcb (void *arg) { - // stop if we're already initialized, or if auto-init has failed before - // in which case, manual initialization is required - if(networkInit || (silent && !autoNetworkInit)) - return; + s32 res = 0; + int retry; - int retry = 1; - char ip[16]; - s32 initResult; - - if(!silent) - ShowAction ("Initializing network..."); - - while(inNetworkInit) // a network init is already in progress! - usleep(50); - - if(!networkInit) // check again if the network was inited + while(netHalt != 2) { - inNetworkInit = true; + retry = 30; - while(retry) + while (retry) { - if(!silent) - ShowAction ("Initializing network..."); + if (net_init_async(NULL, NULL) != 0) + break; // failed - initResult = if_config(ip, NULL, NULL, true); + res = net_get_status(); + while (res == -EBUSY) + { + usleep(20000); + res = net_get_status(); + } - if(initResult == 0) - networkInit = true; - - if(networkInit || silent) + if (res != -EAGAIN && res != -ETIMEDOUT) break; - retry = ErrorPromptRetry("Unable to initialize network!"); + retry--; + usleep(2000); + continue; } - // do not automatically attempt a reconnection - autoNetworkInit = false; - inNetworkInit = false; + if (res >= 0) + { + networkInit = true; + + struct in_addr hostip; + hostip.s_addr = net_gethostip(); + if (hostip.s_addr) + strcpy(wiiIP, inet_ntoa(hostip)); + } + + LWP_SuspendThread(networkthread); } - if(!silent) + return NULL; +} + +/**************************************************************************** + * StartNetworkThread + * + * Signals the network thread to resume, or creates a new thread + ***************************************************************************/ +void StartNetworkThread() +{ + netHalt = 0; + + if(networkthread == LWP_THREAD_NULL) + LWP_CreateThread(&networkthread, netcb, NULL, netstack, 8192, 40); + else + LWP_ResumeThread(networkthread); +} + +/**************************************************************************** + * StopNetworkThread + * + * Signals the network thread to stop + ***************************************************************************/ +void StopNetworkThread() +{ + if(networkthread == LWP_THREAD_NULL) + return; + + netHalt = 2; + + if(LWP_ThreadIsSuspended(networkthread)) + LWP_ResumeThread(networkthread); + + // wait for thread to finish + LWP_JoinThread(networkthread, NULL); + networkthread = LWP_THREAD_NULL; +} + +bool InitializeNetwork(bool silent) +{ + if(networkInit) + { + StopNetworkThread(); + return true; + } + + if(silent) + return false; + + int retry = 1; + + while(retry) + { + u64 start = gettime(); + + ShowAction("Initializing network..."); + StartNetworkThread(); + + while (!LWP_ThreadIsSuspended(networkthread)) + { + usleep(50 * 1000); + + if(diff_sec(start, gettime()) > 10) // wait for 10 seconds max for net init + break; + } + CancelAction(); + + if(networkInit) + break; + + retry = ErrorPromptRetry("Unable to initialize network!"); + } + return networkInit; } void CloseShare() @@ -244,6 +320,9 @@ ConnectShare (bool silent) return false; #endif + if(!InitializeNetwork(silent)) + return false; + if(networkShareInit) return true; @@ -271,12 +350,6 @@ ConnectShare (bool silent) return false; } - if(!networkInit) - InitializeNetwork(silent); - - if(!networkInit) - return false; - while(retry) { if(!silent) diff --git a/source/networkop.h b/source/networkop.h index a7eba36..3720c23 100644 --- a/source/networkop.h +++ b/source/networkop.h @@ -13,11 +13,11 @@ void UpdateCheck(); bool DownloadUpdate(); -void InitializeNetwork(bool silent); +void StartNetworkThread(); +bool InitializeNetwork(bool silent); bool ConnectShare (bool silent); void CloseShare(); extern bool updateFound; -extern bool inNetworkInit; #endif diff --git a/source/snes9xgx.cpp b/source/snes9xgx.cpp index fb2c6f4..5aad801 100644 --- a/source/snes9xgx.cpp +++ b/source/snes9xgx.cpp @@ -149,13 +149,11 @@ void ExitApp() #ifdef HW_RVL void ShutdownCB() { - if(!inNetworkInit) - ShutdownRequested = 1; + ShutdownRequested = 1; } void ResetCB() { - if(!inNetworkInit) - ResetRequested = 1; + ResetRequested = 1; } #endif @@ -346,6 +344,7 @@ main(int argc, char *argv[]) if(version != 58 && preferred > 0 && version != (u32)preferred && __di_check_ahbprot() != 1) IOS_ReloadIOS(preferred); + StartNetworkThread(); DI_Init(); #endif