Przeglądaj źródła

Simplified applying of lobby packs

Ivan Savenko 1 rok temu
rodzic
commit
8ea69e457a
3 zmienionych plików z 23 dodań i 45 usunięć
  1. 0 1
      client/CMT.cpp
  2. 20 33
      client/CServerHandler.cpp
  3. 3 11
      client/CServerHandler.h

+ 0 - 1
client/CMT.cpp

@@ -451,7 +451,6 @@ static void mainLoop()
 	while(1) //main SDL events loop
 	{
 		GH.input().fetchEvents();
-		CSH->applyPacksOnLobbyScreen();
 		GH.renderFrame();
 	}
 }

+ 20 - 33
client/CServerHandler.cpp

@@ -76,8 +76,8 @@ extern std::atomic_bool androidTestServerReadyFlag;
 class CBaseForLobbyApply
 {
 public:
-	virtual bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const = 0;
-	virtual void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, void * pack) const = 0;
+	virtual bool applyOnLobbyHandler(CServerHandler * handler, CPackForLobby & pack) const = 0;
+	virtual void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, CPackForLobby & pack) const = 0;
 	virtual ~CBaseForLobbyApply(){};
 	template<typename U> static CBaseForLobbyApply * getApplier(const U * t = nullptr)
 	{
@@ -88,40 +88,40 @@ public:
 template<typename T> class CApplyOnLobby : public CBaseForLobbyApply
 {
 public:
-	bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const override
+	bool applyOnLobbyHandler(CServerHandler * handler, CPackForLobby & pack) const override
 	{
 		boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
 
-		T * ptr = static_cast<T *>(pack);
+		T & ptr = static_cast<T &>(pack);
 		ApplyOnLobbyHandlerNetPackVisitor visitor(*handler);
 
 		logNetwork->trace("\tImmediately apply on lobby: %s", typeid(ptr).name());
-		ptr->visit(visitor);
+		ptr.visit(visitor);
 
 		return visitor.getResult();
 	}
 
-	void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, void * pack) const override
+	void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, CPackForLobby & pack) const override
 	{
-		T * ptr = static_cast<T *>(pack);
+		T & ptr = static_cast<T &>(pack);
 		ApplyOnLobbyScreenNetPackVisitor visitor(*handler, lobby);
 
 		logNetwork->trace("\tApply on lobby from queue: %s", typeid(ptr).name());
-		ptr->visit(visitor);
+		ptr.visit(visitor);
 	}
 };
 
 template<> class CApplyOnLobby<CPack>: public CBaseForLobbyApply
 {
 public:
-	bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const override
+	bool applyOnLobbyHandler(CServerHandler * handler, CPackForLobby & pack) const override
 	{
 		logGlobal->error("Cannot apply plain CPack!");
 		assert(0);
 		return false;
 	}
 
-	void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, void * pack) const override
+	void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, CPackForLobby & pack) const override
 	{
 		logGlobal->error("Cannot apply plain CPack!");
 		assert(0);
@@ -139,7 +139,6 @@ CServerHandler::~CServerHandler()
 
 CServerHandler::CServerHandler()
 	: state(EClientState::NONE)
-	, mx(std::make_shared<boost::recursive_mutex>())
 	, networkClient(std::make_unique<NetworkClient>(*this))
 	, client(nullptr)
 	, loadMode(0)
@@ -170,7 +169,6 @@ void CServerHandler::resetStateForLobby(const StartInfo::EMode mode, const std::
 	state = EClientState::NONE;
 	mapToStart = nullptr;
 	th = std::make_unique<CStopWatch>();
-	packsForLobbyScreen.clear();
 	c.reset();
 	si = std::make_shared<StartInfo>();
 	playerNames.clear();
@@ -321,19 +319,12 @@ void CServerHandler::onConnectionEstablished(const std::shared_ptr<NetworkConnec
 	}
 }
 
-void CServerHandler::applyPacksOnLobbyScreen()
+void CServerHandler::applyPackOnLobbyScreen(CPackForLobby & pack)
 {
-	boost::unique_lock<boost::recursive_mutex> lock(*mx);
-	while(!packsForLobbyScreen.empty())
-	{
-		boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
-		CPackForLobby * pack = packsForLobbyScreen.front();
-		packsForLobbyScreen.pop_front();
-		CBaseForLobbyApply * apply = applier->getApplier(CTypeList::getInstance().getTypeID(pack)); //find the applier
-		apply->applyOnLobbyScreen(dynamic_cast<CLobbyScreen *>(SEL), this, pack);
-		GH.windows().totalRedraw();
-		delete pack;
-	}
+	boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
+	CBaseForLobbyApply * apply = applier->getApplier(CTypeList::getInstance().getTypeID(&pack)); //find the applier
+	apply->applyOnLobbyScreen(dynamic_cast<CLobbyScreen *>(SEL), this, pack);
+	GH.windows().totalRedraw();
 }
 
 std::set<PlayerColor> CServerHandler::getHumanColors()
@@ -956,23 +947,19 @@ void CServerHandler::onDisconnected(const std::shared_ptr<NetworkConnection> &)
 		}
 		else
 		{
-			auto lcd = new LobbyClientDisconnected();
-			lcd->clientId = c->connectionID;
-			boost::unique_lock<boost::recursive_mutex> lock(*mx);
-			packsForLobbyScreen.push_back(lcd);
+			LobbyClientDisconnected lcd;
+			lcd.clientId = c->connectionID;
+			applyPackOnLobbyScreen(lcd);
 		}
 	}
 }
 
 void CServerHandler::visitForLobby(CPackForLobby & lobbyPack)
 {
-	if(applier->getApplier(CTypeList::getInstance().getTypeID(&lobbyPack))->applyOnLobbyHandler(this, &lobbyPack))
+	if(applier->getApplier(CTypeList::getInstance().getTypeID(&lobbyPack))->applyOnLobbyHandler(this, lobbyPack))
 	{
 		if(!settings["session"]["headless"].Bool())
-		{
-			boost::unique_lock<boost::recursive_mutex> lock(*mx);
-			packsForLobbyScreen.push_back(&lobbyPack);
-		}
+			applyPackOnLobbyScreen(lobbyPack);
 	}
 }
 

