Author: gsim
Date: Wed Apr 16 17:58:44 2014
New Revision: 1587998
URL: http://svn.apache.org/r1587998
Log:
QPID-5704: use shared pointer to avoid dangling referece to domain
Modified:
qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Domain.cpp
qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Domain.h
qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp
qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.h
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Domain.cpp
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Domain.cpp?rev=1587998&r1=1587997&r2=1587998&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Domain.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Domain.cpp Wed Apr 16 17:58:44 2014
@@ -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 q
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 Broke
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
}
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* Interconnect
}
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, st
{
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(c
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);
}
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Domain.h
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Domain.h?rev=1587998&r1=1587997&r2=1587998&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Domain.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Domain.h Wed Apr 16 17:58:44 2014
@@ -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&);
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp?rev=1587998&r1=1587997&r2=1587998&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.cpp Wed Apr 16
17:58:44 2014
@@ -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)
{}
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.h
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.h?rev=1587998&r1=1587997&r2=1587998&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Interconnect.h Wed Apr 16 17:58:44
2014
@@ -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;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]