diff options
author | Alan Conway <aconway@apache.org> | 2010-07-07 15:20:01 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2010-07-07 15:20:01 +0000 |
commit | 7732decc05fd6bde9b758c1cb4a482b0391c1478 (patch) | |
tree | 2167b53dfea6ed7bc1391b22764c6908f222e378 /cpp | |
parent | 4c678fc32b10d5cf63c3b39c5df32b7ee5933e95 (diff) | |
download | qpid-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.cpp | 2 | ||||
-rw-r--r-- | cpp/src/qpid/broker/SignalHandler.cpp | 20 | ||||
-rw-r--r-- | cpp/src/qpid/broker/SignalHandler.h | 10 |
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 |