- thread synch bugfix in Internet Lobby Menu (thanks tomreyn for the stack trace)

This commit is contained in:
Mark Vejvoda
2010-10-30 17:31:57 +00:00
parent dfedf2259b
commit d8c11ebe71
4 changed files with 64 additions and 25 deletions

View File

@@ -340,6 +340,9 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen
GraphicComponent::applyAllCustomProperties(containerName); GraphicComponent::applyAllCustomProperties(containerName);
MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor);
masterServerThreadInDeletion = false;
needUpdateFromServer = true; needUpdateFromServer = true;
updateFromMasterserverThread = new SimpleTaskThread(this,0,100); updateFromMasterserverThread = new SimpleTaskThread(this,0,100);
updateFromMasterserverThread->setUniqueID(__FILE__); updateFromMasterserverThread->setUniqueID(__FILE__);
@@ -351,6 +354,8 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen
MenuStateMasterserver::~MenuStateMasterserver() { MenuStateMasterserver::~MenuStateMasterserver() {
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__);
if(masterServerThreadInDeletion == false) {
MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor);
if(updateFromMasterserverThread != NULL) { if(updateFromMasterserverThread != NULL) {
MutexSafeWrapper safeMutex(&masterServerThreadAccessor); MutexSafeWrapper safeMutex(&masterServerThreadAccessor);
needUpdateFromServer = false; needUpdateFromServer = false;
@@ -359,8 +364,15 @@ MenuStateMasterserver::~MenuStateMasterserver() {
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); //BaseThread::shutdownAndWait(updateFromMasterserverThread);
masterServerThreadInDeletion = true;
delete updateFromMasterserverThread; delete updateFromMasterserverThread;
updateFromMasterserverThread = NULL; updateFromMasterserverThread = NULL;
masterServerThreadInDeletion = false;
safeMutexPtr.ReleaseLock();
}
else {
safeMutexPtr.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__);
@@ -411,8 +423,12 @@ void MenuStateMasterserver::mouseClick(int x, int y, MouseButton mouseButton){
soundRenderer.playFx(coreData.getClickSoundB()); soundRenderer.playFx(coreData.getClickSoundB());
//BaseThread::shutdownAndWait(updateFromMasterserverThread); //BaseThread::shutdownAndWait(updateFromMasterserverThread);
MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor);
masterServerThreadInDeletion = true;
delete updateFromMasterserverThread; delete updateFromMasterserverThread;
updateFromMasterserverThread = NULL; updateFromMasterserverThread = NULL;
masterServerThreadInDeletion = false;
safeMutexPtr.ReleaseLock();
safeMutex.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__); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
//BaseThread::shutdownAndWait(updateFromMasterserverThread); //BaseThread::shutdownAndWait(updateFromMasterserverThread);
MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor);
masterServerThreadInDeletion = true;
delete updateFromMasterserverThread; delete updateFromMasterserverThread;
updateFromMasterserverThread = NULL; updateFromMasterserverThread = NULL;
masterServerThreadInDeletion = false;
safeMutexPtr.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__);
@@ -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__); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
safeMutex.ReleaseLock(); safeMutex.ReleaseLock();
MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor);
masterServerThreadInDeletion = true;
BaseThread::shutdownAndWait(updateFromMasterserverThread); BaseThread::shutdownAndWait(updateFromMasterserverThread);
delete updateFromMasterserverThread; delete updateFromMasterserverThread;
updateFromMasterserverThread = NULL; updateFromMasterserverThread = NULL;
masterServerThreadInDeletion = false;
safeMutexPtr.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__);
mainMenu->setState(new MenuStateConnectedGame(program, mainMenu,jmMasterserver)); mainMenu->setState(new MenuStateConnectedGame(program, mainMenu,jmMasterserver));
@@ -589,11 +613,18 @@ void MenuStateMasterserver::simpleTask() {
void MenuStateMasterserver::updateServerInfo() { void MenuStateMasterserver::updateServerInfo() {
try { try {
if( updateFromMasterserverThread == NULL || if(masterServerThreadInDeletion == true) {
updateFromMasterserverThread->getQuitStatus() == true) {
return; return;
} }
MutexSafeWrapper safeMutexPtr(&masterServerThreadPtrChangeAccessor);
if( updateFromMasterserverThread == NULL ||
updateFromMasterserverThread->getQuitStatus() == true) {
safeMutexPtr.ReleaseLock();
return;
}
safeMutexPtr.ReleaseLock(true);
MutexSafeWrapper safeMutex(&masterServerThreadAccessor); MutexSafeWrapper safeMutex(&masterServerThreadAccessor);
needUpdateFromServer = false; needUpdateFromServer = false;
int numberOfOldServerLines=serverLines.size(); int numberOfOldServerLines=serverLines.size();
@@ -668,10 +699,14 @@ void MenuStateMasterserver::updateServerInfo() {
sprintf(szBuf,"%s",masterServerInfo->getServerTitle().c_str()); sprintf(szBuf,"%s",masterServerInfo->getServerTitle().c_str());
masterServerInfo->setServerTitle(szBuf); masterServerInfo->setServerTitle(szBuf);
if( updateFromMasterserverThread == NULL || safeMutexPtr.Lock();
if( masterServerThreadInDeletion == true ||
updateFromMasterserverThread == NULL ||
updateFromMasterserverThread->getQuitStatus() == true) { updateFromMasterserverThread->getQuitStatus() == true) {
safeMutexPtr.ReleaseLock();
return; return;
} }
safeMutexPtr.ReleaseLock(true);
safeMutex.Lock(); safeMutex.Lock();
serverLines.push_back(new ServerLine( masterServerInfo, i, containerName)); serverLines.push_back(new ServerLine( masterServerInfo, i, containerName));
@@ -685,16 +720,19 @@ void MenuStateMasterserver::updateServerInfo() {
} }
} }
safeMutexPtr.Lock();
if( updateFromMasterserverThread == NULL || if( updateFromMasterserverThread == NULL ||
updateFromMasterserverThread->getQuitStatus() == true) { updateFromMasterserverThread->getQuitStatus() == true) {
safeMutexPtr.ReleaseLock();
return; return;
} }
safeMutexPtr.ReleaseLock();
safeMutex.Lock(); safeMutex.Lock();
if(serverLines.size()>numberOfOldServerLines) { if(serverLines.size()>numberOfOldServerLines) {
playServerFoundSound=true; playServerFoundSound=true;
} }
safeMutex.ReleaseLock(true); safeMutex.ReleaseLock();
} }
catch(const exception &e){ catch(const exception &e){
SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what()); SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what());

View File

@@ -65,8 +65,6 @@ public:
}; };
// =============================== // ===============================
// class MenuStateMasterserver // class MenuStateMasterserver
// =============================== // ===============================
@@ -109,8 +107,6 @@ private:
GraphicLabel selectButton; GraphicLabel selectButton;
GraphicMessageBox mainMessageBox; GraphicMessageBox mainMessageBox;
int mainMessageBoxState; int mainMessageBoxState;
@@ -126,6 +122,8 @@ private:
static DisplayMessageFunction pCB_DisplayMessage; static DisplayMessageFunction pCB_DisplayMessage;
std::string threadedErrorMsg; std::string threadedErrorMsg;
Mutex masterServerThreadAccessor; Mutex masterServerThreadAccessor;
Mutex masterServerThreadPtrChangeAccessor;
bool masterServerThreadInDeletion;
public: public:
MenuStateMasterserver(Program *program, MainMenu *mainMenu); MenuStateMasterserver(Program *program, MainMenu *mainMenu);

