From 5560a0fb4d967d33b68e618ccf5d48bde728b4ce Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 23 Jan 2014 17:03:11 -0800 Subject: [PATCH] fix crash on shutdown of interface --- .../octree/src/OctreeScriptingInterface.cpp | 27 ++++++++++++------- .../octree/src/OctreeScriptingInterface.h | 3 +++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/libraries/octree/src/OctreeScriptingInterface.cpp b/libraries/octree/src/OctreeScriptingInterface.cpp index 7355b8e2de..553ab961df 100644 --- a/libraries/octree/src/OctreeScriptingInterface.cpp +++ b/libraries/octree/src/OctreeScriptingInterface.cpp @@ -6,6 +6,8 @@ // Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // +#include + #include "OctreeScriptingInterface.h" OctreeScriptingInterface::OctreeScriptingInterface(OctreeEditPacketSender* packetSender, @@ -16,18 +18,21 @@ OctreeScriptingInterface::OctreeScriptingInterface(OctreeEditPacketSender* packe } OctreeScriptingInterface::~OctreeScriptingInterface() { - //printf("OctreeScriptingInterface::~OctreeScriptingInterface()\n"); + cleanupManagedObjects(); +} + +void OctreeScriptingInterface::cleanupManagedObjects() { if (_managedJurisdictionListener) { - //printf("OctreeScriptingInterface::~OctreeScriptingInterface() _managedJurisdictionListener... _jurisdictionListener->terminate()\n"); _jurisdictionListener->terminate(); - //printf("OctreeScriptingInterface::~OctreeScriptingInterface() _managedJurisdictionListener... deleting _jurisdictionListener\n"); - delete _jurisdictionListener; + _jurisdictionListener->deleteLater(); + _managedJurisdictionListener = false; + _jurisdictionListener = NULL; } if (_managedPacketSender) { - //printf("OctreeScriptingInterface::~OctreeScriptingInterface() _managedJurisdictionListener... _packetSender->terminate()\n"); _packetSender->terminate(); - //printf("OctreeScriptingInterface::~OctreeScriptingInterface() _managedPacketSender... deleting _packetSender\n"); - delete _packetSender; + _packetSender->deleteLater(); + _managedPacketSender = false; + _packetSender = NULL; } } @@ -40,13 +45,11 @@ void OctreeScriptingInterface::setJurisdictionListener(JurisdictionListener* jur } void OctreeScriptingInterface::init() { - //printf("OctreeScriptingInterface::init()\n"); if (_jurisdictionListener) { _managedJurisdictionListener = false; } else { _managedJurisdictionListener = true; _jurisdictionListener = new JurisdictionListener(getServerNodeType()); - //qDebug("OctreeScriptingInterface::init() _managedJurisdictionListener=true, creating _jurisdictionListener=%p", _jurisdictionListener); _jurisdictionListener->initialize(true); } @@ -55,7 +58,11 @@ void OctreeScriptingInterface::init() { } else { _managedPacketSender = true; _packetSender = createPacketSender(); - //qDebug("OctreeScriptingInterface::init() _managedPacketSender=true, creating _packetSender=%p", _packetSender); _packetSender->setServerJurisdictions(_jurisdictionListener->getJurisdictions()); } + + if (QCoreApplication::instance()) { + connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(cleanupManagedObjects())); + } + } diff --git a/libraries/octree/src/OctreeScriptingInterface.h b/libraries/octree/src/OctreeScriptingInterface.h index b9466fb9e9..1158f21438 100644 --- a/libraries/octree/src/OctreeScriptingInterface.h +++ b/libraries/octree/src/OctreeScriptingInterface.h @@ -84,6 +84,9 @@ public slots: /// returns the total bytes queued by this object over its lifetime long long unsigned int getLifetimeBytesQueued() const { return _packetSender->getLifetimeBytesQueued(); } + // TODO: hmmm... we don't want this called from JS, how to handle that? + void cleanupManagedObjects(); + protected: /// attached OctreeEditPacketSender that handles queuing and sending of packets to VS OctreeEditPacketSender* _packetSender;