summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2010-07-07 15:20:01 +0000
committerAlan Conway <aconway@apache.org>2010-07-07 15:20:01 +0000
commit7732decc05fd6bde9b758c1cb4a482b0391c1478 (patch)
tree2167b53dfea6ed7bc1391b22764c6908f222e378 /cpp
parent4c678fc32b10d5cf63c3b39c5df32b7ee5933e95 (diff)
downloadqpid-python-7732decc05fd6bde9b758c1cb4a482b0391c1478.tar.gz
Ensure broker is deleted in main thread, not by global destructors.
This fixes a race condition that was not handled by r959746. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@961404 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/posix/QpiddBroker.cpp2
-rw-r--r--cpp/src/qpid/broker/SignalHandler.cpp20
-rw-r--r--cpp/src/qpid/broker/SignalHandler.h10
3 files changed, 18 insertions, 14 deletions
diff --git a/cpp/src/posix/QpiddBroker.cpp b/cpp/src/posix/QpiddBroker.cpp
index bc45b27a2a..879935462e 100644
--- a/cpp/src/posix/QpiddBroker.cpp
+++ b/cpp/src/posix/QpiddBroker.cpp
@@ -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); }
};
diff --git a/cpp/src/qpid/broker/SignalHandler.cpp b/cpp/src/qpid/broker/SignalHandler.cpp
index b565cfd419..16c141f21c 100644
--- a/cpp/src/qpid/broker/SignalHandler.cpp
+++ b/cpp/src/qpid/broker/SignalHandler.cpp
@@ -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;
}
}
diff --git a/cpp/src/qpid/broker/SignalHandler.h b/cpp/src/qpid/broker/SignalHandler.h
index bbe831b61d..7bfa9ea630 100644
--- a/cpp/src/qpid/broker/SignalHandler.h
+++ b/cpp/src/qpid/broker/SignalHandler.h
@@ -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