From 9950ed9f9fc723b11ec1cb08cbe9896643dafbff Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 30 Sep 2014 14:57:32 -0700 Subject: [PATCH] use auto_ptr in NodeList and LimitedNodeList for cleaner mem management --- interface/src/Application.cpp | 2 ++ libraries/networking/src/LimitedNodeList.cpp | 25 ++++++++--------- libraries/networking/src/LimitedNodeList.h | 2 +- libraries/networking/src/NodeList.cpp | 29 ++++++++------------ libraries/networking/src/NodeList.h | 2 -- 5 files changed, 26 insertions(+), 34 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0e63c3dfb2..4550d3f95c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -232,6 +232,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // put the NodeList and datagram processing on the node thread NodeList* nodeList = NodeList::createInstance(NodeType::Agent, listenPort); + + qDebug() << "NL pointer is" << nodeList; nodeList->moveToThread(_nodeThread); _datagramProcessor.moveToThread(_nodeThread); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index d42cab6210..202e3e3c8a 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -35,29 +35,26 @@ const char SOLO_NODE_TYPES[2] = { const QUrl DEFAULT_NODE_AUTH_URL = QUrl("https://data.highfidelity.io"); -LimitedNodeList* LimitedNodeList::_sharedInstance = NULL; +std::auto_ptr LimitedNodeList::_sharedInstance; LimitedNodeList* LimitedNodeList::createInstance(unsigned short socketListenPort, unsigned short dtlsPort) { - if (!_sharedInstance) { - NodeType::init(); - - _sharedInstance = new LimitedNodeList(socketListenPort, dtlsPort); + NodeType::init(); + + delete _sharedInstance.release(); + _sharedInstance = std::auto_ptr(new LimitedNodeList(socketListenPort, dtlsPort)); + + // register the SharedNodePointer meta-type for signals/slots + qRegisterMetaType(); - // register the SharedNodePointer meta-type for signals/slots - qRegisterMetaType(); - } else { - qDebug("LimitedNodeList createInstance called with existing instance."); - } - - return _sharedInstance; + return _sharedInstance.get(); } LimitedNodeList* LimitedNodeList::getInstance() { - if (!_sharedInstance) { + if (!_sharedInstance.get()) { qDebug("LimitedNodeList getInstance called before call to createInstance. Returning NULL pointer."); } - return _sharedInstance; + return _sharedInstance.get(); } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 337d66616e..cf33970d53 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -118,7 +118,7 @@ signals: void nodeKilled(SharedNodePointer); void publicSockAddrChanged(const HifiSockAddr& publicSockAddr); protected: - static LimitedNodeList* _sharedInstance; + static std::auto_ptr _sharedInstance; LimitedNodeList(unsigned short socketListenPort, unsigned short dtlsListenPort); LimitedNodeList(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 7ae9f9ba00..c130b72c22 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -24,30 +24,25 @@ #include "SharedUtil.h" #include "UUID.h" -NodeList* NodeList::_sharedInstance = NULL; - NodeList* NodeList::createInstance(char ownerType, unsigned short socketListenPort, unsigned short dtlsPort) { - if (!_sharedInstance) { - NodeType::init(); - - _sharedInstance = new NodeList(ownerType, socketListenPort, dtlsPort); - LimitedNodeList::_sharedInstance = _sharedInstance; - - // register the SharedNodePointer meta-type for signals/slots - qRegisterMetaType(); - } else { - qDebug("NodeList createInstance called with existing instance."); - } - - return _sharedInstance; + + NodeType::init(); + + delete _sharedInstance.release(); + _sharedInstance = std::auto_ptr(new NodeList(ownerType, socketListenPort, dtlsPort)); + + // register the SharedNodePointer meta-type for signals/slots + qRegisterMetaType(); + + return static_cast(_sharedInstance.get()); } NodeList* NodeList::getInstance() { - if (!_sharedInstance) { + if (!_sharedInstance.get()) { qDebug("NodeList getInstance called before call to createInstance. Returning NULL pointer."); } - return _sharedInstance; + return static_cast(_sharedInstance.get()); } NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned short dtlsListenPort) : diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index d17e56fd48..8293d0a05a 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -84,8 +84,6 @@ public slots: signals: void limitOfSilentDomainCheckInsReached(); private: - static NodeList* _sharedInstance; - NodeList(char ownerType, unsigned short socketListenPort, unsigned short dtlsListenPort); NodeList(NodeList const&); // Don't implement, needed to avoid copies of singleton void operator=(NodeList const&); // Don't implement, needed to avoid copies of singleton