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]

Reply via email to