diff --git a/source/glest_game/menu/menu_state_masterserver.cpp b/source/glest_game/menu/menu_state_masterserver.cpp index 0ee11c274..b4dfd31f9 100644 --- a/source/glest_game/menu/menu_state_masterserver.cpp +++ b/source/glest_game/menu/menu_state_masterserver.cpp @@ -340,6 +340,9 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen GraphicComponent::applyAllCustomProperties(containerName); + + MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor); + masterServerThreadInDeletion = false; needUpdateFromServer = true; updateFromMasterserverThread = new SimpleTaskThread(this,0,100); updateFromMasterserverThread->setUniqueID(__FILE__); @@ -351,16 +354,25 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen MenuStateMasterserver::~MenuStateMasterserver() { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - if(updateFromMasterserverThread != NULL) { - MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - needUpdateFromServer = false; - safeMutex.ReleaseLock(); + if(masterServerThreadInDeletion == false) { + MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor); + if(updateFromMasterserverThread != NULL) { + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + needUpdateFromServer = false; + safeMutex.ReleaseLock(); - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - //BaseThread::shutdownAndWait(updateFromMasterserverThread); - delete updateFromMasterserverThread; - updateFromMasterserverThread = NULL; + //BaseThread::shutdownAndWait(updateFromMasterserverThread); + masterServerThreadInDeletion = true; + delete updateFromMasterserverThread; + updateFromMasterserverThread = NULL; + masterServerThreadInDeletion = false; + safeMutexPtr.ReleaseLock(); + } + else { + safeMutexPtr.ReleaseLock(); + } } SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -411,8 +423,12 @@ void MenuStateMasterserver::mouseClick(int x, int y, MouseButton mouseButton){ soundRenderer.playFx(coreData.getClickSoundB()); //BaseThread::shutdownAndWait(updateFromMasterserverThread); + MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor); + masterServerThreadInDeletion = true; delete updateFromMasterserverThread; updateFromMasterserverThread = NULL; + masterServerThreadInDeletion = false; + safeMutexPtr.ReleaseLock(); safeMutex.ReleaseLock(); @@ -433,8 +449,12 @@ void MenuStateMasterserver::mouseClick(int x, int y, MouseButton mouseButton){ SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); //BaseThread::shutdownAndWait(updateFromMasterserverThread); + MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor); + masterServerThreadInDeletion = true; delete updateFromMasterserverThread; updateFromMasterserverThread = NULL; + masterServerThreadInDeletion = false; + safeMutexPtr.ReleaseLock(); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -459,9 +479,13 @@ void MenuStateMasterserver::mouseClick(int x, int y, MouseButton mouseButton){ SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); safeMutex.ReleaseLock(); + MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor); + masterServerThreadInDeletion = true; BaseThread::shutdownAndWait(updateFromMasterserverThread); delete updateFromMasterserverThread; updateFromMasterserverThread = NULL; + masterServerThreadInDeletion = false; + safeMutexPtr.ReleaseLock(); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); mainMenu->setState(new MenuStateConnectedGame(program, mainMenu,jmMasterserver)); @@ -589,11 +613,18 @@ void MenuStateMasterserver::simpleTask() { void MenuStateMasterserver::updateServerInfo() { try { - if( updateFromMasterserverThread == NULL || - updateFromMasterserverThread->getQuitStatus() == true) { + if(masterServerThreadInDeletion == true) { return; } + MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor); + if( updateFromMasterserverThread == NULL || + updateFromMasterserverThread->getQuitStatus() == true) { + safeMutexPtr.ReleaseLock(); + return; + } + safeMutexPtr.ReleaseLock(true); + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); needUpdateFromServer = false; int numberOfOldServerLines=serverLines.size(); @@ -668,10 +699,14 @@ void MenuStateMasterserver::updateServerInfo() { sprintf(szBuf,"%s",masterServerInfo->getServerTitle().c_str()); masterServerInfo->setServerTitle(szBuf); - if( updateFromMasterserverThread == NULL || + safeMutexPtr.Lock(); + if( masterServerThreadInDeletion == true || + updateFromMasterserverThread == NULL || updateFromMasterserverThread->getQuitStatus() == true) { + safeMutexPtr.ReleaseLock(); return; } + safeMutexPtr.ReleaseLock(true); safeMutex.Lock(); serverLines.push_back(new ServerLine( masterServerInfo, i, containerName)); @@ -685,16 +720,19 @@ void MenuStateMasterserver::updateServerInfo() { } } + safeMutexPtr.Lock(); if( updateFromMasterserverThread == NULL || updateFromMasterserverThread->getQuitStatus() == true) { + safeMutexPtr.ReleaseLock(); return; } + safeMutexPtr.ReleaseLock(); safeMutex.Lock(); if(serverLines.size()>numberOfOldServerLines) { playServerFoundSound=true; } - safeMutex.ReleaseLock(true); + safeMutex.ReleaseLock(); } catch(const exception &e){ SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what()); diff --git a/source/glest_game/menu/menu_state_masterserver.h b/source/glest_game/menu/menu_state_masterserver.h index 40a032325..1f5abcf2a 100644 --- a/source/glest_game/menu/menu_state_masterserver.h +++ b/source/glest_game/menu/menu_state_masterserver.h @@ -65,8 +65,6 @@ public: }; - - // =============================== // class MenuStateMasterserver // =============================== @@ -108,8 +106,6 @@ private: GraphicLabel externalConnectPort; GraphicLabel selectButton; - - GraphicMessageBox mainMessageBox; int mainMessageBoxState; @@ -126,6 +122,8 @@ private: static DisplayMessageFunction pCB_DisplayMessage; std::string threadedErrorMsg; Mutex masterServerThreadAccessor; + Mutex masterServerThreadPtrChangeAccessor; + bool masterServerThreadInDeletion; public: MenuStateMasterserver(Program *program, MainMenu *mainMenu); diff --git a/source/shared_lib/include/graphics/gl/texture_gl.h b/source/shared_lib/include/graphics/gl/texture_gl.h index 10273ef67..7b7294e46 100644 --- a/source/shared_lib/include/graphics/gl/texture_gl.h +++ b/source/shared_lib/include/graphics/gl/texture_gl.h @@ -30,7 +30,7 @@ public: TextureGl(); GLuint getHandle() const {return handle;} - void OutputTextureDebugInfo(Texture::Format format, int components, const string path,uint64 rawSize); + void OutputTextureDebugInfo(Texture::Format format, int components, const string path,uint64 rawSize,GLenum texType); }; // ===================================================== diff --git a/source/shared_lib/sources/graphics/gl/texture_gl.cpp b/source/shared_lib/sources/graphics/gl/texture_gl.cpp index e10cfcaa5..24626017e 100644 --- a/source/shared_lib/sources/graphics/gl/texture_gl.cpp +++ b/source/shared_lib/sources/graphics/gl/texture_gl.cpp @@ -337,7 +337,10 @@ GLint toCompressionFormatGl(GLint format) { case GL_ALPHA: case GL_ALPHA8: + //return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + //return GL_COMPRESSED_ALPHA_ARB; return GL_COMPRESSED_ALPHA; + //return GL_COMPRESSED_RGBA; default: return format; } @@ -494,7 +497,7 @@ void Texture1DGl::init(Filter filter, int maxAnisotropy) { } } inited= true; - OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount()); + OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount(),GL_TEXTURE_1D); } assertGl(); @@ -591,7 +594,7 @@ void Texture2DGl::init(Filter filter, int maxAnisotropy) { } } inited= true; - OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount()); + OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount(),GL_TEXTURE_2D); } assertGl(); @@ -667,7 +670,7 @@ void Texture3DGl::init(Filter filter, int maxAnisotropy) { } inited= true; - OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount()); + OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount(),GL_TEXTURE_3D); } assertGl(); @@ -763,7 +766,7 @@ void TextureCubeGl::init(Filter filter, int maxAnisotropy) { throw runtime_error(szBuf); } - OutputTextureDebugInfo(format, currentPixmap->getComponents(),getPath(),currentPixmap->getPixelByteCount()); + OutputTextureDebugInfo(format, currentPixmap->getComponents(),getPath(),currentPixmap->getPixelByteCount(),target); } inited= true; @@ -785,21 +788,21 @@ void TextureCubeGl::end(bool deletePixelBuffer) { } } -void TextureGl::OutputTextureDebugInfo(Texture::Format format, int components,const string path,uint64 rawSize) { +void TextureGl::OutputTextureDebugInfo(Texture::Format format, int components,const string path,uint64 rawSize,GLenum texType) { if(Texture::useTextureCompression == true) { GLint glFormat= toFormatGl(format, components); printf("**** Texture filename: [%s] format = %d components = %d, glFormat = %d, rawSize = %llu\n",path.c_str(),format,components,glFormat,(long long unsigned int)rawSize); GLint compressed=0; - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED, &compressed); + glGetTexLevelParameteriv(texType, 0, GL_TEXTURE_COMPRESSED, &compressed); int error = glGetError(); printf("**** Texture compressed status: %d, error [%d]\n",compressed,error); bool isCompressed = (compressed == 1); compressed=0; - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compressed); + glGetTexLevelParameteriv(texType, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compressed); error = glGetError(); double percent = 0; @@ -810,7 +813,7 @@ void TextureGl::OutputTextureDebugInfo(Texture::Format format, int components,co printf("**** Texture image size in video RAM: %d [%.2f%%], error [%d]\n",compressed,percent,error); compressed=0; - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &compressed); + glGetTexLevelParameteriv(texType, 0, GL_TEXTURE_INTERNAL_FORMAT, &compressed); error = glGetError(); printf("**** Texture image compression format used: %d, error [%d]\n",compressed,error); }