Handle _unfilteredHandlers first upon processing datagrams

This commit is contained in:
Simon Walton 2018-08-24 16:53:38 -07:00
parent 4392b3c2a8
commit bf839ca291
2 changed files with 27 additions and 18 deletions

View file

@ -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();
}
}

View file

@ -17,7 +17,7 @@
#include <functional>
#include <unordered_map>
#include <mutex>
#include <queue>
#include <list>
#include <QtCore/QObject>
#include <QtCore/QTimer>
@ -156,7 +156,7 @@ private:
p_high_resolution_clock::time_point _receiveTime;
};
std::queue<Datagram> _incomingDatagrams;
std::list<Datagram> _incomingDatagrams;
int _maxDatagramsRead { 0 };
friend UDTTest;