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 // iterate the nodes in the list
while (nodeItem != _nodeHash.end()) { while (nodeItem != _nodeHash.end()) {
// emit our signal to say this node has been killed killNodeAtHashIterator(nodeItem);
emit nodeKilled(nodeItem.value()); nodeItem++;
// erase the node from our node hash
_nodeHash.erase(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()); emit nodeKilled(nodeItemToKill.value());
_nodeHash.erase(nodeItemToKill);
return _nodeHash.erase(nodeItemToKill);
} }
@ -789,6 +789,8 @@ void NodeList::removeSilentNodes() {
NodeHash::iterator nodeItem = _nodeHash.begin(); NodeHash::iterator nodeItem = _nodeHash.begin();
int index = 0;
while (nodeItem != _nodeHash.end()) { while (nodeItem != _nodeHash.end()) {
SharedNodePointer node = nodeItem.value(); SharedNodePointer node = nodeItem.value();
@ -797,10 +799,11 @@ void NodeList::removeSilentNodes() {
if ((usecTimestampNow() - node->getLastHeardMicrostamp()) > NODE_SILENCE_THRESHOLD_USECS) { if ((usecTimestampNow() - node->getLastHeardMicrostamp()) > NODE_SILENCE_THRESHOLD_USECS) {
// call our private method to kill this node (removes it and emits the right signal) // 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 processKillNode(unsigned char* packetData, size_t dataBytes);
void killNodeAtHashIterator(NodeHash::iterator nodeItemToKill); NodeHash::iterator killNodeAtHashIterator(NodeHash::iterator& nodeItemToKill);
NodeHash _nodeHash; NodeHash _nodeHash;
QString _domainHostname; QString _domainHostname;

View file

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