diff --git a/source/glest_game/main/main.cpp b/source/glest_game/main/main.cpp index 2f5e76b5b..3aa277331 100644 --- a/source/glest_game/main/main.cpp +++ b/source/glest_game/main/main.cpp @@ -205,37 +205,68 @@ static void cleanupProcessObjects() { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#2 IRCCLient Cache SHUTDOWN\n"); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); + //printf("Closing IRC CLient %d\n",__LINE__); + ircClient->disconnect(); + ircClient = NULL; + +/* ircClient->setCallbackObj(NULL); //printf("In main IRCThreadcheck [%p] signalled quit...\n",ircClient); + printf("Closing IRC CLient %d\n",__LINE__); ircClient->signalQuit(); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); + + ircClient->disconnect(); ircClient = NULL; + printf("Closing IRC CLient %d\n",__LINE__); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#3 IRCCLient Cache SHUTDOWN\n"); +*/ } if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#4 IRCCLient Cache SHUTDOWN\n"); + //printf("Closing IRC CLient %d\n",__LINE__); + cleanupCRCThread(); //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + //printf("Closing IRC CLient %d\n",__LINE__); if(Renderer::isEnded() == false) { Renderer::getInstance().end(); CoreData &coreData= CoreData::getInstance(); coreData.cleanup(); } + //printf("Closing IRC CLient %d\n",__LINE__); + if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); SystemFlags::Close(); SystemFlags::SHUTDOWN_PROGRAM_MODE=true; + //printf("Closing IRC CLient %d\n",__LINE__); + if(SystemFlags::VERBOSE_MODE_ENABLED) printf("start running threads = " MG_SIZE_T_SPECIFIER "\n",Thread::getThreadList().size()); time_t elapsed = time(NULL); + int lastLazyThreadDump = 0; for(;Thread::getThreadList().size() > 0 && difftime((long int)time(NULL),elapsed) <= 10;) { //sleep(0); + if(difftime((long int)time(NULL),elapsed) > 1) { + if(lastLazyThreadDump != (int)difftime((long int)time(NULL),elapsed)) { + lastLazyThreadDump = difftime((long int)time(NULL),elapsed); + + std::vector threadList = Thread::getThreadList(); + printf("Waiting for the following threads to exit [" MG_SIZE_T_SPECIFIER "]:\n",threadList.size()); + + for(int i = 0; i < threadList.size(); ++i) { + BaseThread *baseThread = dynamic_cast(threadList[i]); + printf("Thread index: %d isBaseThread: %d, Name: [%s]\n",i,(baseThread != NULL),baseThread->getUniqueID().c_str()); + } + } + } } if(SystemFlags::VERBOSE_MODE_ENABLED) printf("end running threads = " MG_SIZE_T_SPECIFIER "\n",Thread::getThreadList().size()); @@ -256,11 +287,18 @@ static void cleanupProcessObjects() { XmlIo::getInstance().cleanup(); + //printf("Closing IRC CLient %d\n",__LINE__); + if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); SystemFlags::globalCleanupHTTP(); + + //printf("Closing IRC CLient %d\n",__LINE__); + CacheManager::cleanupMutexes(); + + //printf("Closing IRC CLient %d\n",__LINE__); } #if defined(WIN32) && !defined(_DEBUG) && !defined(__GNUC__) @@ -5155,6 +5193,8 @@ int glestMain(int argc, char** argv) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + //printf("Closing IRC CLient %d\n",__LINE__); + delete mainWindow; mainWindow = NULL; @@ -5170,6 +5210,8 @@ int glestMain(int argc, char** argv) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + //printf("Closing IRC CLient %d\n",__LINE__); + if(soundThreadManager) { SoundRenderer &soundRenderer= SoundRenderer::getInstance(); if( Config::getInstance().getString("FactorySound","") != "None" && @@ -5185,6 +5227,8 @@ int glestMain(int argc, char** argv) { soundThreadManager = NULL; } + //printf("Closing IRC CLient %d\n",__LINE__); + return 0; } diff --git a/source/glest_game/menu/menu_state_masterserver.cpp b/source/glest_game/menu/menu_state_masterserver.cpp index 010dcd39f..1152c403b 100644 --- a/source/glest_game/menu/menu_state_masterserver.cpp +++ b/source/glest_game/menu/menu_state_masterserver.cpp @@ -323,9 +323,11 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen if(ircThread == NULL) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#2 IRCCLient Cache check\n"); + + static string mutexOwnerId = string(extractFileFromDirectoryPath(__FILE__).c_str()) + string("_") + intToStr(__LINE__); ircThread = new IRCThread(ircArgs,this); ircClient = ircThread; - ircClient->setUniqueID(extractFileFromDirectoryPath(__FILE__).c_str()); + ircClient->setUniqueID(mutexOwnerId); ircClient->setPlayerName(netPlayerName); ircClient->start(); } diff --git a/source/shared_lib/include/platform/posix/ircclient.h b/source/shared_lib/include/platform/posix/ircclient.h index abc28064f..99a5eb3c8 100644 --- a/source/shared_lib/include/platform/posix/ircclient.h +++ b/source/shared_lib/include/platform/posix/ircclient.h @@ -128,6 +128,7 @@ public: void joinChannel(); void leaveChannel(); void connectToHost(); + void disconnect(); }; }}//end namespace diff --git a/source/shared_lib/sources/platform/posix/ircclient.cpp b/source/shared_lib/sources/platform/posix/ircclient.cpp index 559e1884f..8c4bc7d98 100644 --- a/source/shared_lib/sources/platform/posix/ircclient.cpp +++ b/source/shared_lib/sources/platform/posix/ircclient.cpp @@ -473,6 +473,22 @@ IRCThread::IRCThread(const std::vector &argv, IRCCallbackInterface *call playerName = ""; } +void IRCThread::disconnect() { +#if !defined(DISABLE_IRCCLIENT) + if(ircSession != NULL) { + setCallbackObj(NULL); + if(SystemFlags::VERBOSE_MODE_ENABLED || IRCThread::debugEnabled) printf ("===> IRC: Quitting Channel\n"); + + irc_disconnect(ircSession); + + BaseThread::signalQuit(); + hasJoinedChannel = false; + } +#else + BaseThread::signalQuit(); +#endif +} + void IRCThread::signalQuit() { if(SystemFlags::VERBOSE_MODE_ENABLED || IRCThread::debugEnabled) printf ("===> IRC: signalQuit [%p]\n",ircSession);