From 0b2f0914cc800bb3ae4c1f21e0c28cfdacc65f3f Mon Sep 17 00:00:00 2001
From: sfan5 <sfan5@live.de>
Date: Tue, 19 Nov 2019 20:23:00 +0100
Subject: Improve client-side packet receiving

---
 src/client/client.cpp | 35 ++++++++++++++++-------------------
 src/client/client.h   |  1 -
 2 files changed, 16 insertions(+), 20 deletions(-)

(limited to 'src/client')

diff --git a/src/client/client.cpp b/src/client/client.cpp
index 5d4793c8a..315fcd410 100644
--- a/src/client/client.cpp
+++ b/src/client/client.cpp
@@ -311,6 +311,7 @@ void Client::connect(Address address, bool is_local_server)
 {
 	initLocalMapSaving(address, m_address_name, is_local_server);
 
+	// Since we use TryReceive() a timeout here would be ineffective anyway
 	m_con->SetTimeoutMs(0);
 	m_con->Connect(address);
 }
@@ -795,36 +796,31 @@ void Client::initLocalMapSaving(const Address &address,
 
 void Client::ReceiveAll()
 {
+	NetworkPacket pkt;
 	u64 start_ms = porting::getTimeMs();
-	for(;;)
-	{
+	const u64 budget = 100;
+	for(;;) {
 		// Limit time even if there would be huge amounts of data to
 		// process
-		if(porting::getTimeMs() > start_ms + 100)
+		if (porting::getTimeMs() > start_ms + budget) {
+			infostream << "Client::ReceiveAll(): "
+					"Packet processing budget exceeded." << std::endl;
 			break;
+		}
 
+		pkt.clear();
 		try {
-			Receive();
-			g_profiler->graphAdd("client_received_packets", 1);
-		}
-		catch(con::NoIncomingDataException &e) {
-			break;
-		}
-		catch(con::InvalidIncomingDataException &e) {
-			infostream<<"Client::ReceiveAll(): "
+			if (!m_con->TryReceive(&pkt))
+				break;
+			ProcessData(&pkt);
+		} catch (const con::InvalidIncomingDataException &e) {
+			infostream << "Client::ReceiveAll(): "
 					"InvalidIncomingDataException: what()="
-					<<e.what()<<std::endl;
+					 << e.what() << std::endl;
 		}
 	}
 }
 
-void Client::Receive()
-{
-	NetworkPacket pkt;
-	m_con->Receive(&pkt);
-	ProcessData(&pkt);
-}
-
 inline void Client::handleCommand(NetworkPacket* pkt)
 {
 	const ToClientCommandHandler& opHandle = toClientCommandTable[pkt->getCommand()];
@@ -841,6 +837,7 @@ void Client::ProcessData(NetworkPacket *pkt)
 
 	//infostream<<"Client: received command="<<command<<std::endl;
 	m_packetcounter.add((u16)command);
+	g_profiler->graphAdd("client_received_packets", 1);
 
 	/*
 		If this check is removed, be sure to change the queue
diff --git a/src/client/client.h b/src/client/client.h
index 0e0765cae..10608ccf9 100644
--- a/src/client/client.h
+++ b/src/client/client.h
@@ -453,7 +453,6 @@ private:
 			bool is_local_server);
 
 	void ReceiveAll();
-	void Receive();
 
 	void sendPlayerPos();
 
-- 
cgit v1.2.3