Author: aconway
Date: Wed Jul  7 15:20:01 2010
New Revision: 961404

URL: http://svn.apache.org/viewvc?rev=961404&view=rev
Log:
Ensure broker is deleted in main thread,  not by global destructors.
    
This fixes a race condition that was not handled by r959746.

Modified:
    qpid/trunk/qpid/cpp/src/posix/QpiddBroker.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/SignalHandler.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/SignalHandler.h

Modified: qpid/trunk/qpid/cpp/src/posix/QpiddBroker.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/posix/QpiddBroker.cpp?rev=961404&r1=961403&r2=961404&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/posix/QpiddBroker.cpp (original)
+++ qpid/trunk/qpid/cpp/src/posix/QpiddBroker.cpp Wed Jul  7 15:20:01 2010
@@ -113,7 +113,7 @@ void QpiddOptions::usage() const {
 // 
 struct ScopedSetBroker {
     ScopedSetBroker(const boost::intrusive_ptr<Broker>& broker) {
-        qpid::broker::SignalHandler::setBroker(broker);
+        qpid::broker::SignalHandler::setBroker(broker.get());
     }
     ~ScopedSetBroker() { qpid::broker::SignalHandler::setBroker(0); }
 };

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/SignalHandler.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/SignalHandler.cpp?rev=961404&r1=961403&r2=961404&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/SignalHandler.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/SignalHandler.cpp Wed Jul  7 15:20:01 
2010
@@ -20,30 +20,34 @@
  */
 #include "qpid/broker/SignalHandler.h"
 #include "qpid/broker/Broker.h"
+#include "qpid/sys/Mutex.h"
 #include <signal.h>
 
 namespace qpid {
 namespace broker {
 
-boost::intrusive_ptr<Broker> SignalHandler::broker;
+// Lock is to ensure that broker is not concurrently set to 0 and
+// deleted while we are in a call to broker->shutdown()
 
-void SignalHandler::setBroker(const boost::intrusive_ptr<Broker>& b) {
-    broker = b;
+sys::Mutex brokerLock;
+Broker* SignalHandler::broker;
 
+void SignalHandler::setBroker(Broker* b) {
+    sys::Mutex::ScopedLock l(brokerLock);
+    broker = b;
     signal(SIGINT,shutdownHandler); 
     signal(SIGTERM, shutdownHandler);
-
-    signal(SIGHUP,SIG_IGN); // TODO aconway 2007-07-18: reload config.
-
+    signal(SIGHUP,SIG_IGN);
     signal(SIGCHLD,SIG_IGN); 
 }
 
 void SignalHandler::shutdown() { shutdownHandler(0); }
 
 void SignalHandler::shutdownHandler(int) {
-    if (broker.get()) {
+    sys::Mutex::ScopedLock l(brokerLock);
+    if (broker) {
         broker->shutdown();
-        broker = 0;             // Release the broker reference.
+        broker = 0;
     }
 }
 

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/SignalHandler.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/SignalHandler.h?rev=961404&r1=961403&r2=961404&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/SignalHandler.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/SignalHandler.h Wed Jul  7 15:20:01 2010
@@ -22,8 +22,6 @@
  *
  */
 
-#include <boost/intrusive_ptr.hpp>
-
 namespace qpid {
 namespace broker {
 
@@ -35,15 +33,17 @@ class Broker;
 class SignalHandler
 {
   public:
-    /** Set the broker to be shutdown on signals */
-    static void setBroker(const boost::intrusive_ptr<Broker>& broker);
+    /** Set the broker to be shutdown on signals.
+     * Must be reset by calling setBroker(0) before the broker is deleted.
+     */
+    static void setBroker(Broker* broker);
 
     /** Initiate shut-down of broker */
     static void shutdown();
 
   private:
     static void shutdownHandler(int);
-    static boost::intrusive_ptr<Broker> broker;
+    static Broker* broker;
 };
 }} // namespace qpid::broker
 



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to