- bugfix for segfault in menu when exiting too fast

This commit is contained in:
Mark Vejvoda 2012-03-05 22:53:03 +00:00
parent 7399d10247
commit 623623d33f
5 changed files with 61 additions and 17 deletions

View File

@ -856,6 +856,16 @@ void MenuStateCustomGame::cleanup() {
delete publishToMasterserverThread;
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
}
else {
char szBuf[4096]="";
sprintf(szBuf,"In [%s::%s %d] Error cannot shutdown publishToMasterserverThread\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
//SystemFlags::OutputDebug(SystemFlags::debugError,szBuf);
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("%s",szBuf);
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s",szBuf);
publishToMasterserverThread->setOverrideShutdownTask(shutdownTaskStatic);
//publishToMasterserverThread->cleanup();
}
publishToMasterserverThread = NULL;
}
else {
@ -865,6 +875,16 @@ void MenuStateCustomGame::cleanup() {
publishToMasterserverThread->shutdownAndWait() == true) {
delete publishToMasterserverThread;
}
else {
char szBuf[4096]="";
sprintf(szBuf,"In [%s::%s %d] Error cannot shutdown publishToMasterserverThread\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
//SystemFlags::OutputDebug(SystemFlags::debugError,szBuf);
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("%s",szBuf);
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s",szBuf);
publishToMasterserverThread->setOverrideShutdownTask(shutdownTaskStatic);
//publishToMasterserverThread->cleanup();
}
}
publishToMasterserverThread = NULL;
@ -897,15 +917,6 @@ void MenuStateCustomGame::returnToParentMenu() {
needToRepublishToMasterserver = false;
lastNetworkPing = time(NULL);
ParentMenuState parentMenuState = this->parentMenuState;
/*
if(publishToMasterserverThread != NULL &&
publishToMasterserverThread->canShutdown() == true &&
publishToMasterserverThread->shutdownAndWait() == true) {
publishToMasterserverThread->setThreadOwnerValid(false);
delete publishToMasterserverThread;
publishToMasterserverThread = NULL;
}
*/
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
@ -2567,10 +2578,18 @@ void MenuStateCustomGame::publishToMasterserver() {
}
void MenuStateCustomGame::setupTask(BaseThread *callingThread) {
MenuStateCustomGame::setupTaskStatic(callingThread);
}
void MenuStateCustomGame::shutdownTask(BaseThread *callingThread) {
MenuStateCustomGame::shutdownTaskStatic(callingThread);
}
void MenuStateCustomGame::setupTaskStatic(BaseThread *callingThread) {
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
CURL *handle = SystemFlags::initHTTP();
callingThread->setGenericData<CURL>(handle);
}
void MenuStateCustomGame::shutdownTask(BaseThread *callingThread) {
void MenuStateCustomGame::shutdownTaskStatic(BaseThread *callingThread) {
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
CURL *handle = callingThread->getGenericData<CURL>();
SystemFlags::cleanupHTTP(&handle);
}

View File

@ -211,6 +211,8 @@ public:
virtual void simpleTask(BaseThread *callingThread);
virtual void setupTask(BaseThread *callingThread);
virtual void shutdownTask(BaseThread *callingThread);
static void setupTaskStatic(BaseThread *callingThread);
static void shutdownTaskStatic(BaseThread *callingThread);
virtual bool isInSpecialKeyCaptureEvent();
virtual bool isMasterserverMode() const;

View File

@ -62,7 +62,7 @@ public:
// =====================================================
// class SimpleTaskThread
// =====================================================
typedef void taskFunctionCallback(BaseThread *callingThread);
//
// This interface describes the methods a callback object must implement
//
@ -70,8 +70,8 @@ class SimpleTaskCallbackInterface {
public:
virtual void simpleTask(BaseThread *callingThread) = 0;
virtual void setupTask(BaseThread *callingThread) {}
virtual void shutdownTask(BaseThread *callingThread) {}
virtual void setupTask(BaseThread *callingThread) { }
virtual void shutdownTask(BaseThread *callingThread) { }
};
class SimpleTaskThread : public BaseThread
@ -89,6 +89,8 @@ protected:
Mutex mutexLastExecuteTimestamp;
time_t lastExecuteTimestamp;
taskFunctionCallback *overrideShutdownTask;
public:
SimpleTaskThread(SimpleTaskCallbackInterface *simpleTaskInterface,
unsigned int executionCount=0,
@ -103,6 +105,10 @@ public:
bool getTaskSignalled();
bool isThreadExecutionLagging();
void cleanup();
void setOverrideShutdownTask(taskFunctionCallback *ptr);
};
// =====================================================

View File

@ -296,6 +296,8 @@ SimpleTaskThread::SimpleTaskThread( SimpleTaskCallbackInterface *simpleTaskInter
this->executionCount = executionCount;
this->millisecsBetweenExecutions = millisecsBetweenExecutions;
this->needTaskSignal = needTaskSignal;
this->overrideShutdownTask = NULL;
setTaskSignalled(false);
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
@ -308,10 +310,7 @@ SimpleTaskThread::SimpleTaskThread( SimpleTaskCallbackInterface *simpleTaskInter
SimpleTaskThread::~SimpleTaskThread() {
try {
if(this->simpleTaskInterface != NULL) {
this->simpleTaskInterface->shutdownTask(this);
this->simpleTaskInterface = NULL;
}
cleanup();
}
catch(const exception &ex) {
SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what());
@ -322,6 +321,21 @@ SimpleTaskThread::~SimpleTaskThread() {
}
}
void SimpleTaskThread::cleanup() {
if(this->overrideShutdownTask != NULL) {
this->overrideShutdownTask(this);
this->overrideShutdownTask = NULL;
}
else if(this->simpleTaskInterface != NULL) {
this->simpleTaskInterface->shutdownTask(this);
this->simpleTaskInterface = NULL;
}
}
void SimpleTaskThread::setOverrideShutdownTask(taskFunctionCallback *ptr) {
this->overrideShutdownTask = ptr;
}
bool SimpleTaskThread::isThreadExecutionLagging() {
bool result = false;
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);

View File

@ -155,6 +155,9 @@ std::string SystemFlags::getHTTP(std::string URL,CURL *handle,int timeOut,CURLco
/* get contents from the URL */
CURLcode result = curl_easy_perform(handle);
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("CURL result = %d\n",result);
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("CURL errbuf [%s]\n",errbuf);
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] return code [%d] [%s]\n",__FILE__,__FUNCTION__,__LINE__,result,errbuf);
std::string serverResponse = (chunk.memory != NULL ? chunk.memory : "");