From bf839ca2912b20f7a080be62c1786c4fda47a90d Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 24 Aug 2018 16:53:38 -0700 Subject: [PATCH] Handle _unfilteredHandlers first upon processing datagrams --- libraries/networking/src/udt/Socket.cpp | 41 +++++++++++++++---------- libraries/networking/src/udt/Socket.h | 4 +-- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index 5b64cc0716..162b045a6e 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -344,7 +344,7 @@ void Socket::readPendingDatagrams() { continue; } - _incomingDatagrams.push({ senderAddress, senderPort, packetSizeWithHeader, + _incomingDatagrams.push_back({ senderAddress, senderPort, packetSizeWithHeader, std::move(buffer), receiveTime }); ++packetsRead; @@ -361,6 +361,28 @@ void Socket::processPendingDatagrams(int) { // setup a HifiSockAddr to read into HifiSockAddr senderSockAddr; + // Process unfiltered packets first. + for (auto datagramIter = _incomingDatagrams.begin(); datagramIter != _incomingDatagrams.end(); ++datagramIter) { + senderSockAddr.setAddress(datagramIter->_senderAddress); + senderSockAddr.setPort(datagramIter->_senderPort); + auto it = _unfilteredHandlers.find(senderSockAddr); + if (it != _unfilteredHandlers.end()) { + // we have a registered unfiltered handler for this HifiSockAddr (eg. STUN packet) - call that and return + if (it->second) { + auto basePacket = BasePacket::fromReceivedPacket(std::move(datagramIter->_datagram), + datagramIter->_datagramLength, + senderSockAddr); + basePacket->setReceiveTime(datagramIter->_receiveTime); + it->second(std::move(basePacket)); + } + + datagramIter = _incomingDatagrams.erase(datagramIter); + if (datagramIter == _incomingDatagrams.end()) { + break; + } + } + } + while (!_incomingDatagrams.empty()) { auto& datagram = _incomingDatagrams.front(); senderSockAddr.setAddress(datagram._senderAddress); @@ -370,19 +392,6 @@ void Socket::processPendingDatagrams(int) { auto it = _unfilteredHandlers.find(senderSockAddr); - if (it != _unfilteredHandlers.end()) { - // we have a registered unfiltered handler for this HifiSockAddr (eg. STUN packet) - call that and return - if (it->second) { - auto basePacket = BasePacket::fromReceivedPacket(std::move(datagram._datagram), datagramSize, - senderSockAddr); - basePacket->setReceiveTime(datagram._receiveTime); - it->second(std::move(basePacket)); - } - - _incomingDatagrams.pop(); - continue; - } - // we're reading a packet so re-start the readyRead backup timer _readyReadBackupTimer->start(); @@ -427,7 +436,7 @@ void Socket::processPendingDatagrams(int) { qCDebug(networking) << "Can't process packet: version" << (unsigned int)NLPacket::versionInHeader(*packet) << ", type" << NLPacket::typeInHeader(*packet); #endif - _incomingDatagrams.pop(); + _incomingDatagrams.pop_front(); continue; } } @@ -444,7 +453,7 @@ void Socket::processPendingDatagrams(int) { } } - _incomingDatagrams.pop(); + _incomingDatagrams.pop_front(); } } diff --git a/libraries/networking/src/udt/Socket.h b/libraries/networking/src/udt/Socket.h index 078863663f..ef4a457116 100644 --- a/libraries/networking/src/udt/Socket.h +++ b/libraries/networking/src/udt/Socket.h @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include @@ -156,7 +156,7 @@ private: p_high_resolution_clock::time_point _receiveTime; }; - std::queue _incomingDatagrams; + std::list _incomingDatagrams; int _maxDatagramsRead { 0 }; friend UDTTest;