From 0cfc97cea46990c156219f944849384e98cb9669 Mon Sep 17 00:00:00 2001 From: zerver Date: Mon, 26 Dec 2011 23:56:21 +0200 Subject: [PATCH] [MT] Fix crash/hang in 0a4ecee --- rts/System/SpringApp.cpp | 2 +- rts/lib/gml/gml_base.cpp | 22 ++++++++++++---------- rts/lib/gml/gml_base.h | 3 +++ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/rts/System/SpringApp.cpp b/rts/System/SpringApp.cpp index 49ca26d7be2..2a52d1cbfba 100644 --- a/rts/System/SpringApp.cpp +++ b/rts/System/SpringApp.cpp @@ -924,7 +924,7 @@ int SpringApp::Update() Watchdog::ClearTimer(WDT_MAIN); if (!GML::SimThreadRunning()) { - ret = activeController->Update(); + ret = GML::UpdateSim(activeController); } if (ret) { diff --git a/rts/lib/gml/gml_base.cpp b/rts/lib/gml/gml_base.cpp index 7926d5bfc1c..f80def0dacb 100644 --- a/rts/lib/gml/gml_base.cpp +++ b/rts/lib/gml/gml_base.cpp @@ -40,18 +40,15 @@ static void gmlSimLoop(void*) if (gmlShareLists) ogc->WorkerThreadPost(); - Threading::SetSimThread(true); //Threading::SetAffinity(3); Watchdog::ClearTimer(WDT_SIM); while(gmlKeepRunning) { if(!gmlMultiThreadSim) { - Threading::SetSimThread(false); Watchdog::ClearTimer(WDT_SIM, true); while(!gmlMultiThreadSim && gmlKeepRunning) SDL_Delay(500); - Threading::SetSimThread(true); } //FIXME activeController could change while processing this branch. Better make it safe with a mutex? @@ -59,11 +56,8 @@ static void gmlSimLoop(void*) Watchdog::ClearTimer(WDT_SIM); gmlProcessor->ExpandAuxQueue(); - { - GML_MSTMUTEX_LOCK(sim); // UpdateSim - if(!activeController->Update()) - gmlKeepRunning = false; - } + if(!GML::UpdateSim(activeController)) + gmlKeepRunning = false; gmlProcessor->GetQueue(); } @@ -71,8 +65,6 @@ static void gmlSimLoop(void*) boost::thread::yield(); } - Threading::SetSimThread(false); - if(gmlShareLists) ogc->WorkerThreadFree(); } @@ -82,6 +74,16 @@ static void gmlSimLoop(void*) #endif namespace GML { + + bool UpdateSim(CGameController *ac) { + GML_MSTMUTEX_LOCK(sim); // UpdateSim + + Threading::SetSimThread(true); + bool ret = ac->Update(); + Threading::SetSimThread(false); + return ret; + } + void Init() { gmlShareLists = configHandler->GetBool("MultiThreadShareLists"); diff --git a/rts/lib/gml/gml_base.h b/rts/lib/gml/gml_base.h index 28702af0d46..c27d27c3a6b 100644 --- a/rts/lib/gml/gml_base.h +++ b/rts/lib/gml/gml_base.h @@ -4,6 +4,7 @@ #define GML_BASE_H_ #include "gml.h" +#include "Game/GameController.h" #ifdef USE_GML namespace GML { @@ -18,6 +19,7 @@ namespace GML { inline int ThreadNumber() { return gmlThreadNumber; } inline void ThreadNumber(int num) { set_threadnum(num); } inline int ThreadCount() { return gmlThreadCount; } + bool UpdateSim(CGameController *ac); }; #else namespace GML { @@ -32,6 +34,7 @@ namespace GML { inline int ThreadNumber() { return 0; } inline void ThreadNumber(int num) { } inline int ThreadCount() { return 1; } + inline bool UpdateSim(CGameController *ac) { return ac->Update(); } }; #endif