From fc80745c08b7836e594ffbb994700f37722bc620 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sun, 30 Aug 2015 20:03:15 -0700 Subject: [PATCH 1/2] Update message handling to use insertion sort --- libraries/networking/src/udt/Connection.cpp | 25 ++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index b8dbc7c62e..e2cdbb8651 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -825,30 +825,35 @@ void PendingReceivedMessage::enqueuePacket(std::unique_ptr packet) { return; } + auto sequenceNumber = packet->getSequenceNumber(); + if (packet->getPacketPosition() == Packet::PacketPosition::FIRST) { _hasFirstSequenceNumber = true; - _firstSequenceNumber = packet->getSequenceNumber(); + _firstSequenceNumber = sequenceNumber; } else if (packet->getPacketPosition() == Packet::PacketPosition::LAST) { _hasLastSequenceNumber = true; - _lastSequenceNumber = packet->getSequenceNumber(); + _lastSequenceNumber = sequenceNumber; } else if (packet->getPacketPosition() == Packet::PacketPosition::ONLY) { _hasFirstSequenceNumber = true; _hasLastSequenceNumber = true; - _firstSequenceNumber = packet->getSequenceNumber(); - _lastSequenceNumber = packet->getSequenceNumber(); + _firstSequenceNumber = sequenceNumber; + _lastSequenceNumber = sequenceNumber; } - _packets.push_back(std::move(packet)); + // Insert into the packets list in sorted order. Because we generally expect to receive packets in order, begin + // searching from the end of the list. + auto it = _packets.rbegin(); + for (auto rend = _packets.rend(); it != rend; ++it) { + if (sequenceNumber > (*it)->getSequenceNumber()) { + break; + } + } + _packets.insert(it.base(), std::move(packet)); if (_hasFirstSequenceNumber && _hasLastSequenceNumber) { auto numPackets = udt::seqlen(_firstSequenceNumber, _lastSequenceNumber); if (uint64_t(numPackets) == _packets.size()) { _isComplete = true; - - // Sort packets by sequence number - _packets.sort([](std::unique_ptr& a, std::unique_ptr& b) { - return a->getSequenceNumber() < b->getSequenceNumber(); - }); } } } From e8fba991fa97785639acd8b675105e894ee595e0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 31 Aug 2015 12:35:41 -0700 Subject: [PATCH 2/2] Update raw loop to use find_if for message packet sorting --- libraries/networking/src/udt/Connection.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index e2cdbb8651..368a6d459e 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -842,11 +842,8 @@ void PendingReceivedMessage::enqueuePacket(std::unique_ptr packet) { // Insert into the packets list in sorted order. Because we generally expect to receive packets in order, begin // searching from the end of the list. - auto it = _packets.rbegin(); - for (auto rend = _packets.rend(); it != rend; ++it) { - if (sequenceNumber > (*it)->getSequenceNumber()) { - break; - } + auto it = find_if(_packets.rbegin(), _packets.rend(), + [&](const std::unique_ptr& packet) { return sequenceNumber > packet->getSequenceNumber(); }); } _packets.insert(it.base(), std::move(packet));