summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2008-08-07 13:56:47 +0000
committerTed Ross <tross@apache.org>2008-08-07 13:56:47 +0000
commit87317fb32beea5c78506afce0be739c2a90b098e (patch)
tree9af3b2c2923bf1ef0d15731a0c14ff7af7ce2517 /cpp
parented5d40386e04fd75ea8051102abcb3a1f1f53ddd (diff)
downloadqpid-python-87317fb32beea5c78506afce0be739c2a90b098e.tar.gz
On broker shutdown, re-join the timer thread outside of a locked scope to prevent deadlock.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@683619 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/qpid/management/ManagementBroker.cpp32
1 files changed, 17 insertions, 15 deletions
diff --git a/cpp/src/qpid/management/ManagementBroker.cpp b/cpp/src/qpid/management/ManagementBroker.cpp
index 6a3e61cfe4..1bdd8ab836 100644
--- a/cpp/src/qpid/management/ManagementBroker.cpp
+++ b/cpp/src/qpid/management/ManagementBroker.cpp
@@ -90,24 +90,26 @@ ManagementBroker::ManagementBroker () :
ManagementBroker::~ManagementBroker ()
{
- Mutex::ScopedLock lock (userLock);
-
- // Reset the shared pointers to exchanges. If this is not done now, the exchanges
- // will stick around until dExchange and mExchange are implicitely destroyed (long
- // after this destructor completes). Those exchanges hold references to management
- // objects that will be invalid.
- dExchange.reset();
- mExchange.reset();
timer.stop();
+ {
+ Mutex::ScopedLock lock (userLock);
- moveNewObjectsLH();
- for (ManagementObjectMap::iterator iter = managementObjects.begin ();
- iter != managementObjects.end ();
- iter++) {
- ManagementObject* object = iter->second;
- delete object;
+ // Reset the shared pointers to exchanges. If this is not done now, the exchanges
+ // will stick around until dExchange and mExchange are implicitely destroyed (long
+ // after this destructor completes). Those exchanges hold references to management
+ // objects that will be invalid.
+ dExchange.reset();
+ mExchange.reset();
+
+ moveNewObjectsLH();
+ for (ManagementObjectMap::iterator iter = managementObjects.begin ();
+ iter != managementObjects.end ();
+ iter++) {
+ ManagementObject* object = iter->second;
+ delete object;
+ }
+ managementObjects.clear();
}
- managementObjects.clear();
}
void ManagementBroker::configure(string _dataDir, uint16_t _interval, Manageable* _broker, int _threads)