You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2010/03/19 18:04:18 UTC

svn commit: r925332 - in /qpid/trunk/qpid/cpp: examples/messaging/ include/qpid/messaging/ src/qpid/client/amqp0_10/ src/tests/

Author: gsim
Date: Fri Mar 19 17:04:18 2010
New Revision: 925332

URL: http://svn.apache.org/viewvc?rev=925332&view=rev
Log:
QPID-664: Prevent dangling pointers when receiver/sender handles stay in scope after connection/session handles goes out of scope. This change require connections to be closed explicitly to avoid leaking memory.

Modified:
    qpid/trunk/qpid/cpp/examples/messaging/client.cpp
    qpid/trunk/qpid/cpp/examples/messaging/drain.cpp
    qpid/trunk/qpid/cpp/examples/messaging/map_receiver.cpp
    qpid/trunk/qpid/cpp/examples/messaging/map_sender.cpp
    qpid/trunk/qpid/cpp/examples/messaging/queue_receiver.cpp
    qpid/trunk/qpid/cpp/examples/messaging/queue_sender.cpp
    qpid/trunk/qpid/cpp/examples/messaging/server.cpp
    qpid/trunk/qpid/cpp/examples/messaging/spout.cpp
    qpid/trunk/qpid/cpp/examples/messaging/topic_receiver.cpp
    qpid/trunk/qpid/cpp/examples/messaging/topic_sender.cpp
    qpid/trunk/qpid/cpp/include/qpid/messaging/Connection.h
    qpid/trunk/qpid/cpp/include/qpid/messaging/Session.h
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.h
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.h
    qpid/trunk/qpid/cpp/src/tests/qpid_recv.cpp
    qpid/trunk/qpid/cpp/src/tests/qpid_send.cpp
    qpid/trunk/qpid/cpp/src/tests/qpid_stream.cpp

