use single instance of SharedAssignmentPointer for assignment client so we actually get reference counting

This commit is contained in:
ZappoMan 2014-03-31 14:08:19 -07:00
parent d4193a2170
commit faa062f8ab
10 changed files with 47 additions and 26 deletions

View file

@ -25,11 +25,12 @@
const QString ASSIGNMENT_CLIENT_TARGET_NAME = "assignment-client"; const QString ASSIGNMENT_CLIENT_TARGET_NAME = "assignment-client";
const long long ASSIGNMENT_REQUEST_INTERVAL_MSECS = 1 * 1000; const long long ASSIGNMENT_REQUEST_INTERVAL_MSECS = 1 * 1000;
SharedAssignmentPointer AssignmentClient::_currentAssignment;
int hifiSockAddrMeta = qRegisterMetaType<HifiSockAddr>("HifiSockAddr"); int hifiSockAddrMeta = qRegisterMetaType<HifiSockAddr>("HifiSockAddr");
AssignmentClient::AssignmentClient(int &argc, char **argv) : AssignmentClient::AssignmentClient(int &argc, char **argv) :
QCoreApplication(argc, argv), QCoreApplication(argc, argv)
_currentAssignment()
{ {
setOrganizationName("High Fidelity"); setOrganizationName("High Fidelity");
setOrganizationDomain("highfidelity.io"); setOrganizationDomain("highfidelity.io");

View file

@ -17,14 +17,18 @@ class AssignmentClient : public QCoreApplication {
Q_OBJECT Q_OBJECT
public: public:
AssignmentClient(int &argc, char **argv); AssignmentClient(int &argc, char **argv);
static const SharedAssignmentPointer& getCurrentAssignment() { return _currentAssignment; }
private slots: private slots:
void sendAssignmentRequest(); void sendAssignmentRequest();
void readPendingDatagrams(); void readPendingDatagrams();
void assignmentCompleted(); void assignmentCompleted();
void handleAuthenticationRequest(); void handleAuthenticationRequest();
private: private:
Assignment _requestAssignment; Assignment _requestAssignment;
SharedAssignmentPointer _currentAssignment; static SharedAssignmentPointer _currentAssignment;
}; };
#endif /* defined(__hifi__AssignmentClient__) */ #endif /* defined(__hifi__AssignmentClient__) */

View file

@ -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... // Create octree sending thread...
_octreeSendThread = new OctreeSendThread(octreeServer, node); _octreeSendThread = new OctreeSendThread(myAssignment, node);
_octreeSendThread->initialize(true); _octreeSendThread->initialize(true);
} }

View file

@ -19,9 +19,9 @@
#include <OctreeElementBag.h> #include <OctreeElementBag.h>
#include <OctreeSceneStats.h> #include <OctreeSceneStats.h>
#include "OctreeServer.h"
class OctreeSendThread; class OctreeSendThread;
class OctreeServer;
typedef QSharedPointer<OctreeServer> SharedOctreeServerPointer;
class OctreeQueryNode : public OctreeQuery { class OctreeQueryNode : public OctreeQuery {
Q_OBJECT Q_OBJECT
@ -84,7 +84,7 @@ public:
OctreeSceneStats stats; OctreeSceneStats stats;
void initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node); void initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node);
bool isOctreeSendThreadInitalized() { return _octreeSendThread; } bool isOctreeSendThreadInitalized() { return _octreeSendThread; }
void dumpOutOfView(); void dumpOutOfView();

View file

@ -19,8 +19,9 @@
quint64 startSceneSleepTime = 0; quint64 startSceneSleepTime = 0;
quint64 endSceneSleepTime = 0; quint64 endSceneSleepTime = 0;
OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node) : OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) :
_myServer(myServer), _myAssignment(myAssignment),
_myServer(static_cast<OctreeServer*>(myAssignment.data())),
_node(node), _node(node),
_nodeUUID(node->getUUID()), _nodeUUID(node->getUUID()),
_packetData(), _packetData(),
@ -28,7 +29,7 @@ OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, Sh
_processLock(), _processLock(),
_isShuttingDown(false) _isShuttingDown(false)
{ {
qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer.data() << "]: client connected " qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer << "]: client connected "
"- starting sending thread [" << this << "]"; "- starting sending thread [" << this << "]";
OctreeServer::clientConnected(); OctreeServer::clientConnected();
@ -37,23 +38,22 @@ OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, Sh
OctreeSendThread::~OctreeSendThread() { OctreeSendThread::~OctreeSendThread() {
QString serverName(_myServer->getMyServerName()); QString serverName(_myServer->getMyServerName());
qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: client disconnected " qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected "
"- ending sending thread [" << this << "]"; "- ending sending thread [" << this << "]";
OctreeServer::clientDisconnected(); OctreeServer::clientDisconnected();
qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: "
"- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]"
"line: " << __LINE__; "line: " << __LINE__;
_node.clear(); _node.clear();
qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: "
"- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]"
"line: " << __LINE__; "line: " << __LINE__;
void* serverPtr = _myServer.data(); _myAssignment.clear();
_myServer.clear();
qDebug() << qPrintable(serverName) << "server [" << serverPtr << "]: " qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: "
"- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]"
"line: " << __LINE__; "line: " << __LINE__;
} }
@ -73,7 +73,7 @@ bool OctreeSendThread::process() {
} }
// check that our WeakPointer to our server is still valid // 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 return false; // exit early if it's not, it means the server is shutting down
} }

