From 4b244db1f7c8be453f2a1136e8720a073f76653f Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Wed, 7 Jul 2010 15:20:01 +0000 Subject: 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 --- cpp/src/qpid/broker/SignalHandler.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'cpp/src/qpid/broker/SignalHandler.cpp') 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 namespace qpid { namespace broker { -boost::intrusive_ptr 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& 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; } } -- cgit v1.2.1