From 8aa7a915e7077f7b0a94d9a60507d3c7218d4602 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 23 Jan 2014 13:01:07 -0800 Subject: [PATCH] ok, one more shot at fixing particle-server crash --- libraries/particles/src/ParticleTree.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/libraries/particles/src/ParticleTree.cpp b/libraries/particles/src/ParticleTree.cpp index 31f5216462..73e8dd6711 100644 --- a/libraries/particles/src/ParticleTree.cpp +++ b/libraries/particles/src/ParticleTree.cpp @@ -391,17 +391,26 @@ bool ParticleTree::encodeParticlesDeletedSince(uint64_t& sinceTime, unsigned cha // called by the server when it knows all nodes have been sent deleted packets void ParticleTree::forgetParticlesDeletedBefore(uint64_t sinceTime) { //qDebug() << "forgetParticlesDeletedBefore()"; + QSet keysToRemove; + _recentlyDeletedParticlesLock.lockForWrite(); QMultiMap::iterator iterator = _recentlyDeletedParticleIDs.begin(); + // First find all the keys in the map that are older and need to be deleted while (iterator != _recentlyDeletedParticleIDs.end()) { //qDebug() << "considering... time/key:" << iterator.key(); if (iterator.key() <= sinceTime) { //qDebug() << "YES older... time/key:" << iterator.key(); - _recentlyDeletedParticleIDs.remove(iterator.key()); + keysToRemove << iterator.key(); } - //qDebug() << "about to ++iterator"; ++iterator; } + + // Now run through the keysToRemove and remove them + foreach (uint64_t value, keysToRemove) { + //qDebug() << "removing the key, _recentlyDeletedParticleIDs.remove(value); time/key:" << value; + _recentlyDeletedParticleIDs.remove(value); + } + _recentlyDeletedParticlesLock.unlock(); //qDebug() << "DONE forgetParticlesDeletedBefore()"; }