瀏覽代碼

Add proper thread synchronization for campaigns

Dydzio 6 年之前
父節點
當前提交
1cc2ef537b
共有 3 個文件被更改,包括 7 次插入2 次删除
  1. 2 1
      client/CMT.cpp
  2. 2 1
      client/CServerHandler.cpp
  3. 3 0
      client/CServerHandler.h

+ 2 - 1
client/CMT.cpp

@@ -1265,6 +1265,7 @@ static void handleEvent(SDL_Event & ev)
 			break;
 		case EUserEvent::CAMPAIGN_START_SCENARIO:
 			{
+				CSH->campaignServerRestartLock.set(true);
 				CSH->endGameplay();
 				auto ourCampaign = std::shared_ptr<CCampaignState>(reinterpret_cast<CCampaignState *>(ev.user.data1));
 				auto & epilogue = ourCampaign->camp->scenarios[ourCampaign->mapsConquered.back()].epilog;
@@ -1281,7 +1282,7 @@ static void handleEvent(SDL_Event & ev)
 				}
 				else
 				{
-					boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); //TODO: thread sync and execute this after server closes
+					CSH->campaignServerRestartLock.waitUntil(false);
 					finisher();
 				}
 			}

+ 2 - 1
client/CServerHandler.cpp

@@ -101,7 +101,7 @@ public:
 extern std::string NAME;
 
 CServerHandler::CServerHandler()
-	: state(EClientState::NONE), mx(std::make_shared<boost::recursive_mutex>()), client(nullptr), loadMode(0), campaignStateToSend(nullptr)
+	: state(EClientState::NONE), mx(std::make_shared<boost::recursive_mutex>()), client(nullptr), loadMode(0), campaignStateToSend(nullptr), campaignServerRestartLock(false)
 {
 	uuid = boost::uuids::to_string(boost::uuids::random_generator()());
 	applier = std::make_shared<CApplier<CBaseForLobbyApply>>();
@@ -692,6 +692,7 @@ void CServerHandler::threadRunServer()
 		logNetwork->error("Check %s for more info", logName);
 	}
 	threadRunLocalServer.reset();
+	CSH->campaignServerRestartLock.setn(false);
 #endif
 }
 

+ 3 - 0
client/CServerHandler.h

@@ -12,6 +12,7 @@
 #include "../lib/CStopWatch.h"
 
 #include "../lib/StartInfo.h"
+#include "../lib/CondSh.h"
 
 struct SharedMemory;
 class CConnection;
@@ -95,6 +96,8 @@ public:
 	std::shared_ptr<CConnection> c;
 	CClient * client;
 
+	CondSh<bool> campaignServerRestartLock;
+
 	CServerHandler();
 
 	void resetStateForLobby(const StartInfo::EMode mode, const std::vector<std::string> * names = nullptr);