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 long long ASSIGNMENT_REQUEST_INTERVAL_MSECS = 1 * 1000;
SharedAssignmentPointer AssignmentClient::_currentAssignment;
int hifiSockAddrMeta = qRegisterMetaType<HifiSockAddr>("HifiSockAddr");
AssignmentClient::AssignmentClient(int &argc, char **argv) :
QCoreApplication(argc, argv),
_currentAssignment()
QCoreApplication(argc, argv)
{
setOrganizationName("High Fidelity");
setOrganizationDomain("highfidelity.io");

View file

@ -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__) */

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...
_octreeSendThread = new OctreeSendThread(octreeServer, node);
_octreeSendThread = new OctreeSendThread(myAssignment, node);
_octreeSendThread->initialize(true);
}

View file

@ -19,9 +19,9 @@
#include <OctreeElementBag.h>
#include <OctreeSceneStats.h>
#include "OctreeServer.h"
class OctreeSendThread;
class OctreeServer;
typedef QSharedPointer<OctreeServer> 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();

View file

@ -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<OctreeServer*>(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
}

View file

@ -13,6 +13,12 @@
#include <GenericThread.h>
#include <NetworkPacket.h>
#include <OctreeElementBag.h>
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;

View file

@ -16,6 +16,8 @@
#include <Logging.h>
#include <UUID.h>
#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) {

View file

@ -20,6 +20,10 @@
#include <ThreadedAssignment.h>
#include <EnvironmentData.h>
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<OctreeServer> SharedOctreeServerPointer;
//class OctreeServer;
//typedef QSharedPointer<OctreeServer> SharedOctreeServerPointer;
/// Handles assignments of type OctreeServer - sending octrees to various clients.
class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler {

View file

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

View file

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