repair iterator push on silent node removal

This commit is contained in:
Stephen Birarda 2014-01-14 10:48:47 -08:00
parent ed0ed96029
commit 66f50c38e3
3 changed files with 14 additions and 11 deletions

View file

@ -279,10 +279,8 @@ void NodeList::clear() {
// iterate the nodes in the list
while (nodeItem != _nodeHash.end()) {
// emit our signal to say this node has been killed
emit nodeKilled(nodeItem.value());
// erase the node from our node hash
_nodeHash.erase(nodeItem);
killNodeAtHashIterator(nodeItem);
nodeItem++;
}
}
@ -448,9 +446,11 @@ void NodeList::killNodeWithUUID(const QUuid& nodeUUID) {
}
}
void NodeList::killNodeAtHashIterator(NodeHash::iterator nodeItemToKill) {
NodeHash::iterator NodeList::killNodeAtHashIterator(NodeHash::iterator& nodeItemToKill) {
qDebug() << "Killed" << *nodeItemToKill.value() << "\n";
emit nodeKilled(nodeItemToKill.value());
_nodeHash.erase(nodeItemToKill);
return _nodeHash.erase(nodeItemToKill);
}
@ -789,6 +789,8 @@ void NodeList::removeSilentNodes() {
NodeHash::iterator nodeItem = _nodeHash.begin();
int index = 0;
while (nodeItem != _nodeHash.end()) {
SharedNodePointer node = nodeItem.value();
@ -797,10 +799,11 @@ void NodeList::removeSilentNodes() {
if ((usecTimestampNow() - node->getLastHeardMicrostamp()) > NODE_SILENCE_THRESHOLD_USECS) {
// call our private method to kill this node (removes it and emits the right signal)
killNodeAtHashIterator(nodeItem);
nodeItem = killNodeAtHashIterator(nodeItem);
} else {
// we didn't kill this node, push the iterator forwards
++nodeItem;
}
nodeItem++;
}
}

View file

@ -144,7 +144,7 @@ private:
void processKillNode(unsigned char* packetData, size_t dataBytes);
void killNodeAtHashIterator(NodeHash::iterator nodeItemToKill);
NodeHash::iterator killNodeAtHashIterator(NodeHash::iterator& nodeItemToKill);
NodeHash _nodeHash;
QString _domainHostname;

View file

@ -20,7 +20,7 @@ PACKET_VERSION versionForPacketType(PACKET_TYPE type) {
return 2;
case PACKET_TYPE_HEAD_DATA:
return 12;
return 13;
case PACKET_TYPE_AVATAR_URLS:
return 2;