diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7a7d7c10f8..02cf59ad87 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3249,10 +3249,16 @@ void Application::nodeAdded(SharedNodePointer node) { void Application::nodeKilled(SharedNodePointer node) { - // this is here because connecting NodeList::nodeKilled to OctreePacketProcessor::nodeKilled doesn't work: - // OctreePacketProcessor::nodeKilled is not called when NodeList::nodeKilled is emitted for some reason. + // These are here because connecting NodeList::nodeKilled to OctreePacketProcessor::nodeKilled doesn't work: + // OctreePacketProcessor::nodeKilled is not being called when NodeList::nodeKilled is emitted. + // This may have to do with GenericThread::threadRoutine() blocking the QThread event loop + _octreeProcessor.nodeKilled(node); + _voxelEditSender.nodeKilled(node); + _particleEditSender.nodeKilled(node); + _modelEditSender.nodeKilled(node); + if (node->getType() == NodeType::VoxelServer) { QUuid nodeUUID = node->getUUID(); // see if this is the first we've heard of this node... diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 251886f70c..f82e7e3101 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -393,3 +393,10 @@ void OctreeEditPacketSender::processNackPacket(const QByteArray& packet) { } } } + +void OctreeEditPacketSender::nodeKilled(SharedNodePointer node) { + // TODO: add locks + QUuid nodeUUID = node->getUUID(); + _pendingEditPackets.remove(nodeUUID); + _sentPacketHistories.remove(nodeUUID); +} diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index e9c616085f..c16c0a2d4b 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -91,7 +91,10 @@ public: // you must override these... virtual char getMyNodeType() const = 0; virtual void adjustEditPacketForClockSkew(unsigned char* codeColorBuffer, ssize_t length, int clockSkew) { }; - + +public slots: + void nodeKilled(SharedNodePointer node); + public: void processNackPacket(const QByteArray& packet); @@ -120,9 +123,9 @@ protected: unsigned short int _sequenceNumber; int _maxPacketSize; - // TODO: garbage-collect this and _pendingEditPackets - QHash _sentPacketHistories; - QMutex _releaseQueuedPacketMutex; + + // TODO: add locks for this and _pendingEditPackets + QHash _sentPacketHistories; }; #endif // hifi_OctreeEditPacketSender_h