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]