Author: tross
Date: Thu Aug 7 06:56:47 2008
New Revision: 683619
URL: http://svn.apache.org/viewvc?rev=683619&view=rev
Log:
On broker shutdown, re-join the timer thread outside of a locked scope to
prevent deadlock.
Modified:
incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp
URL:
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp?rev=683619&r1=683618&r2=683619&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp Thu
Aug 7 06:56:47 2008
@@ -90,24 +90,26 @@
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)