+ 3 - 11
client/CServerHandler.h

@@ -83,21 +83,13 @@ public:
 /// structure to handle running server and connecting to it
 class CServerHandler : public IServerAPI, public LobbyInfo, public INetworkClientListener, boost::noncopyable
 {
-	std::unique_ptr<NetworkClient> networkClient;
-
 	friend class ApplyOnLobbyHandlerNetPackVisitor;
-	
-	std::shared_ptr<CApplier<CBaseForLobbyApply>> applier;
 
-	std::shared_ptr<boost::recursive_mutex> mx;
-	std::list<CPackForLobby *> packsForLobbyScreen; //protected by mx
-	
+	std::unique_ptr<NetworkClient> networkClient;
+	std::shared_ptr<CApplier<CBaseForLobbyApply>> applier;
 	std::shared_ptr<CMapInfo> mapToStart;
-
 	std::vector<std::string> myNames;
-
 	std::shared_ptr<HighScoreCalculation> highScoreCalc;
-
 	std::function<void()> onConnectedCallback;
 
 	void threadRunNetwork();
@@ -110,6 +102,7 @@ class CServerHandler : public IServerAPI, public LobbyInfo, public INetworkClien
 	void onConnectionEstablished(const std::shared_ptr<NetworkConnection> &) override;
 	void onDisconnected(const std::shared_ptr<NetworkConnection> &) override;
 
+	void applyPackOnLobbyScreen(CPackForLobby & pack);
 public:
 	std::shared_ptr<CConnection> c;
 
@@ -143,7 +136,6 @@ public:
 	void resetStateForLobby(const StartInfo::EMode mode, const std::vector<std::string> * names = nullptr);
 	void startLocalServerAndConnect(const std::function<void()> & onConnected);
 	void justConnectToServer(const std::string & addr, const ui16 port, const std::function<void()> & onConnected);
-	void applyPacksOnLobbyScreen();
 
 	// Helpers for lobby state access
 	std::set<PlayerColor> getHumanColors();