diff options
author | Alan Conway <aconway@apache.org> | 2009-10-08 18:28:42 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2009-10-08 18:28:42 +0000 |
commit | 550ee85ea3ac31cedec277b3f4af0b24f5385e77 (patch) | |
tree | 9d1cc8cf4289aab49c40ad09127226f37aa5718b /cpp | |
parent | bdefa56cae58cdbef08a6c9023a82368e1e9d322 (diff) | |
download | qpid-python-550ee85ea3ac31cedec277b3f4af0b24f5385e77.tar.gz |
Cluster shuts down broker via SignalHandler to fix memory errors on exit.
The SignalHandler holds a global reference to the broker which needs
to be reset otherwise there are problems when the broker by a global
destructor.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@823258 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/qpid/broker/SignalHandler.cpp | 2 | ||||
-rw-r--r-- | cpp/src/qpid/broker/SignalHandler.h | 3 | ||||
-rw-r--r-- | cpp/src/qpid/cluster/Cluster.cpp | 3 | ||||
-rw-r--r-- | cpp/src/tests/PartialFailure.cpp | 6 |
4 files changed, 10 insertions, 4 deletions
diff --git a/cpp/src/qpid/broker/SignalHandler.cpp b/cpp/src/qpid/broker/SignalHandler.cpp index f4a3822554..b565cfd419 100644 --- a/cpp/src/qpid/broker/SignalHandler.cpp +++ b/cpp/src/qpid/broker/SignalHandler.cpp @@ -38,6 +38,8 @@ void SignalHandler::setBroker(const boost::intrusive_ptr<Broker>& b) { signal(SIGCHLD,SIG_IGN); } +void SignalHandler::shutdown() { shutdownHandler(0); } + void SignalHandler::shutdownHandler(int) { if (broker.get()) { broker->shutdown(); diff --git a/cpp/src/qpid/broker/SignalHandler.h b/cpp/src/qpid/broker/SignalHandler.h index d2cdfae07c..bbe831b61d 100644 --- a/cpp/src/qpid/broker/SignalHandler.h +++ b/cpp/src/qpid/broker/SignalHandler.h @@ -38,6 +38,9 @@ class SignalHandler /** Set the broker to be shutdown on signals */ static void setBroker(const boost::intrusive_ptr<Broker>& broker); + /** Initiate shut-down of broker */ + static void shutdown(); + private: static void shutdownHandler(int); static boost::intrusive_ptr<Broker> broker; diff --git a/cpp/src/qpid/cluster/Cluster.cpp b/cpp/src/qpid/cluster/Cluster.cpp index d440068781..0706fc72e8 100644 --- a/cpp/src/qpid/cluster/Cluster.cpp +++ b/cpp/src/qpid/cluster/Cluster.cpp @@ -99,6 +99,7 @@ #include "qpid/broker/Connection.h" #include "qpid/broker/QueueRegistry.h" #include "qpid/broker/SessionState.h" +#include "qpid/broker/SignalHandler.h" #include "qpid/framing/AMQFrame.h" #include "qpid/framing/AMQP_AllOperations.h" #include "qpid/framing/AllInvoker.h" @@ -311,7 +312,7 @@ void Cluster::leave(Lock&) { // Finalize connections now now to avoid problems later in destructor. LEAVE_TRY(localConnections.clear()); LEAVE_TRY(connections.clear()); - LEAVE_TRY(broker.shutdown()); + LEAVE_TRY(broker::SignalHandler::shutdown()); } } diff --git a/cpp/src/tests/PartialFailure.cpp b/cpp/src/tests/PartialFailure.cpp index 08c326cd02..5de8ecb189 100644 --- a/cpp/src/tests/PartialFailure.cpp +++ b/cpp/src/tests/PartialFailure.cpp @@ -93,7 +93,7 @@ QPID_AUTO_TEST_CASE(testCoincidentErrors) { c0.session.queueDeclare("q", durable=true); { - // ScopedSuppressLogging allQuiet; + ScopedSuppressLogging allQuiet; async(c0.session).messageTransfer(content=pMessage("TEST_STORE_DO: s0[exception]", "q")); async(c1.session).messageTransfer(content=pMessage("TEST_STORE_DO: s1[exception]", "q")); @@ -118,7 +118,7 @@ QPID_AUTO_TEST_CASE(testNormalErrors) { Client c2(cluster[2], "c2"); { - // ScopedSuppressLogging allQuiet; + ScopedSuppressLogging allQuiet; queueAndSub(c0); c0.session.messageTransfer(content=Message("x", "c0")); BOOST_CHECK_EQUAL(c0.lq.get(TIMEOUT).getData(), "x"); @@ -147,7 +147,7 @@ QPID_AUTO_TEST_CASE(testErrorAfterJoin) { ClusterFixture cluster(1, updateArgs, -1); Client c0(cluster[0]); { - // ScopedSuppressLogging allQuiet; + ScopedSuppressLogging allQuiet; c0.session.queueDeclare("q", durable=true); c0.session.messageTransfer(content=pMessage("a", "q")); |