summaryrefslogtreecommitdiff
path: root/qpid/cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2014-04-16 17:58:44 +0000
committerGordon Sim <gsim@apache.org>2014-04-16 17:58:44 +0000
commitf3421ee2cf097f2a248e0457df5ac112d6725f71 (patch)
tree0683b0bc582f07315a2c7a788da2f9ecc13a45c5 /qpid/cpp
parente4ed932e12ed2ad7d586ce0c01cb6862e7120659 (diff)
downloadqpid-python-f3421ee2cf097f2a248e0457df5ac112d6725f71.tar.gz
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
Diffstat (limited to 'qpid/cpp')
-rw-r--r--qpid/cpp/src/qpid/broker/amqp/Domain.cpp30
-rw-r--r--qpid/cpp/src/qpid/broker/amqp/Domain.h3
-rw-r--r--qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp4
-rw-r--r--qpid/cpp/src/qpid/broker/amqp/Interconnect.h3
4 files changed, 20 insertions, 20 deletions
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 <boost/shared_ptr.hpp>
#include <boost/lexical_cast.hpp>
-#include <boost/enable_shared_from_this.hpp>
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<InterconnectFactory>
{
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<Domain>, BrokerContext&);
InterconnectFactory(bool incoming, const std::string& name, const std::string& source, const std::string& target,
- Domain&, BrokerContext&, boost::shared_ptr<Relay>);
+ boost::shared_ptr<Domain>, BrokerContext&, boost::shared_ptr<Relay>);
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> domain;
qpid::Address address;
boost::shared_ptr<Relay> 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<Domain> 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> relay_)
- : BrokerContext(c), incoming(i), name(n), source(source_), target(target_), url(d.getUrl()), domain(d), relay(relay_)
+ boost::shared_ptr<Domain> d, BrokerContext& c, boost::shared_ptr<Relay> 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<Interconnect> connection(new Interconnect(out, id, *this, useSasl, incoming, name, source, target, domain));
+ bool useSasl = domain->getMechanisms() != NONE;
+ boost::shared_ptr<Interconnect> connection(new Interconnect(out, id, *this, useSasl, incoming, name, source, target));
if (!relay) getInterconnects().add(name, connection);
else connection->setRelay(relay);
std::auto_ptr<qpid::sys::ConnectionCodec> codec;
if (useSasl) {
QPID_LOG(info, "Using AMQP 1.0 (with SASL layer) on connect");
- codec = std::auto_ptr<qpid::sys::ConnectionCodec>(new qpid::broker::amqp::SaslClient(out, id, connection, domain.sasl(hostname), hostname, domain.getMechanisms(), t));
+ codec = std::auto_ptr<qpid::sys::ConnectionCodec>(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<qpid::sys::ConnectionCodec>(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<qpid::Sasl> 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<InterconnectFactory> factory(new InterconnectFactory(incoming, name, properties, *this, context));
+ boost::shared_ptr<InterconnectFactory> 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> relay)
{
- boost::shared_ptr<InterconnectFactory> factory(new InterconnectFactory(incoming, name, source, target, *this, context, relay));
+ boost::shared_ptr<InterconnectFactory> 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 <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
#include <memory>
#include <set>
@@ -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<Domain>
{
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<Relay>);
~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> relay;
bool closeRequested;