summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/broker/Connection.cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2007-08-29 23:27:40 +0000
committerAlan Conway <aconway@apache.org>2007-08-29 23:27:40 +0000
commite183227707d150b1f42e750df0e90cd7dac8744e (patch)
treea9156083c1890852c2d4013d4a856f9f28762946 /cpp/src/qpid/broker/Connection.cpp
parent7422e57391a89bc2493cba18ca2ef0a84fec7baa (diff)
downloadqpid-python-e183227707d150b1f42e750df0e90cd7dac8744e.tar.gz
* 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
Diffstat (limited to 'cpp/src/qpid/broker/Connection.cpp')
-rw-r--r--cpp/src/qpid/broker/Connection.cpp26
1 files changed, 15 insertions, 11 deletions
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 <boost/utility/in_place_factory.hpp>
+
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<SessionAdapter>& 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();
}