Added more safety guards for mastermenu if we get exceptions thrown within the thread, now it won't crash the game

This commit is contained in:
Mark Vejvoda
2010-05-16 03:31:12 +00:00
parent 74f39293a8
commit 3ba034b8bf
4 changed files with 27 additions and 3 deletions

View File

@@ -30,6 +30,7 @@
#include <memory> #include <memory>
#include "font.h" #include "font.h"
#include <curl/curl.h> #include <curl/curl.h>
#include "menu_state_masterserver.h"
#include "leak_dumper.h" #include "leak_dumper.h"
@@ -327,6 +328,7 @@ int glestMain(int argc, char** argv){
SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled); SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled);
NetworkInterface::setDisplayMessageFunction(ExceptionHandler::DisplayMessage); NetworkInterface::setDisplayMessageFunction(ExceptionHandler::DisplayMessage);
MenuStateMasterserver::setDisplayMessageFunction(ExceptionHandler::DisplayMessage);
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__);

View File

@@ -30,6 +30,8 @@
namespace Glest{ namespace Game{ namespace Glest{ namespace Game{
DisplayMessageFunction MenuStateMasterserver::pCB_DisplayMessage = NULL;
// ===================================================== // =====================================================
// class ServerLine // class ServerLine
// ===================================================== // =====================================================
@@ -267,10 +269,23 @@ void MenuStateMasterserver::render(){
} }
void MenuStateMasterserver::update(){ void MenuStateMasterserver::update(){
if(autoRefreshTime!=0 && difftime(time(NULL),lastRefreshTimer) >= autoRefreshTime ){ if(autoRefreshTime!=0 && difftime(time(NULL),lastRefreshTimer) >= autoRefreshTime ) {
needUpdateFromServer = true; needUpdateFromServer = true;
lastRefreshTimer= time(NULL); lastRefreshTimer= time(NULL);
} }
if(threadedErrorMsg != "") {
std::string sError = threadedErrorMsg;
threadedErrorMsg = "";
if(pCB_DisplayMessage != NULL) {
pCB_DisplayMessage(sError.c_str(),false);
}
else {
throw runtime_error(sError.c_str());
}
}
} }
void MenuStateMasterserver::simpleTask() { void MenuStateMasterserver::simpleTask() {
@@ -285,6 +300,7 @@ void MenuStateMasterserver::updateServerInfo() {
//MasterServerInfos masterServerInfos; //MasterServerInfos masterServerInfos;
clearServerLines(); clearServerLines();
//throw runtime_error("test");
if(Config::getInstance().getString("Masterserver","") != "") { if(Config::getInstance().getString("Masterserver","") != "") {
std::string serverInfo = SystemFlags::getHTTP(Config::getInstance().getString("Masterserver")+"showServersForGlest.php"); std::string serverInfo = SystemFlags::getHTTP(Config::getInstance().getString("Masterserver")+"showServersForGlest.php");
@@ -325,7 +341,7 @@ void MenuStateMasterserver::updateServerInfo() {
catch(const exception &e){ catch(const exception &e){
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] Line: %d, error [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what()); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] Line: %d, error [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what());
throw runtime_error(e.what()); threadedErrorMsg = e.what();
} }
} }

View File

@@ -15,6 +15,7 @@
#include "main_menu.h" #include "main_menu.h"
#include "masterserver_info.h" #include "masterserver_info.h"
#include "simple_threads.h" #include "simple_threads.h"
#include "network_interface.h"
namespace Glest{ namespace Game{ namespace Glest{ namespace Game{
@@ -82,6 +83,9 @@ private:
time_t lastRefreshTimer; time_t lastRefreshTimer;
SimpleTaskThread *updateFromMasterserverThread; SimpleTaskThread *updateFromMasterserverThread;
static DisplayMessageFunction pCB_DisplayMessage;
std::string threadedErrorMsg;
public: public:
MenuStateMasterserver(Program *program, MainMenu *mainMenu); MenuStateMasterserver(Program *program, MainMenu *mainMenu);
virtual ~MenuStateMasterserver(); virtual ~MenuStateMasterserver();
@@ -93,6 +97,8 @@ public:
virtual void simpleTask(); virtual void simpleTask();
static void setDisplayMessageFunction(DisplayMessageFunction pDisplayMessage) { pCB_DisplayMessage = pDisplayMessage; }
private: private:
void showMessageBox(const string &text, const string &header, bool toggle); void showMessageBox(const string &text, const string &header, bool toggle);
void connectToServer(string ipString); void connectToServer(string ipString);

View File

@@ -99,7 +99,7 @@ std::string SystemFlags::getHTTP(std::string URL) {
/* get contents from the URL */ /* get contents from the URL */
curl_easy_perform(SystemFlags::curl_handle); curl_easy_perform(SystemFlags::curl_handle);
std::string serverResponse = chunk.memory; std::string serverResponse = (chunk.memory != NULL ? chunk.memory : "");
if(chunk.memory) { if(chunk.memory) {
free(chunk.memory); free(chunk.memory);
} }