diff --git a/node/Switch.cpp b/node/Switch.cpp index 236c1e660..a409a9e2a 100644 --- a/node/Switch.cpp +++ b/node/Switch.cpp @@ -404,10 +404,12 @@ void Switch::doAnythingWaitingForPeer(const SharedPtr &peer) { // finish processing any packets waiting on peer's public key / identity Mutex::Lock _l(_rxQueue_m); - for(std::list< SharedPtr >::iterator rxi(_rxQueue.begin());rxi!=_rxQueue.end();) { - if ((*rxi)->tryDecode(RR)) - _rxQueue.erase(rxi++); - else ++rxi; + for(std::vector< SharedPtr >::iterator rxi(_rxQueue.begin());rxi!=_rxQueue.end();) { + if ((*rxi)->tryDecode(RR)) { + // erase element (replace by last) + *rxi = _rxQueue.back(); + _rxQueue.pop_back(); + } else ++rxi; } } @@ -508,10 +510,12 @@ unsigned long Switch::doTimerTasks(uint64_t now) { // Time out RX queue packets that never got WHOIS lookups or other info. Mutex::Lock _l(_rxQueue_m); - for(std::list< SharedPtr >::iterator i(_rxQueue.begin());i!=_rxQueue.end();) { + for(std::vector< SharedPtr >::iterator i(_rxQueue.begin());i!=_rxQueue.end();) { if ((now - (*i)->receiveTime()) > ZT_RECEIVE_QUEUE_TIMEOUT) { TRACE("RX %s -> %s timed out",(*i)->source().toString().c_str(),(*i)->destination().toString().c_str()); - _rxQueue.erase(i++); + // erase element (replace by last) + *i = _rxQueue.back(); + _rxQueue.pop_back(); } else ++i; } } diff --git a/node/Switch.hpp b/node/Switch.hpp index 0ba4c138c..2820ed1f4 100644 --- a/node/Switch.hpp +++ b/node/Switch.hpp @@ -213,7 +213,7 @@ private: Mutex _defragQueue_m; // ZeroTier-layer RX queue of incoming packets in the process of being decoded - std::list< SharedPtr > _rxQueue; + std::vector< SharedPtr > _rxQueue; Mutex _rxQueue_m; // ZeroTier-layer TX queue by destination ZeroTier address