From f9718913e27c8eae0314bb340110d69c5441bae7 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 27 Feb 2014 16:13:05 -0800 Subject: [PATCH] fix octree-server random spinout sometimes when client disconnects --- .../src/octree/OctreeQueryNode.cpp | 22 ++++++++++--------- .../src/octree/OctreeSendThread.cpp | 14 +++++++++++- .../src/octree/OctreeSendThread.h | 3 +++ 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 633ee3ede1..3ff9d6820b 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -37,6 +37,18 @@ OctreeQueryNode::OctreeQueryNode() : _sequenceNumber = 0; } +OctreeQueryNode::~OctreeQueryNode() { + if (_octreeSendThread) { + _octreeSendThread->terminate(); + delete _octreeSendThread; + } + + delete[] _octreePacket; + delete[] _lastOctreePacket; +} + + + void OctreeQueryNode::initializeOctreeSendThread(OctreeServer* octreeServer, const QUuid& nodeUUID) { // Create octree sending thread... _octreeSendThread = new OctreeSendThread(nodeUUID, octreeServer); @@ -158,16 +170,6 @@ void OctreeQueryNode::writeToPacket(const unsigned char* buffer, int bytes) { } } -OctreeQueryNode::~OctreeQueryNode() { - if (_octreeSendThread) { - _octreeSendThread->terminate(); - delete _octreeSendThread; - } - - delete[] _octreePacket; - delete[] _lastOctreePacket; -} - bool OctreeQueryNode::updateCurrentViewFrustum() { bool currentViewFrustumChanged = false; ViewFrustum newestViewFrustum; diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 8e7d9c37c6..cbfa8f0415 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -20,7 +20,8 @@ quint64 endSceneSleepTime = 0; OctreeSendThread::OctreeSendThread(const QUuid& nodeUUID, OctreeServer* myServer) : _nodeUUID(nodeUUID), _myServer(myServer), - _packetData() + _packetData(), + _nodeMissingCount(0) { qDebug() << "client connected"; _myServer->clientConnected(); @@ -33,6 +34,14 @@ OctreeSendThread::~OctreeSendThread() { bool OctreeSendThread::process() { + + const int MAX_NODE_MISSING_CHECKS = 10; + if (_nodeMissingCount > MAX_NODE_MISSING_CHECKS) { + qDebug() << "our target node:" << _nodeUUID << "has been missing the last" << _nodeMissingCount + << "times we checked, we are going to stop attempting to send."; + return false; // stop processing and shutdown, our node no longer exists + } + quint64 start = usecTimestampNow(); bool gotLock = false; @@ -41,6 +50,7 @@ bool OctreeSendThread::process() { SharedNodePointer node = NodeList::getInstance()->nodeWithUUID(_nodeUUID); if (node) { + _nodeMissingCount = 0; // make sure the node list doesn't kill our node while we're using it if (node->getMutex().tryLock()) { gotLock = true; @@ -61,6 +71,8 @@ bool OctreeSendThread::process() { node->getMutex().unlock(); // we're done with this node for now. } + } else { + _nodeMissingCount++; } } else { if (_myServer->wantsDebugSending() && _myServer->wantsVerboseDebug()) { diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 3554dcdfef..081e7f411f 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -16,6 +16,7 @@ #include "OctreeQueryNode.h" #include "OctreeServer.h" + /// Threaded processor for sending voxel packets to a single client class OctreeSendThread : public GenericThread { public: @@ -41,6 +42,8 @@ private: int packetDistributor(const SharedNodePointer& node, OctreeQueryNode* nodeData, bool viewFrustumChanged); OctreePacketData _packetData; + + int _nodeMissingCount; }; #endif // __octree_server__OctreeSendThread__