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)