Merge pull request #5242 from jherico/packet_processing

Eliminate per-packet locking for processing
This commit is contained in:
Brad Hefta-Gaub 2015-07-01 16:11:27 -07:00
commit b4f04af66f

View file

@ -38,19 +38,28 @@ bool ReceivedPacketProcessor::process() {
_hasPackets.wait(&_waitingOnPacketsMutex, getMaxWait()); _hasPackets.wait(&_waitingOnPacketsMutex, getMaxWait());
_waitingOnPacketsMutex.unlock(); _waitingOnPacketsMutex.unlock();
} }
preProcess(); preProcess();
while (_packets.size() > 0) { if (!_packets.size()) {
lock(); // lock to make sure nothing changes on us return isStillRunning();
NetworkPacket& packet = _packets.front(); // get the oldest packet }
NetworkPacket temporary = packet; // make a copy of the packet in case the vector is resized on us
_packets.erase(_packets.begin()); // remove the oldest packet lock();
if (!temporary.getNode().isNull()) { QVector<NetworkPacket> currentPackets;
_nodePacketCounts[temporary.getNode()->getUUID()]--; currentPackets.swap(_packets);
} unlock();
unlock(); // let others add to the packets
processPacket(temporary.getNode(), temporary.getByteArray()); // process our temporary copy foreach(auto& packet, currentPackets) {
processPacket(packet.getNode(), packet.getByteArray());
midProcess(); midProcess();
} }
lock();
foreach(auto& packet, currentPackets) {
_nodePacketCounts[packet.getNode()->getUUID()]--;
}
unlock();
postProcess(); postProcess();
return isStillRunning(); // keep running till they terminate us return isStillRunning(); // keep running till they terminate us
} }