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)


Reply via email to