From faa062f8ab4793c520e5f50b752bfca9a76eb8c3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:08:19 -0700 Subject: [PATCH] use single instance of SharedAssignmentPointer for assignment client so we actually get reference counting --- assignment-client/src/AssignmentClient.cpp | 5 +++-- assignment-client/src/AssignmentClient.h | 6 +++++- .../src/octree/OctreeQueryNode.cpp | 4 ++-- .../src/octree/OctreeQueryNode.h | 6 +++--- .../src/octree/OctreeSendThread.cpp | 20 +++++++++---------- .../src/octree/OctreeSendThread.h | 11 ++++++++-- assignment-client/src/octree/OctreeServer.cpp | 5 ++++- assignment-client/src/octree/OctreeServer.h | 8 ++++++-- libraries/shared/src/ThreadedAssignment.cpp | 1 - libraries/shared/src/ThreadedAssignment.h | 7 +++++-- 10 files changed, 47 insertions(+), 26 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index aa20f2ff29..8795dc5bc4 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -25,11 +25,12 @@ const QString ASSIGNMENT_CLIENT_TARGET_NAME = "assignment-client"; const long long ASSIGNMENT_REQUEST_INTERVAL_MSECS = 1 * 1000; +SharedAssignmentPointer AssignmentClient::_currentAssignment; + int hifiSockAddrMeta = qRegisterMetaType("HifiSockAddr"); AssignmentClient::AssignmentClient(int &argc, char **argv) : - QCoreApplication(argc, argv), - _currentAssignment() + QCoreApplication(argc, argv) { setOrganizationName("High Fidelity"); setOrganizationDomain("highfidelity.io"); diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index c267c6238b..1b61fb3efe 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -17,14 +17,18 @@ class AssignmentClient : public QCoreApplication { Q_OBJECT public: AssignmentClient(int &argc, char **argv); + + static const SharedAssignmentPointer& getCurrentAssignment() { return _currentAssignment; } + private slots: void sendAssignmentRequest(); void readPendingDatagrams(); void assignmentCompleted(); void handleAuthenticationRequest(); + private: Assignment _requestAssignment; - SharedAssignmentPointer _currentAssignment; + static SharedAssignmentPointer _currentAssignment; }; #endif /* defined(__hifi__AssignmentClient__) */ diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index ab7b2f65fd..77d36f69fa 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -76,9 +76,9 @@ void OctreeQueryNode::deleteLater() { } -void OctreeQueryNode::initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node) { +void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) { // Create octree sending thread... - _octreeSendThread = new OctreeSendThread(octreeServer, node); + _octreeSendThread = new OctreeSendThread(myAssignment, node); _octreeSendThread->initialize(true); } diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index ace1235908..66e4e5b0bb 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -19,9 +19,9 @@ #include #include +#include "OctreeServer.h" + class OctreeSendThread; -class OctreeServer; -typedef QSharedPointer SharedOctreeServerPointer; class OctreeQueryNode : public OctreeQuery { Q_OBJECT @@ -84,7 +84,7 @@ public: OctreeSceneStats stats; - void initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node); + void initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node); bool isOctreeSendThreadInitalized() { return _octreeSendThread; } void dumpOutOfView(); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index c760963310..8fe2fb6f30 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -19,8 +19,9 @@ quint64 startSceneSleepTime = 0; quint64 endSceneSleepTime = 0; -OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node) : - _myServer(myServer), +OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) : + _myAssignment(myAssignment), + _myServer(static_cast(myAssignment.data())), _node(node), _nodeUUID(node->getUUID()), _packetData(), @@ -28,7 +29,7 @@ OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, Sh _processLock(), _isShuttingDown(false) { - qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer.data() << "]: client connected " + qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; OctreeServer::clientConnected(); @@ -37,23 +38,22 @@ OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, Sh OctreeSendThread::~OctreeSendThread() { QString serverName(_myServer->getMyServerName()); - qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: client disconnected " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); - qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "line: " << __LINE__; _node.clear(); - qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "line: " << __LINE__; - void* serverPtr = _myServer.data(); - _myServer.clear(); + _myAssignment.clear(); - qDebug() << qPrintable(serverName) << "server [" << serverPtr << "]: " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "line: " << __LINE__; } @@ -73,7 +73,7 @@ bool OctreeSendThread::process() { } // check that our WeakPointer to our server is still valid - if (_myServer.isNull()) { + if (!_myServer || _myAssignment.isNull()) { return false; // exit early if it's not, it means the server is shutting down } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index bcaa9baf0e..a341a5be7d 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -13,6 +13,12 @@ #include #include #include + + +class OctreeServer; +class OctreeQueryNode; + + #include "OctreeQueryNode.h" #include "OctreeServer.h" @@ -20,7 +26,7 @@ class OctreeSendThread : public GenericThread { Q_OBJECT public: - OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node); + OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node); virtual ~OctreeSendThread(); void setIsShuttingDown(); @@ -37,7 +43,8 @@ protected: virtual bool process(); private: - SharedOctreeServerPointer _myServer; + SharedAssignmentPointer _myAssignment; + OctreeServer* _myServer; SharedNodePointer _node; QUuid _nodeUUID; diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index e5c8cd262c..3134b577ae 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -16,6 +16,8 @@ #include #include +#include "../AssignmentClient.h" + #include "OctreeServer.h" #include "OctreeServerConsts.h" @@ -854,7 +856,8 @@ void OctreeServer::readPendingDatagrams() { if (debug) { qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; } - nodeData->initializeOctreeSendThread(SharedOctreeServerPointer(this), matchingNode); + SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); + nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); } } } else if (packetType == PacketTypeJurisdictionRequest) { diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index ff9452170d..6405dc986e 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -20,6 +20,10 @@ #include #include +class OctreeServer; +class OctreeQueryNode; +class OctreeSendThread; + #include "OctreePersistThread.h" #include "OctreeSendThread.h" #include "OctreeServerConsts.h" @@ -27,8 +31,8 @@ const int DEFAULT_PACKETS_PER_INTERVAL = 2000; // some 120,000 packets per second total -class OctreeServer; -typedef QSharedPointer SharedOctreeServerPointer; +//class OctreeServer; +//typedef QSharedPointer SharedOctreeServerPointer; /// Handles assignments of type OctreeServer - sending octrees to various clients. class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler { diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index fdf2d91c36..66c0ca750d 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -17,7 +17,6 @@ ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : Assignment(packet), _isFinished(false) { - } void ThreadedAssignment::setFinished(bool isFinished) { diff --git a/libraries/shared/src/ThreadedAssignment.h b/libraries/shared/src/ThreadedAssignment.h index f9652dd98d..32118997a9 100644 --- a/libraries/shared/src/ThreadedAssignment.h +++ b/libraries/shared/src/ThreadedAssignment.h @@ -13,6 +13,10 @@ #include "Assignment.h" + +class ThreadedAssignment; +typedef QSharedPointer SharedAssignmentPointer; + class ThreadedAssignment : public Assignment { Q_OBJECT public: @@ -35,8 +39,7 @@ private slots: void checkInWithDomainServerOrExit(); signals: void finished(); -}; + }; -typedef QSharedPointer SharedAssignmentPointer; #endif /* defined(__hifi__ThreadedAssignment__) */