diff options
author | Ted Ross <tross@apache.org> | 2009-10-20 20:38:11 +0000 |
---|---|---|
committer | Ted Ross <tross@apache.org> | 2009-10-20 20:38:11 +0000 |
commit | 8645f9099e7da2267f2eb0c94cd2e419db815435 (patch) | |
tree | a99c2783626ba9317b003cb3f84a07892c8788c5 /cpp/src | |
parent | db18d33d3bca740454c3c9e6c5e62f8bcc1e70d4 (diff) | |
download | qpid-python-8645f9099e7da2267f2eb0c94cd2e419db815435.tar.gz |
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.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@827783 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/qpid/broker/Broker.cpp | 8 | ||||
-rw-r--r-- | cpp/src/qpid/broker/Broker.h | 4 |
2 files changed, 6 insertions, 6 deletions
diff --git a/cpp/src/qpid/broker/Broker.cpp b/cpp/src/qpid/broker/Broker.cpp index f758f90a8b..d86f4f8223 100644 --- a/cpp/src/qpid/broker/Broker.cpp +++ b/cpp/src/qpid/broker/Broker.cpp @@ -140,6 +140,7 @@ Broker::Broker(const Broker::Options& conf) : 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 @@ Broker::Broker(const Broker::Options& conf) : 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 @@ Broker::Broker(const Broker::Options& conf) : 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 @@ Broker::Broker(const Broker::Options& conf) : 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"); diff --git a/cpp/src/qpid/broker/Broker.h b/cpp/src/qpid/broker/Broker.h index ed21270334..54d3de2257 100644 --- a/cpp/src/qpid/broker/Broker.h +++ b/cpp/src/qpid/broker/Broker.h @@ -130,13 +130,13 @@ public: 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 @@ public: void setRecovery(bool set) { recovery = set; } bool getRecovery() const { return recovery; } - management::ManagementAgent* getManagementAgent() { return managementAgent; } + management::ManagementAgent* getManagementAgent() { return managementAgent.get(); } }; }} |