From f3421ee2cf097f2a248e0457df5ac112d6725f71 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Wed, 16 Apr 2014 17:58:44 +0000 Subject: QPID-5704: use shared pointer to avoid dangling referece to domain git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1587998 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/qpid/broker/amqp/Domain.cpp | 30 +++++++++++++------------- qpid/cpp/src/qpid/broker/amqp/Domain.h | 3 ++- qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp | 4 ++-- qpid/cpp/src/qpid/broker/amqp/Interconnect.h | 3 +-- 4 files changed, 20 insertions(+), 20 deletions(-) (limited to 'qpid/cpp/src') diff --git a/qpid/cpp/src/qpid/broker/amqp/Domain.cpp b/qpid/cpp/src/qpid/broker/amqp/Domain.cpp index 500ec034f4..dc6ad052b7 100644 --- a/qpid/cpp/src/qpid/broker/amqp/Domain.cpp +++ b/qpid/cpp/src/qpid/broker/amqp/Domain.cpp @@ -31,7 +31,6 @@ #include "qpid/management/ManagementAgent.h" #include #include -#include namespace _qmf = qmf::org::apache::qpid::broker; @@ -134,9 +133,10 @@ bool get(const std::string& key, const qpid::types::Variant::Map& map) class InterconnectFactory : public BrokerContext, public qpid::sys::ConnectionCodec::Factory, public boost::enable_shared_from_this { public: - InterconnectFactory(bool incoming, const std::string& name, const qpid::types::Variant::Map& properties, Domain&, BrokerContext&); + InterconnectFactory(bool incoming, const std::string& name, const qpid::types::Variant::Map& properties, + boost::shared_ptr, BrokerContext&); InterconnectFactory(bool incoming, const std::string& name, const std::string& source, const std::string& target, - Domain&, BrokerContext&, boost::shared_ptr); + boost::shared_ptr, BrokerContext&, boost::shared_ptr); qpid::sys::ConnectionCodec* create(framing::ProtocolVersion, qpid::sys::OutputControl&, const std::string&, const qpid::sys::SecuritySettings&); qpid::sys::ConnectionCodec* create(qpid::sys::OutputControl&, const std::string&, const qpid::sys::SecuritySettings&); bool connect(); @@ -149,13 +149,13 @@ class InterconnectFactory : public BrokerContext, public qpid::sys::ConnectionCo qpid::Url url; qpid::Url::iterator next; std::string hostname; - Domain& domain; + boost::shared_ptr domain; qpid::Address address; boost::shared_ptr relay; }; -InterconnectFactory::InterconnectFactory(bool i, const std::string& n, const qpid::types::Variant::Map& properties, Domain& d, BrokerContext& c) - : BrokerContext(c), incoming(i), name(n), url(d.getUrl()), domain(d) +InterconnectFactory::InterconnectFactory(bool i, const std::string& n, const qpid::types::Variant::Map& properties, boost::shared_ptr d, BrokerContext& c) + : BrokerContext(c), incoming(i), name(n), url(d->getUrl()), domain(d) { get(source, SOURCE, properties); get(target, TARGET, properties); @@ -163,8 +163,8 @@ InterconnectFactory::InterconnectFactory(bool i, const std::string& n, const qpi } InterconnectFactory::InterconnectFactory(bool i, const std::string& n, const std::string& source_, const std::string& target_, - Domain& d, BrokerContext& c, boost::shared_ptr relay_) - : BrokerContext(c), incoming(i), name(n), source(source_), target(target_), url(d.getUrl()), domain(d), relay(relay_) + boost::shared_ptr d, BrokerContext& c, boost::shared_ptr relay_) + : BrokerContext(c), incoming(i), name(n), source(source_), target(target_), url(d->getUrl()), domain(d), relay(relay_) { next = url.begin(); } @@ -175,20 +175,20 @@ qpid::sys::ConnectionCodec* InterconnectFactory::create(qpid::framing::ProtocolV } qpid::sys::ConnectionCodec* InterconnectFactory::create(qpid::sys::OutputControl& out, const std::string& id, const qpid::sys::SecuritySettings& t) { - bool useSasl = domain.getMechanisms() != NONE; - boost::shared_ptr connection(new Interconnect(out, id, *this, useSasl, incoming, name, source, target, domain)); + bool useSasl = domain->getMechanisms() != NONE; + boost::shared_ptr connection(new Interconnect(out, id, *this, useSasl, incoming, name, source, target)); if (!relay) getInterconnects().add(name, connection); else connection->setRelay(relay); std::auto_ptr codec; if (useSasl) { QPID_LOG(info, "Using AMQP 1.0 (with SASL layer) on connect"); - codec = std::auto_ptr(new qpid::broker::amqp::SaslClient(out, id, connection, domain.sasl(hostname), hostname, domain.getMechanisms(), t)); + codec = std::auto_ptr(new qpid::broker::amqp::SaslClient(out, id, connection, domain->sasl(hostname), hostname, domain->getMechanisms(), t)); } else { QPID_LOG(info, "Using AMQP 1.0 (no SASL layer) on connect"); codec = std::auto_ptr(new Wrapper(connection)); } - domain.removePending(shared_from_this());//(TODO: add support for retry on connection failure) + domain->removePending(shared_from_this());//(TODO: add support for retry on connection failure) return codec.release(); } @@ -207,7 +207,7 @@ void InterconnectFactory::failed(int, std::string text) { QPID_LOG (info, "Inter-broker connection failed (" << address << "): " << text); if (!connect()) { - domain.removePending(shared_from_this());//give up (TODO: add support for periodic retry) + domain->removePending(shared_from_this());//give up (TODO: add support for periodic retry) } } @@ -268,14 +268,14 @@ std::auto_ptr Domain::sasl(const std::string& hostname) void Domain::connect(bool incoming, const std::string& name, const qpid::types::Variant::Map& properties, BrokerContext& context) { - boost::shared_ptr factory(new InterconnectFactory(incoming, name, properties, *this, context)); + boost::shared_ptr factory(new InterconnectFactory(incoming, name, properties, shared_from_this(), context)); factory->connect(); addPending(factory); } void Domain::connect(bool incoming, const std::string& name, const std::string& source, const std::string& target, BrokerContext& context, boost::shared_ptr relay) { - boost::shared_ptr factory(new InterconnectFactory(incoming, name, source, target, *this, context, relay)); + boost::shared_ptr factory(new InterconnectFactory(incoming, name, source, target, shared_from_this(), context, relay)); factory->connect(); addPending(factory); } diff --git a/qpid/cpp/src/qpid/broker/amqp/Domain.h b/qpid/cpp/src/qpid/broker/amqp/Domain.h index ce7c590cfb..7ee8572c8a 100644 --- a/qpid/cpp/src/qpid/broker/amqp/Domain.h +++ b/qpid/cpp/src/qpid/broker/amqp/Domain.h @@ -30,6 +30,7 @@ #include "qpid/sys/Mutex.h" #include "qmf/org/apache/qpid/broker/Domain.h" #include +#include #include #include @@ -46,7 +47,7 @@ class InterconnectFactory; class BrokerContext; class Relay; -class Domain : public PersistableObject, public qpid::management::Manageable +class Domain : public PersistableObject, public qpid::management::Manageable, public boost::enable_shared_from_this { public: Domain(const std::string& name, const qpid::types::Variant::Map& properties, Broker&); diff --git a/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp b/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp index c99166e481..649a21775a 100644 --- a/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp +++ b/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp @@ -40,8 +40,8 @@ namespace broker { namespace amqp { Interconnect::Interconnect(qpid::sys::OutputControl& out, const std::string& id, BrokerContext& broker, bool saslInUse, - bool i, const std::string& n, const std::string& s, const std::string& t, Domain& d) - : Connection(out, id, broker, true), incoming(i), name(n), source(s), target(t), domain(d), headerDiscarded(saslInUse), + bool i, const std::string& n, const std::string& s, const std::string& t) + : Connection(out, id, broker, true), incoming(i), name(n), source(s), target(t), headerDiscarded(saslInUse), closeRequested(false), isTransportDeleted(false) {} diff --git a/qpid/cpp/src/qpid/broker/amqp/Interconnect.h b/qpid/cpp/src/qpid/broker/amqp/Interconnect.h index 86b80ad129..cd35110873 100644 --- a/qpid/cpp/src/qpid/broker/amqp/Interconnect.h +++ b/qpid/cpp/src/qpid/broker/amqp/Interconnect.h @@ -38,7 +38,7 @@ class Interconnect : public Connection { public: Interconnect(qpid::sys::OutputControl& out, const std::string& id, BrokerContext& broker, bool saslInUse, - bool incoming, const std::string& name, const std::string& source, const std::string& target, Domain&); + bool incoming, const std::string& name, const std::string& source, const std::string& target); void setRelay(boost::shared_ptr); ~Interconnect(); size_t encode(char* buffer, size_t size); @@ -50,7 +50,6 @@ class Interconnect : public Connection std::string name; std::string source; std::string target; - Domain& domain; bool headerDiscarded; boost::shared_ptr relay; bool closeRequested; -- cgit v1.2.1