From e183227707d150b1f42e750df0e90cd7dac8744e Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Wed, 29 Aug 2007 23:27:40 +0000 Subject: * src/qpid/broker/Session.h, .cpp: Session holds all state of a session including handlers created for that session. Session is not directly associated with a channel. * src/qpid/broker/SessionAdapter.h, .cpp: SessionAdapter is bound to a channel managed by the Connection. It can be attached to and detatched from a Session. * src/qpid/broker/Connection.cpp, .h: Use SessionAdapter. * src/qpid/framing/Handler.h: Removed use of shared_ptr. Handlers belong either to a Session or a Connection and are destroyed with it. * src/qpid/framing/InputHandler.h, OutputHandler.h: Both now inherit from FrameHandler and can be used as FrameHandlers. Intermediate step to removing them entirely. * src/qpid/broker/ConnectionAdapter.h: * src/qpid/client/ConnectionHandler.h: * src/qpid/framing/ChannelAdapter.cpp, .h: Minor changes required by Handler changes. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@570982 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/broker/Connection.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) (limited to 'cpp/src/qpid/broker/Connection.cpp') diff --git a/cpp/src/qpid/broker/Connection.cpp b/cpp/src/qpid/broker/Connection.cpp index f082c5cdb6..08d5ba0ab3 100644 --- a/cpp/src/qpid/broker/Connection.cpp +++ b/cpp/src/qpid/broker/Connection.cpp @@ -28,6 +28,8 @@ #include "BrokerAdapter.h" #include "SemanticHandler.h" +#include + using namespace boost; using namespace qpid::sys; using namespace qpid::framing; @@ -50,11 +52,12 @@ void Connection::received(framing::AMQFrame& frame){ if (frame.getChannel() == 0) { adapter.handle(frame); } else { + // FIXME aconway 2007-08-29: review shutdown, not more shared_ptr. + // OLD COMMENT: // Assign handler to new shared_ptr, as it may be erased // from the map by handle() if frame is a ChannelClose. // - FrameHandler::Chain handler=getChannel((frame.getChannel())).in; - handler->handle(frame); + getChannel((frame.getChannel())).in(frame); } } @@ -97,15 +100,16 @@ void Connection::closeChannel(uint16_t id) { FrameHandler::Chains& Connection::getChannel(ChannelId id) { - ChannelMap::iterator i = channels.find(id); - if (i == channels.end()) { - FrameHandler::Chains chains( - new SemanticHandler(id, *this), - new OutputHandlerFrameHandler(*out)); - broker.update(id, chains); - i = channels.insert(ChannelMap::value_type(id, chains)).first; - } - return i->second; + // FIXME aconway 2007-08-29: Assuming session on construction, + // move this to SessionAdapter::open. + boost::optional& ch = channels[id]; + if (!ch) { + ch = boost::in_place(boost::ref(*this), id); // FIXME aconway 2007-08-29: + assert(ch->getSession()); + broker.update(id, *ch->getSession()); + } + assert(ch->getSession()); + return *ch->getSession(); } -- cgit v1.2.1