Modified: qpid/trunk/qpid/cpp/examples/messaging/client.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/client.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/client.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/client.cpp Fri Mar 19 17:04:18 2010
@@ -39,8 +39,8 @@ using std::string;
 int main(int argc, char** argv) {
     const char* url = argc>1 ? argv[1] : "amqp:tcp:127.0.0.1:5672";
 
+    Connection connection;
     try {
-        Connection connection;
         connection.open(url);
         Session session = connection.newSession();
 
@@ -70,6 +70,7 @@ int main(int argc, char** argv) {
         return 0;
     } catch(const std::exception& error) {
         std::cout << error.what() << std::endl;
+        connection.close();
     }
     return 1;
 }

Modified: qpid/trunk/qpid/cpp/examples/messaging/drain.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/drain.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/drain.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/drain.cpp Fri Mar 19 17:04:18 2010
@@ -93,8 +93,8 @@ int main(int argc, char** argv)
 {
     Options options(argv[0]);
     if (options.parse(argc, argv)) {
+        Connection connection(options.connectionOptions);
         try {
-            Connection connection(options.connectionOptions);
             connection.open(options.url);
             Session session = connection.newSession();
             Receiver receiver = session.createReceiver(options.address);
@@ -116,6 +116,7 @@ int main(int argc, char** argv)
             return 0;
         } catch(const std::exception& error) {
             std::cout << error.what() << std::endl;
+            connection.close();
         }
     }
     return 1;   

Modified: qpid/trunk/qpid/cpp/examples/messaging/map_receiver.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/map_receiver.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/map_receiver.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/map_receiver.cpp Fri Mar 19 17:04:18 2010
@@ -38,8 +38,8 @@ using std::string;
 int main(int argc, char** argv) {
     const char* url = argc>1 ? argv[1] : "amqp:tcp:127.0.0.1:5672";
 
+    Connection connection;
     try {
-        Connection connection;
         connection.open(url);
         Session session = connection.newSession();
         Receiver receiver = session.createReceiver("message_queue");
@@ -52,6 +52,7 @@ int main(int argc, char** argv) {
         return 0;
     } catch(const std::exception& error) {
         std::cout << error.what() << std::endl;
+        connection.close();
     }
     return 1;   
 }

Modified: qpid/trunk/qpid/cpp/examples/messaging/map_sender.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/map_sender.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/map_sender.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/map_sender.cpp Fri Mar 19 17:04:18 2010
@@ -37,9 +37,8 @@ using std::string;
 
 int main(int argc, char** argv) {
     const char* url = argc>1 ? argv[1] : "amqp:tcp:127.0.0.1:5672";
-
+    Connection connection;
     try {
-        Connection connection;
         connection.open(url);
         Session session = connection.newSession();
         Sender sender = session.createSender("message_queue");
@@ -64,6 +63,7 @@ int main(int argc, char** argv) {
         return 0;
     } catch(const std::exception& error) {
         std::cout << error.what() << std::endl;
+        connection.close();
     }
     return 1;
 }

Modified: qpid/trunk/qpid/cpp/examples/messaging/queue_receiver.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/queue_receiver.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/queue_receiver.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/queue_receiver.cpp Fri Mar 19 17:04:18 2010
@@ -31,8 +31,8 @@ using namespace qpid::messaging;
 int main(int argc, char** argv) {
     const char* url = argc>1 ? argv[1] : "amqp:tcp:127.0.0.1:5672";
 
+    Connection connection;
     try {
-        Connection connection;
         connection.open(url);
         Session session = connection.newSession();
         Receiver receiver = session.createReceiver("message_queue");
@@ -51,6 +51,7 @@ int main(int argc, char** argv) {
         return 0;
     } catch(const std::exception& error) {
         std::cout << error.what() << std::endl;
+        connection.close();
     }
     return 1;   
 }

Modified: qpid/trunk/qpid/cpp/examples/messaging/queue_sender.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/queue_sender.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/queue_sender.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/queue_sender.cpp Fri Mar 19 17:04:18 2010
@@ -34,8 +34,8 @@ int main(int argc, char** argv) {
     const char* url = argc>1 ? argv[1] : "amqp:tcp:127.0.0.1:5672";
     int count = argc>2 ? atoi(argv[2]) : 10;
 
+    Connection connection;
     try {
-        Connection connection;
         connection.open(url);
         Session session = connection.newSession();
         Sender sender = session.createSender("message_queue");
@@ -50,10 +50,10 @@ int main(int argc, char** argv) {
 	// And send a final message to indicate termination.    	
         sender.send(Message("That's all, folks!"));
         session.sync();
-        connection.close();
         return 0;
     } catch(const std::exception& error) {
         std::cout << error.what() << std::endl;
+        connection.close();
     }
     return 1;
 }

Modified: qpid/trunk/qpid/cpp/examples/messaging/server.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/server.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/server.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/server.cpp Fri Mar 19 17:04:18 2010
@@ -41,8 +41,8 @@ using std::string;
 int main(int argc, char** argv) {
     const char* url = argc>1 ? argv[1] : "amqp:tcp:127.0.0.1:5672";
 
+    Connection connection;
     try {
-        Connection connection;
         connection.open(url);
         Session session = connection.newSession();
         Receiver receiver = session.createReceiver("service_queue; {create: always}");
@@ -70,6 +70,7 @@ int main(int argc, char** argv) {
         return 0;
     } catch(const std::exception& error) {
         std::cout << error.what() << std::endl;
+        connection.close();
     }
     return 1;
 }

Modified: qpid/trunk/qpid/cpp/examples/messaging/spout.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/spout.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/spout.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/spout.cpp Fri Mar 19 17:04:18 2010
@@ -156,8 +156,8 @@ int main(int argc, char** argv)
 {
     Options options(argv[0]);
     if (options.parse(argc, argv)) {        
+        Connection connection(options.connectionOptions);
         try {
-            Connection connection(options.connectionOptions);
             connection.open(options.url);
             Session session = connection.newSession();
             Sender sender = session.createSender(options.address);
@@ -183,6 +183,7 @@ int main(int argc, char** argv)
             return 0;
         } catch(const std::exception& error) {
             std::cout << error.what() << std::endl;
+            connection.close();
         }
     }
     return 1;

Modified: qpid/trunk/qpid/cpp/examples/messaging/topic_receiver.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/topic_receiver.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/topic_receiver.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/topic_receiver.cpp Fri Mar 19 17:04:18 2010
@@ -34,8 +34,8 @@ int main(int argc, char** argv) {
     const std::string url = argc>1 ? argv[1] : "amqp:tcp:127.0.0.1:5672";
     const std::string pattern = argc>2 ? argv[2] : "#.#";
 
+    Connection connection;
     try {
-        Connection connection;
         connection.open(url);
         Session session = connection.newSession();
         Receiver receiver = session.createReceiver("news_service; {filter:[control, " + pattern + "]}");
@@ -53,6 +53,7 @@ int main(int argc, char** argv) {
         return 0;
     } catch(const std::exception& error) {
         std::cout << error.what() << std::endl;
+        connection.close();
     }
     return 1;   
 }

Modified: qpid/trunk/qpid/cpp/examples/messaging/topic_sender.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/topic_sender.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/topic_sender.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/topic_sender.cpp Fri Mar 19 17:04:18 2010
@@ -51,8 +51,8 @@ int main(int argc, char** argv) {
     const char* url = argc>1 ? argv[1] : "amqp:tcp:127.0.0.1:5672";
     int count = argc>2 ? atoi(argv[2]) : 10;
 
+    Connection connection;
     try {
-        Connection connection;
         connection.open(url);
         Session session = connection.newSession();
         Sender sender = session.createSender("news_service");
@@ -72,6 +72,7 @@ int main(int argc, char** argv) {
         return 0;
     } catch(const std::exception& error) {
         std::cout << error.what() << std::endl;
+        connection.close();
     }
     return 1;
 }

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Connection.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Connection.h?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Connection.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Connection.h Fri Mar 19 17:04:18 2010
@@ -80,6 +80,11 @@ class Connection : public qpid::messagin
     QPID_CLIENT_EXTERN Connection& operator=(const Connection&);
     QPID_CLIENT_EXTERN void setOption(const std::string& name, const Variant& value);
     QPID_CLIENT_EXTERN void open(const std::string& url);
+    /**
+     * Closes a connection and all sessions associated with it. An
+     * opened connection must be closed before the last handle is
+     * allowed to go out of scope.
+     */
     QPID_CLIENT_EXTERN void close();
     QPID_CLIENT_EXTERN Session newSession(bool transactional, const std::string& name = std::string());
     QPID_CLIENT_EXTERN Session newSession(const std::string& name = std::string());

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Session.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Session.h?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Session.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Session.h Fri Mar 19 17:04:18 2010
@@ -58,6 +58,12 @@ class Session : public qpid::messaging::
     QPID_CLIENT_EXTERN ~Session();
     QPID_CLIENT_EXTERN Session& operator=(const Session&);
 
+    /**
+     * Closes a session and all associated senders and receivers. An
+     * opened session should be closed before the last handle to it
+     * goes out of scope. All a connections sessions can be closed by
+     * a call to Connection::close().
+     */
     QPID_CLIENT_EXTERN void close();
 
     QPID_CLIENT_EXTERN void commit();

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.cpp Fri Mar 19 17:04:18 2010
@@ -57,14 +57,14 @@ qpid::messaging::Message ReceiverImpl::f
 bool ReceiverImpl::get(qpid::messaging::Message& message, qpid::messaging::Duration timeout)
 {
     Get f(*this, message, timeout);
-    while (!parent.execute(f)) {}
+    while (!parent->execute(f)) {}
     return f.result;
 }
 
 bool ReceiverImpl::fetch(qpid::messaging::Message& message, qpid::messaging::Duration timeout)
 {
     Fetch f(*this, message, timeout);
-    while (!parent.execute(f)) {}
+    while (!parent->execute(f)) {}
     return f.result;
 }
 
@@ -112,7 +112,7 @@ void ReceiverImpl::init(qpid::client::As
     }
     if (state == CANCELLED) {
         source->cancel(session, destination);
-        parent.receiverCancelled(destination);        
+        parent->receiverCancelled(destination);        
     } else {
         source->subscribe(session, destination);
         start();
@@ -129,23 +129,23 @@ uint32_t ReceiverImpl::getCapacity()
 
 uint32_t ReceiverImpl::available()
 {
-    return parent.available(destination);
+    return parent->available(destination);
 }
 
 uint32_t ReceiverImpl::pendingAck()
 {
-    return parent.pendingAck(destination);
+    return parent->pendingAck(destination);
 }
 
 ReceiverImpl::ReceiverImpl(SessionImpl& p, const std::string& name, 
                            const qpid::messaging::Address& a) : 
 
-    parent(p), destination(name), address(a), byteCredit(0xFFFFFFFF), 
+    parent(&p), destination(name), address(a), byteCredit(0xFFFFFFFF), 
     state(UNRESOLVED), capacity(0), window(0) {}
 
 bool ReceiverImpl::getImpl(qpid::messaging::Message& message, qpid::messaging::Duration timeout)
 {
-    return parent.get(*this, message, timeout);
+    return parent->get(*this, message, timeout);
 }
 
 bool ReceiverImpl::fetchImpl(qpid::messaging::Message& message, qpid::messaging::Duration timeout)
@@ -172,7 +172,7 @@ void ReceiverImpl::closeImpl() 
     if (state != CANCELLED) {
         state = CANCELLED;
         source->cancel(session, destination);
-        parent.receiverCancelled(destination);
+        parent->receiverCancelled(destination);
     }
 }
 
@@ -188,7 +188,7 @@ void ReceiverImpl::setCapacityImpl(uint3
 }
 qpid::messaging::Session ReceiverImpl::getSession() const
 {
-    return qpid::messaging::Session(&parent);
+    return qpid::messaging::Session(parent.get());
 }
 
 }}} // namespace qpid::client::amqp0_10

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.h?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ReceiverImpl.h Fri Mar 19 17:04:18 2010
@@ -28,6 +28,7 @@
 #include "qpid/client/AsyncSession.h"
 #include "qpid/client/amqp0_10/SessionImpl.h"
 #include "qpid/messaging/Duration.h"
+#include <boost/intrusive_ptr.hpp>
 #include <memory>
 
 namespace qpid {
@@ -65,7 +66,7 @@ class ReceiverImpl : public qpid::messag
     void received(qpid::messaging::Message& message);
     qpid::messaging::Session getSession() const;
   private:
-    SessionImpl& parent;
+    boost::intrusive_ptr<SessionImpl> parent;
     const std::string destination;
     const qpid::messaging::Address address;
     const uint32_t byteCredit;
@@ -133,13 +134,13 @@ class ReceiverImpl : public qpid::messag
     template <class F> void execute()
     {
         F f(*this);
-        parent.execute(f);
+        parent->execute(f);
     }
     
     template <class F, class P> void execute1(P p)
     {
         F f(*this, p);
-        parent.execute(f);
+        parent->execute(f);
     }
 };
 

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp Fri Mar 19 17:04:18 2010
@@ -31,17 +31,17 @@ namespace amqp0_10 {
 
 SenderImpl::SenderImpl(SessionImpl& _parent, const std::string& _name, 
                        const qpid::messaging::Address& _address) : 
-    parent(_parent), name(_name), address(_address), state(UNRESOLVED),
+    parent(&_parent), name(_name), address(_address), state(UNRESOLVED),
     capacity(50), window(0), flushed(false), unreliable(AddressResolution::is_unreliable(address)) {}
 
 void SenderImpl::send(const qpid::messaging::Message& message) 
 {
     if (unreliable) {
         UnreliableSend f(*this, &message);
-        parent.execute(f);
+        parent->execute(f);
     } else {
         Send f(*this, &message);
-        while (f.repeat) parent.execute(f);
+        while (f.repeat) parent->execute(f);
     }
 }
 
@@ -60,7 +60,7 @@ uint32_t SenderImpl::getCapacity() { ret
 uint32_t SenderImpl::pending()
 {
     CheckPendingSends f(*this, false);
-    parent.execute(f);
+    parent->execute(f);
     return f.pending;
 } 
 
@@ -73,7 +73,7 @@ void SenderImpl::init(qpid::client::Asyn
     }
     if (state == CANCELLED) {
         sink->cancel(session, name);
-        parent.senderCancelled(name);
+        parent->senderCancelled(name);
     } else {
         sink->declare(session, name);
         replay();
@@ -140,7 +140,7 @@ void SenderImpl::closeImpl()
 {
     state = CANCELLED;
     sink->cancel(session, name);
-    parent.senderCancelled(name);
+    parent->senderCancelled(name);
 }
 
 const std::string& SenderImpl::getName() const
@@ -150,7 +150,7 @@ const std::string& SenderImpl::getName()
 
 qpid::messaging::Session SenderImpl::getSession() const
 {
-    return qpid::messaging::Session(&parent);
+    return qpid::messaging::Session(parent.get());
 }
 
 }}} // namespace qpid::client::amqp0_10

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h Fri Mar 19 17:04:18 2010
@@ -28,6 +28,7 @@
 #include "qpid/client/AsyncSession.h"
 #include "qpid/client/amqp0_10/SessionImpl.h"
 #include <memory>
+#include <boost/intrusive_ptr.hpp>
 #include <boost/ptr_container/ptr_deque.hpp>
 
 namespace qpid {
@@ -58,7 +59,7 @@ class SenderImpl : public qpid::messagin
     qpid::messaging::Session getSession() const;
 
   private:
-    SessionImpl& parent;
+    boost::intrusive_ptr<SessionImpl> parent;
     const std::string name;
     const qpid::messaging::Address address;
     State state;
@@ -143,13 +144,13 @@ class SenderImpl : public qpid::messagin
     template <class F> void execute()
     {
         F f(*this);
-        parent.execute(f);
+        parent->execute(f);
     }
     
     template <class F, class P> bool execute1(P p)
     {
         F f(*this, p);
-        return parent.execute(f);
+        return parent->execute(f);
     }    
 };
 }}} // namespace qpid::client::amqp0_10

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp Fri Mar 19 17:04:18 2010
@@ -49,7 +49,7 @@ namespace qpid {
 namespace client {
 namespace amqp0_10 {
 
-SessionImpl::SessionImpl(ConnectionImpl& c, bool t) : connection(c), transactional(t) {}
+SessionImpl::SessionImpl(ConnectionImpl& c, bool t) : connection(&c), transactional(t) {}
 
 
 void SessionImpl::sync()
@@ -108,7 +108,7 @@ void SessionImpl::close()
     for (std::vector<std::string>::const_iterator i = r.begin(); i != r.end(); ++i) getReceiver(*i).close();
     
 
-    connection.closed(*this);
+    connection->closed(*this);
     session.close();
 }
 
@@ -431,12 +431,12 @@ void SessionImpl::senderCancelled(const 
 
 void SessionImpl::reconnect()
 {
-    connection.connect();    
+    connection->connect();    
 }
 
 qpid::messaging::Connection SessionImpl::getConnection() const
 {
-    return qpid::messaging::Connection(&connection);
+    return qpid::messaging::Connection(connection.get());
 }
 
 }}} // namespace qpid::client::amqp0_10

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.h?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.h Fri Mar 19 17:04:18 2010
@@ -29,6 +29,7 @@
 #include "qpid/client/amqp0_10/AddressResolution.h"
 #include "qpid/client/amqp0_10/IncomingMessages.h"
 #include "qpid/sys/Mutex.h"
+#include <boost/intrusive_ptr.hpp>
 
 namespace qpid {
 
@@ -106,7 +107,7 @@ class SessionImpl : public qpid::messagi
     typedef std::map<std::string, qpid::messaging::Sender> Senders;
 
     mutable qpid::sys::Mutex lock;
-    ConnectionImpl& connection;
+    boost::intrusive_ptr<ConnectionImpl> connection;
     qpid::client::Session session;
     AddressResolution resolver;
     IncomingMessages incoming;

Modified: qpid/trunk/qpid/cpp/src/tests/qpid_recv.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/qpid_recv.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/qpid_recv.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/qpid_recv.cpp Fri Mar 19 17:04:18 2010
@@ -148,8 +148,8 @@ int main(int argc, char ** argv)
 {
     Options opts;
     if (opts.parse(argc, argv)) {
+        Connection connection(opts.connectionOptions);
         try {
-            Connection connection(opts.connectionOptions);
             connection.open(opts.url);
             std::auto_ptr<FailoverUpdates> updates(opts.failoverUpdates ? new FailoverUpdates(connection) : 0);
             Session session = connection.newSession(opts.tx > 0);
@@ -207,6 +207,7 @@ int main(int argc, char ** argv)
             return 0;
         } catch(const std::exception& error) {
             std::cerr << "Failure: " << error.what() << std::endl;
+            connection.close();
         }
     }
     return 1;

Modified: qpid/trunk/qpid/cpp/src/tests/qpid_send.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/qpid_send.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/qpid_send.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/qpid_send.cpp Fri Mar 19 17:04:18 2010
@@ -181,8 +181,8 @@ int main(int argc, char ** argv)
 {
     Options opts;
     if (opts.parse(argc, argv)) {
+        Connection connection(opts.connectionOptions);
         try {
-            Connection connection(opts.connectionOptions);
             connection.open(opts.url);
             std::auto_ptr<FailoverUpdates> updates(opts.failoverUpdates ? new FailoverUpdates(connection) : 0);
             Session session = connection.newSession(opts.tx > 0);
@@ -230,6 +230,7 @@ int main(int argc, char ** argv)
             return 0;
         } catch(const std::exception& error) {
             std::cout << "Failed: " << error.what() << std::endl;
+            connection.close();
         }
     }
     return 1;

Modified: qpid/trunk/qpid/cpp/src/tests/qpid_stream.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/qpid_stream.cpp?rev=925332&r1=925331&r2=925332&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/qpid_stream.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/qpid_stream.cpp Fri Mar 19 17:04:18 2010
@@ -87,8 +87,8 @@ struct Client : qpid::sys::Runnable
 
     void run()
     {
+        Connection connection;
         try {
-            Connection connection;
             connection.open(opts.url);
             Session session = connection.newSession();
             doWork(session);
@@ -96,6 +96,7 @@ struct Client : qpid::sys::Runnable
             connection.close();
         } catch(const std::exception& error) {
             std::cout << error.what() << std::endl;
+            connection.close();
         }
     }
 



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org