summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2009-10-20 20:38:11 +0000
committerTed Ross <tross@apache.org>2009-10-20 20:38:11 +0000
commit8645f9099e7da2267f2eb0c94cd2e419db815435 (patch)
treea99c2783626ba9317b003cb3f84a07892c8788c5 /cpp/src
parentdb18d33d3bca740454c3c9e6c5e62f8bcc1e70d4 (diff)
downloadqpid-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.cpp8
-rw-r--r--cpp/src/qpid/broker/Broker.h4
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(); }
};
}}