You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2007/09/28 19:53:17 UTC
svn commit: r580440 - in /incubator/qpid/trunk/qpid/cpp/src/qpid/client:
Completion.h Connection.cpp Connection.h ConnectionImpl.cpp
ConnectionImpl.h Response.h SessionCore.cpp SessionCore.h TypedResult.h
Author: aconway
Date: Fri Sep 28 10:53:16 2007
New Revision: 580440
URL: http://svn.apache.org/viewvc?rev=580440&view=rev
Log:
Ensure no danbling pointers in client API:
- Session -shared_ptr-> SessionCore -shared_ptr-> ConnectionImpl
- Connection -shared_ptr-> ConnectionImpl
- ConnectionImpl -weak_ptr-> SessionCore
Modified:
incubator/qpid/trunk/qpid/cpp/src/qpid/client/Completion.h
incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.h
incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionImpl.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionImpl.h
incubator/qpid/trunk/qpid/cpp/src/qpid/client/Response.h
incubator/qpid/trunk/qpid/cpp/src/qpid/client/SessionCore.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/client/SessionCore.h
incubator/qpid/trunk/qpid/cpp/src/qpid/client/TypedResult.h
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/Completion.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/Completion.h?rev=580440&r1=580439&r2=580440&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/Completion.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/Completion.h Fri Sep 28 10:53:16 2007
@@ -33,10 +33,10 @@
{
protected:
Future future;
- SessionCore::shared_ptr session;
+ shared_ptr<SessionCore> session;
public:
- Completion(Future f, SessionCore::shared_ptr s) : future(f), session(s) {}
+ Completion(Future f, shared_ptr<SessionCore> s) : future(f), session(s) {}
void sync()
{
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.cpp?rev=580440&r1=580439&r2=580440&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.cpp Fri Sep 28 10:53:16 2007
@@ -72,7 +72,7 @@
Session Connection::newSession(uint32_t detachedLifetime) {
shared_ptr<SessionCore> core(
- new SessionCore(*impl, ++channelIdCounter, max_frame_size));
+ new SessionCore(impl, ++channelIdCounter, max_frame_size));
impl->addSession(core);
core->open(detachedLifetime);
return Session(core);
@@ -82,7 +82,7 @@
shared_ptr<SessionCore> core=session.impl;
core->setChannel(++channelIdCounter);
impl->addSession(core);
- core->resume(*impl);
+ core->resume(impl);
}
void Connection::close() {
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.h?rev=580440&r1=580439&r2=580440&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.h Fri Sep 28 10:53:16 2007
@@ -57,7 +57,7 @@
framing::ChannelId channelIdCounter;
framing::ProtocolVersion version;
const uint32_t max_frame_size;
- ConnectionImpl::shared_ptr impl;
+ shared_ptr<ConnectionImpl> impl;
bool isOpen;
bool debug;
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionImpl.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionImpl.cpp?rev=580440&r1=580439&r2=580440&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionImpl.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionImpl.cpp Fri Sep 28 10:53:16 2007
@@ -45,8 +45,8 @@
void ConnectionImpl::addSession(const boost::shared_ptr<SessionCore>& session)
{
Mutex::ScopedLock l(lock);
- boost::shared_ptr<SessionCore>& s = sessions[session->getChannel()];
- if (s)
+ boost::weak_ptr<SessionCore>& s = sessions[session->getChannel()];
+ if (s.lock())
throw ChannelBusyException();
s = session;
}
@@ -61,7 +61,7 @@
boost::shared_ptr<SessionCore> s;
{
Mutex::ScopedLock l(lock);
- s = sessions[frame.getChannel()];
+ s = sessions[frame.getChannel()].lock();
}
if (!s)
throw ChannelErrorException();
@@ -120,7 +120,9 @@
{
Mutex::ScopedLock l(lock);
for (SessionMap::iterator i = sessions.begin(); i != sessions.end(); i++) {
- i->second->closed(code, text);
+ boost::shared_ptr<SessionCore> s = i->second.lock();
+ if (s)
+ s->closed(code, text);
}
sessions.clear();
isClosed = true;
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionImpl.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionImpl.h?rev=580440&r1=580439&r2=580440&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionImpl.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionImpl.h Fri Sep 28 10:53:16 2007
@@ -24,6 +24,7 @@
#include <map>
#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
#include "qpid/framing/FrameHandler.h"
#include "qpid/sys/Mutex.h"
#include "qpid/sys/ShutdownHandler.h"
@@ -41,7 +42,7 @@
public sys::ShutdownHandler
{
- typedef std::map<uint16_t, boost::shared_ptr<SessionCore> > SessionMap;
+ typedef std::map<uint16_t, boost::weak_ptr<SessionCore> > SessionMap;
SessionMap sessions;
ConnectionHandler handler;
boost::shared_ptr<Connector> connector;
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/Response.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/Response.h?rev=580440&r1=580439&r2=580440&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/Response.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/Response.h Fri Sep 28 10:53:16 2007
@@ -32,7 +32,7 @@
class Response : public Completion
{
public:
- Response(Future f, SessionCore::shared_ptr s) : Completion(f, s) {}
+ Response(Future f, shared_ptr<SessionCore> s) : Completion(f, s) {}
template <class T> T& as()
{
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/SessionCore.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/SessionCore.cpp?rev=580440&r1=580439&r2=580440&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/SessionCore.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/SessionCore.cpp Fri Sep 28 10:53:16 2007
@@ -20,22 +20,25 @@
*/
#include "SessionCore.h"
-#include "qpid/framing/constants.h"
#include "Future.h"
#include "FutureResponse.h"
#include "FutureResult.h"
+#include "ConnectionImpl.h"
+
+#include "qpid/framing/constants.h"
#include <boost/bind.hpp>
using namespace qpid::client;
using namespace qpid::framing;
-SessionCore::SessionCore(FrameHandler& out_, uint16_t ch, uint64_t maxFrameSize)
- : channel(ch), l2(*this), l3(maxFrameSize), uuid(false), sync(false)
+SessionCore::SessionCore(shared_ptr<ConnectionImpl> conn, uint16_t ch, uint64_t maxFrameSize)
+ : connection(conn), channel(ch), l2(*this), l3(maxFrameSize),
+ uuid(false), sync(false)
{
l2.next = &l3;
l3.out = &out;
- out.next = &out_;
+ out.next = connection.get();
}
SessionCore::~SessionCore() {}
@@ -108,8 +111,9 @@
l2.open(detachedLifetime);
}
-void SessionCore::resume(FrameHandler& out_) {
- out.next = &out_;
+void SessionCore::resume(shared_ptr<ConnectionImpl> conn) {
+ connection = conn;
+ out.next = connection.get();
l2.resume();
}
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/SessionCore.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/SessionCore.h?rev=580440&r1=580439&r2=580440&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/SessionCore.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/SessionCore.h Fri Sep 28 10:53:16 2007
@@ -36,6 +36,7 @@
namespace client {
class Future;
+class ConnectionImpl;
/**
* Session implementation, sets up handler chains.
@@ -50,6 +51,7 @@
std::string text;
};
+ shared_ptr<ConnectionImpl> connection;
uint16_t channel;
SessionHandler l2;
ExecutionHandler l3;
@@ -62,9 +64,7 @@
void handleOut(framing::AMQFrame& frame);
public:
- typedef shared_ptr<SessionCore> shared_ptr;
-
- SessionCore(framing::FrameHandler& out, uint16_t channel, uint64_t maxFrameSize);
+ SessionCore(shared_ptr<ConnectionImpl>, uint16_t channel, uint64_t maxFrameSize);
~SessionCore();
framing::FrameSet::shared_ptr get();
@@ -83,7 +83,7 @@
/** Closed by peer */
void closed(uint16_t code, const std::string& text);
- void resume(framing::FrameHandler& out);
+ void resume(shared_ptr<ConnectionImpl>);
void suspend();
void setSync(bool);
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/TypedResult.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/TypedResult.h?rev=580440&r1=580439&r2=580440&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/TypedResult.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/TypedResult.h Fri Sep 28 10:53:16 2007
@@ -33,7 +33,7 @@
bool decoded;
public:
- TypedResult(Future f, SessionCore::shared_ptr s) : Completion(f, s), decoded(false) {}
+ TypedResult(Future f, shared_ptr<SessionCore> s) : Completion(f, s), decoded(false) {}
T& get()
{