diff --git a/source/ngc/fileop.cpp b/source/ngc/fileop.cpp index 8527839..bbf95fb 100644 --- a/source/ngc/fileop.cpp +++ b/source/ngc/fileop.cpp @@ -32,7 +32,8 @@ #include "menu.h" #include "filebrowser.h" -unsigned char * savebuffer = NULL; +unsigned char savebuffer[SAVEBUFFERSIZE] ATTRIBUTE_ALIGN(32); +static mutex_t bufferLock = LWP_MUTEX_NULL; FILE * file; // file pointer - the only one we should ever use! bool unmountRequired[9] = { false, false, false, false, false, false, false, false, false }; bool isMounted[9] = { false, false, false, false, false, false, false, false, false }; @@ -416,10 +417,11 @@ ParseDirectory(int method) void AllocSaveBuffer () { - while(savebuffer != NULL) // save buffer is in use - usleep(50); // wait for it to be free + if(bufferLock == LWP_MUTEX_NULL) + LWP_MutexInit(&bufferLock, false); - savebuffer = (unsigned char *) memalign(32, SAVEBUFFERSIZE); + if(bufferLock != LWP_MUTEX_NULL) + LWP_MutexLock(bufferLock); memset (savebuffer, 0, SAVEBUFFERSIZE); } @@ -430,10 +432,8 @@ AllocSaveBuffer () void FreeSaveBuffer () { - if (savebuffer != NULL) - free(savebuffer); - - savebuffer = NULL; + if(bufferLock != LWP_MUTEX_NULL) + LWP_MutexUnlock(bufferLock); } /**************************************************************************** diff --git a/source/ngc/fileop.h b/source/ngc/fileop.h index 5b6bb30..bf29c73 100644 --- a/source/ngc/fileop.h +++ b/source/ngc/fileop.h @@ -36,7 +36,7 @@ u32 LoadSzFile(char * filepath, unsigned char * rbuffer); u32 SaveFile(char * buffer, char *filepath, u32 datasize, int method, bool silent); u32 SaveFile(char * filepath, u32 datasize, int method, bool silent); -extern unsigned char * savebuffer; +extern unsigned char savebuffer[]; extern FILE * file; extern bool unmountRequired[]; extern bool isMounted[];