From 3b43dfee11fe6db9a3c1fc99be1e4b0295166534 Mon Sep 17 00:00:00 2001 From: Jordan Schidlowsky Date: Mon, 27 Sep 2021 09:39:31 +0200 Subject: [PATCH] [Net] ENet poll now only service the connection once. It used to call `enet_host_service` until all events were consumed, but that also meant constantly polling the connection leading to potentially unbounded processing time. It now only service the connection once, and instead consumes all the retrieved events via `enet_host_check_events`. --- modules/enet/networked_multiplayer_enet.cpp | 29 ++++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/modules/enet/networked_multiplayer_enet.cpp b/modules/enet/networked_multiplayer_enet.cpp index cf6148e9185..a3944b53ded 100644 --- a/modules/enet/networked_multiplayer_enet.cpp +++ b/modules/enet/networked_multiplayer_enet.cpp @@ -217,22 +217,25 @@ void NetworkedMultiplayerENet::poll() { _pop_current_packet(); + if (!host || !active) { // Might be disconnected + return; + } + ENetEvent event; - /* Keep servicing until there are no available events left in queue. */ - while (true) { - if (!host || !active) { // Might have been disconnected while emitting a notification + int ret = enet_host_service(host, &event, 0); + + if (ret < 0) { + ERR_FAIL_MSG("Enet host service error"); + } else if (ret == 0) { + return; // No events + } + + /* Keep servicing until there are no available events left in the queue. */ + do { + if (!host || !active) { // Check again after every event return; } - int ret = enet_host_service(host, &event, 0); - - if (ret < 0) { - // Error, do something? - break; - } else if (ret == 0) { - break; - } - switch (event.type) { case ENET_EVENT_TYPE_CONNECT: { // Store any relevant client information here. @@ -436,7 +439,7 @@ void NetworkedMultiplayerENet::poll() { // Do nothing } break; } - } + } while (enet_host_check_events(host, &event) > 0); } bool NetworkedMultiplayerENet::is_server() const {