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 2008/08/07 15:56:47 UTC
svn commit: r683619 -
/incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp
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)