You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2009/10/20 22:38:11 UTC

svn commit: r827783 - in /qpid/trunk/qpid/cpp/src/qpid/broker: Broker.cpp Broker.h

Author: tross
Date: Tue Oct 20 20:38:11 2009
New Revision: 827783

URL: http://svn.apache.org/viewvc?rev=827783&view=rev
Log:
Fixed memory leak on broker shutdown.  Broker's management agent pointer is now
a std::auto_ptr rather than a raw pointer.  The agent pointer was moved in front
of the registries in initialization order to prevent references to deleted management
objects when the registries are destroyed.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/Broker.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Broker.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.cpp?rev=827783&r1=827782&r2=827783&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Broker.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Broker.cpp Tue Oct 20 20:38:11 2009
@@ -140,6 +140,7 @@
     store(0),
     acl(0),
     dataDir(conf.noDataDir ? std::string() : conf.dataDir),
+    managementAgent(conf.enableMgmt ? new ManagementAgent() : 0),
     queues(this),
     exchanges(this),
     links(this),
@@ -150,7 +151,6 @@
             conf.replayFlushLimit*1024, // convert kb to bytes.
             conf.replayHardLimit*1024),
         *this),
-    managementAgent(conf.enableMgmt ? new ManagementAgent() : 0),
     queueCleaner(queues, timer),
     queueEvents(poller,!conf.asyncQueueEvents), 
     recovery(true),
@@ -161,12 +161,12 @@
         QPID_LOG(info, "Management enabled");
         managementAgent->configure(dataDir.isEnabled() ? dataDir.getPath() : string(),
                                    conf.mgmtPubInterval, this, conf.workerThreads + 3);
-        _qmf::Package packageInitializer(managementAgent);
+        _qmf::Package packageInitializer(managementAgent.get());
 
         System* system = new System (dataDir.isEnabled() ? dataDir.getPath() : string(), this);
         systemObject = System::shared_ptr(system);
 
-        mgmtObject = new _qmf::Broker(managementAgent, this, system, conf.port);
+        mgmtObject = new _qmf::Broker(managementAgent.get(), this, system, conf.port);
         mgmtObject->set_workerThreads(conf.workerThreads);
         mgmtObject->set_maxConns(conf.maxConnections);
         mgmtObject->set_connBacklog(conf.connectionBacklog);
@@ -242,7 +242,7 @@
         Exchange::shared_ptr mExchange = exchanges.get (qpid_management);
         Exchange::shared_ptr dExchange = exchanges.get (amq_direct);
         managementAgent->setExchange(mExchange, dExchange);
-        boost::dynamic_pointer_cast<ManagementExchange>(mExchange)->setManagmentAgent(managementAgent);
+        boost::dynamic_pointer_cast<ManagementExchange>(mExchange)->setManagmentAgent(managementAgent.get());
     }
     else
         QPID_LOG(info, "Management not enabled");

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h?rev=827783&r1=827782&r2=827783&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h Tue Oct 20 20:38:11 2009
@@ -130,13 +130,13 @@
     AclModule* acl;
     DataDir dataDir;
 
+    std::auto_ptr<management::ManagementAgent> managementAgent;
     QueueRegistry queues;
     ExchangeRegistry exchanges;
     LinkRegistry links;
     boost::shared_ptr<sys::ConnectionCodec::Factory> factory;
     DtxManager dtxManager;
     SessionManager sessionManager;
-    management::ManagementAgent* managementAgent;
     qmf::org::apache::qpid::broker::Broker* mgmtObject;
     Vhost::shared_ptr            vhostObject;
     System::shared_ptr           systemObject;
@@ -237,7 +237,7 @@
     void setRecovery(bool set) { recovery = set; }
     bool getRecovery() const { return recovery; }
 
-    management::ManagementAgent* getManagementAgent() { return managementAgent; }
+    management::ManagementAgent* getManagementAgent() { return managementAgent.get(); }
 };
 
 }}



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org