View File

@@ -30,7 +30,7 @@ public:
TextureGl(); TextureGl();
GLuint getHandle() const {return handle;} 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);
}; };
// ===================================================== // =====================================================

View File

@@ -337,7 +337,10 @@ GLint toCompressionFormatGl(GLint format) {
case GL_ALPHA: case GL_ALPHA:
case GL_ALPHA8: case GL_ALPHA8:
//return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
//return GL_COMPRESSED_ALPHA_ARB;
return GL_COMPRESSED_ALPHA; return GL_COMPRESSED_ALPHA;
//return GL_COMPRESSED_RGBA;
default: default:
return format; return format;
} }
@@ -494,7 +497,7 @@ void Texture1DGl::init(Filter filter, int maxAnisotropy) {
} }
} }
inited= true; inited= true;
OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount()); OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount(),GL_TEXTURE_1D);
} }
assertGl(); assertGl();
@@ -591,7 +594,7 @@ void Texture2DGl::init(Filter filter, int maxAnisotropy) {
} }
} }
inited= true; inited= true;
OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount()); OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount(),GL_TEXTURE_2D);
} }
assertGl(); assertGl();
@@ -667,7 +670,7 @@ void Texture3DGl::init(Filter filter, int maxAnisotropy) {
} }
inited= true; inited= true;
OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount()); OutputTextureDebugInfo(format, pixmap.getComponents(),getPath(),pixmap.getPixelByteCount(),GL_TEXTURE_3D);
} }
assertGl(); assertGl();
@@ -763,7 +766,7 @@ void TextureCubeGl::init(Filter filter, int maxAnisotropy) {
throw runtime_error(szBuf); throw runtime_error(szBuf);
} }
OutputTextureDebugInfo(format, currentPixmap->getComponents(),getPath(),currentPixmap->getPixelByteCount()); OutputTextureDebugInfo(format, currentPixmap->getComponents(),getPath(),currentPixmap->getPixelByteCount(),target);
} }
inited= true; 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) { if(Texture::useTextureCompression == true) {
GLint glFormat= toFormatGl(format, components); 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); 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; GLint compressed=0;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED, &compressed); glGetTexLevelParameteriv(texType, 0, GL_TEXTURE_COMPRESSED, &compressed);
int error = glGetError(); int error = glGetError();
printf("**** Texture compressed status: %d, error [%d]\n",compressed,error); printf("**** Texture compressed status: %d, error [%d]\n",compressed,error);
bool isCompressed = (compressed == 1); bool isCompressed = (compressed == 1);
compressed=0; compressed=0;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compressed); glGetTexLevelParameteriv(texType, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compressed);
error = glGetError(); error = glGetError();
double percent = 0; 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); printf("**** Texture image size in video RAM: %d [%.2f%%], error [%d]\n",compressed,percent,error);
compressed=0; compressed=0;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &compressed); glGetTexLevelParameteriv(texType, 0, GL_TEXTURE_INTERNAL_FORMAT, &compressed);
error = glGetError(); error = glGetError();
printf("**** Texture image compression format used: %d, error [%d]\n",compressed,error); printf("**** Texture image compression format used: %d, error [%d]\n",compressed,error);
} }