diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 978f090ec2..e4db44eea4 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -194,21 +194,24 @@ void AssignmentClient::handleAuthenticationRequest() { } void AssignmentClient::assignmentCompleted() { +qDebug() << "START AssignmentClient::assignmentCompleted()... this=" << this << "_currentAssignment=" << _currentAssignment; + // reset the logging target to the the CHILD_TARGET_NAME Logging::setTargetName(ASSIGNMENT_CLIENT_TARGET_NAME); qDebug("Assignment finished or never started - waiting for new assignment."); NodeList* nodeList = NodeList::getInstance(); + + // reset our NodeList by switching back to unassigned and clearing the list + nodeList->reset(); + nodeList->setOwnerType(NodeType::Unassigned); + nodeList->resetNodeInterestSet(); // have us handle incoming NodeList datagrams again disconnect(&nodeList->getNodeSocket(), 0, _currentAssignment, 0); connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, this, &AssignmentClient::readPendingDatagrams); +qDebug() << "DONE AssignmentClient::assignmentCompleted()... this=" << this << "_currentAssignment was=" << _currentAssignment; _currentAssignment = NULL; - - // reset our NodeList by switching back to unassigned and clearing the list - nodeList->setOwnerType(NodeType::Unassigned); - nodeList->reset(); - nodeList->resetNodeInterestSet(); } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 2490640952..83d4a6c082 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -23,12 +23,23 @@ OctreeSendThread::OctreeSendThread(const QUuid& nodeUUID, OctreeServer* myServer _packetData(), _nodeMissingCount(0) { - qDebug() << "client connected - starting sending thread"; + QString safeServerName("Octree"); + if (_myServer) { + safeServerName = _myServer->getMyServerName(); + } + qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client connected " + "- starting sending thread [" << this << "]"; + OctreeServer::clientConnected(); } OctreeSendThread::~OctreeSendThread() { - qDebug() << "client disconnected - ending sending thread"; + QString safeServerName("Octree"); + if (_myServer) { + safeServerName = _myServer->getMyServerName(); + } + qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected " + "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); } diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 34b457a8f7..82839e06b3 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -195,9 +195,11 @@ OctreeServer::OctreeServer(const QByteArray& packet) : { _instance = this; _averageLoopTime.updateAverage(0); + qDebug() << "Octree server starting... [" << this << "]"; } OctreeServer::~OctreeServer() { + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "]"; if (_parsedArgV) { for (int i = 0; i < _argc; i++) { delete[] _parsedArgV[i]; @@ -222,7 +224,7 @@ OctreeServer::~OctreeServer() { delete _jurisdiction; _jurisdiction = NULL; - qDebug() << "OctreeServer::~OctreeServer()... DONE"; + qDebug() << qPrintable(_safeServerName) << "server DONE shutting down... [" << this << "]"; } void OctreeServer::initHTTPManager(int port) { @@ -808,6 +810,7 @@ void OctreeServer::readPendingDatagrams() { } void OctreeServer::run() { + _safeServerName = getMyServerName(); // Before we do anything else, create our tree... _tree = createTree(); @@ -863,6 +866,7 @@ void OctreeServer::run() { connect(nodeList, SIGNAL(nodeAdded(SharedNodePointer)), SLOT(nodeAdded(SharedNodePointer))); connect(nodeList, SIGNAL(nodeKilled(SharedNodePointer)),SLOT(nodeKilled(SharedNodePointer))); + // we need to ask the DS about agents so we can ping/reply with them nodeList->addNodeTypeToInterestSet(NodeType::Agent); @@ -984,13 +988,26 @@ void OctreeServer::run() { void OctreeServer::nodeAdded(SharedNodePointer node) { // we might choose to use this notifier to track clients in a pending state - qDebug() << "OctreeServer::nodeAdded() node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server added node:" << *node; } void OctreeServer::nodeKilled(SharedNodePointer node) { + qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { - nodeData->scheduleForDelete(); + qDebug() << qPrintable(_safeServerName) << "server resetting Linked Data for node:" << *node; + node->setLinkedData(NULL); // set this first in case another thread comes through and tryes to acces this + qDebug() << qPrintable(_safeServerName) << "server deleting Linked Data for node:" << *node; + delete nodeData; } } +void OctreeServer::aboutToFinish() { + qDebug() << qPrintable(_safeServerName) << "server STARTING about to finish..."; + foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) { + qDebug() << qPrintable(_safeServerName) << "server about to finish while node still connected node:" << *node; + nodeKilled(node); + } + qDebug() << qPrintable(_safeServerName) << "server ENDING about to finish..."; +} + diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 44fca6f124..12091170d9 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -98,6 +98,8 @@ public: static float getAveragePacketSendingTime() { return _averagePacketSendingTime.getAverage(); } bool handleHTTPRequest(HTTPConnection* connection, const QString& path); + + virtual void aboutToFinish(); public slots: /// runs the voxel server assignment @@ -134,6 +136,7 @@ protected: time_t _started; quint64 _startedUSecs; + QString _safeServerName; static int _clientCount; static SimpleMovingAverage _averageLoopTime; diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index e2d42883f6..c4282028ae 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -29,6 +29,7 @@ void ThreadedAssignment::setFinished(bool isFinished) { _isFinished = isFinished; if (_isFinished) { + aboutToFinish(); emit finished(); } } diff --git a/libraries/shared/src/ThreadedAssignment.h b/libraries/shared/src/ThreadedAssignment.h index 25489a8e25..a3cf2a1e31 100644 --- a/libraries/shared/src/ThreadedAssignment.h +++ b/libraries/shared/src/ThreadedAssignment.h @@ -9,21 +9,24 @@ #ifndef __hifi__ThreadedAssignment__ #define __hifi__ThreadedAssignment__ +#include + #include "Assignment.h" class ThreadedAssignment : public Assignment { Q_OBJECT public: ThreadedAssignment(const QByteArray& packet); - void setFinished(bool isFinished); + + virtual void aboutToFinish() { }; + public slots: /// threaded run of assignment virtual void run() = 0; - virtual void deleteLater(); - virtual void readPendingDatagrams() = 0; + protected: bool readAvailableDatagram(QByteArray& destinationByteArray, HifiSockAddr& senderSockAddr);