From 165d9cb4734734882082d472db91aabc846c6909 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Tue, 27 Apr 2010 14:09:31 +0000 Subject: QPID-664: allow safe closing of session as part of handling a session exception git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@938460 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/client/amqp0_10/SessionImpl.cpp | 36 ++++++++++++++++++---------- 1 file changed, 23 insertions(+), 13 deletions(-) (limited to 'cpp/src/qpid/client/amqp0_10/SessionImpl.cpp') diff --git a/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp b/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp index 15a936465b..a55a2737cb 100644 --- a/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp +++ b/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp @@ -61,6 +61,12 @@ void SessionImpl::checkError() s.get()->assertOpen(); } +bool SessionImpl::hasError() +{ + qpid::client::SessionBase_0_10Access s(session); + return s.get()->hasError(); +} + void SessionImpl::sync(bool block) { if (block) retry(); @@ -105,22 +111,26 @@ void SessionImpl::release(qpid::messaging::Message& m) void SessionImpl::close() { - //close all the senders and receivers (get copy of names and then - //make the calls to avoid modifying maps while iterating over - //them): - std::vector s; - std::vector r; - { - qpid::sys::Mutex::ScopedLock l(lock); - for (Senders::const_iterator i = senders.begin(); i != senders.end(); ++i) s.push_back(i->first); - for (Receivers::const_iterator i = receivers.begin(); i != receivers.end(); ++i) r.push_back(i->first); + if (hasError()) { + senders.clear(); + receivers.clear(); + } else { + //close all the senders and receivers (get copy of names and then + //make the calls to avoid modifying maps while iterating over + //them): + std::vector s; + std::vector r; + { + qpid::sys::Mutex::ScopedLock l(lock); + for (Senders::const_iterator i = senders.begin(); i != senders.end(); ++i) s.push_back(i->first); + for (Receivers::const_iterator i = receivers.begin(); i != receivers.end(); ++i) r.push_back(i->first); + } + for (std::vector::const_iterator i = s.begin(); i != s.end(); ++i) getSender(*i).close(); + for (std::vector::const_iterator i = r.begin(); i != r.end(); ++i) getReceiver(*i).close(); } - for (std::vector::const_iterator i = s.begin(); i != s.end(); ++i) getSender(*i).close(); - for (std::vector::const_iterator i = r.begin(); i != r.end(); ++i) getReceiver(*i).close(); - connection->closed(*this); - session.close(); + if (!hasError()) session.close(); } template boost::intrusive_ptr getImplPtr(T& t) -- cgit v1.2.1