View file

@ -13,6 +13,12 @@
#include <GenericThread.h> #include <GenericThread.h>
#include <NetworkPacket.h> #include <NetworkPacket.h>
#include <OctreeElementBag.h> #include <OctreeElementBag.h>
class OctreeServer;
class OctreeQueryNode;
#include "OctreeQueryNode.h" #include "OctreeQueryNode.h"
#include "OctreeServer.h" #include "OctreeServer.h"
@ -20,7 +26,7 @@
class OctreeSendThread : public GenericThread { class OctreeSendThread : public GenericThread {
Q_OBJECT Q_OBJECT
public: public:
OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node); OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node);
virtual ~OctreeSendThread(); virtual ~OctreeSendThread();
void setIsShuttingDown(); void setIsShuttingDown();
@ -37,7 +43,8 @@ protected:
virtual bool process(); virtual bool process();
private: private:
SharedOctreeServerPointer _myServer; SharedAssignmentPointer _myAssignment;
OctreeServer* _myServer;
SharedNodePointer _node; SharedNodePointer _node;
QUuid _nodeUUID; QUuid _nodeUUID;

View file

@ -16,6 +16,8 @@
#include <Logging.h> #include <Logging.h>
#include <UUID.h> #include <UUID.h>
#include "../AssignmentClient.h"
#include "OctreeServer.h" #include "OctreeServer.h"
#include "OctreeServerConsts.h" #include "OctreeServerConsts.h"
@ -854,7 +856,8 @@ void OctreeServer::readPendingDatagrams() {
if (debug) { if (debug) {
qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode;
} }
nodeData->initializeOctreeSendThread(SharedOctreeServerPointer(this), matchingNode); SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment();
nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode);
} }
} }
} else if (packetType == PacketTypeJurisdictionRequest) { } else if (packetType == PacketTypeJurisdictionRequest) {

View file

@ -20,6 +20,10 @@
#include <ThreadedAssignment.h> #include <ThreadedAssignment.h>
#include <EnvironmentData.h> #include <EnvironmentData.h>
class OctreeServer;
class OctreeQueryNode;
class OctreeSendThread;
#include "OctreePersistThread.h" #include "OctreePersistThread.h"
#include "OctreeSendThread.h" #include "OctreeSendThread.h"
#include "OctreeServerConsts.h" #include "OctreeServerConsts.h"
@ -27,8 +31,8 @@
const int DEFAULT_PACKETS_PER_INTERVAL = 2000; // some 120,000 packets per second total const int DEFAULT_PACKETS_PER_INTERVAL = 2000; // some 120,000 packets per second total
class OctreeServer; //class OctreeServer;
typedef QSharedPointer<OctreeServer> SharedOctreeServerPointer; //typedef QSharedPointer<OctreeServer> SharedOctreeServerPointer;
/// Handles assignments of type OctreeServer - sending octrees to various clients. /// Handles assignments of type OctreeServer - sending octrees to various clients.
class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler { class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler {

View file

@ -17,7 +17,6 @@ ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) :
Assignment(packet), Assignment(packet),
_isFinished(false) _isFinished(false)
{ {
} }
void ThreadedAssignment::setFinished(bool isFinished) { void ThreadedAssignment::setFinished(bool isFinished) {

View file

@ -13,6 +13,10 @@
#include "Assignment.h" #include "Assignment.h"
class ThreadedAssignment;
typedef QSharedPointer<ThreadedAssignment> SharedAssignmentPointer;
class ThreadedAssignment : public Assignment { class ThreadedAssignment : public Assignment {
Q_OBJECT Q_OBJECT
public: public:
@ -35,8 +39,7 @@ private slots:
void checkInWithDomainServerOrExit(); void checkInWithDomainServerOrExit();
signals: signals:
void finished(); void finished();
}; };
typedef QSharedPointer<ThreadedAssignment> SharedAssignmentPointer;
#endif /* defined(__hifi__ThreadedAssignment__) */ #endif /* defined(__hifi__ThreadedAssignment__) */