summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/broker/amqp/Connection.cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2014-01-22 15:57:21 +0000
committerGordon Sim <gsim@apache.org>2014-01-22 15:57:21 +0000
commit2b3d33a1c27f741ed9af5f741e66a8a7ba51df92 (patch)
tree86fb126db17a7f14853ba505376e9631d73f1f13 /cpp/src/qpid/broker/amqp/Connection.cpp
parentbc96b14969fa55f0ee032908fac989924a17a6d4 (diff)
downloadqpid-python-2b3d33a1c27f741ed9af5f741e66a8a7ba51df92.tar.gz
QPID-5501: implement missing qmf operations
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1560393 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/amqp/Connection.cpp')
-rw-r--r--cpp/src/qpid/broker/amqp/Connection.cpp25
1 files changed, 22 insertions, 3 deletions
diff --git a/cpp/src/qpid/broker/amqp/Connection.cpp b/cpp/src/qpid/broker/amqp/Connection.cpp
index 514add7e44..c95a2d3537 100644
--- a/cpp/src/qpid/broker/amqp/Connection.cpp
+++ b/cpp/src/qpid/broker/amqp/Connection.cpp
@@ -70,7 +70,7 @@ Connection::Connection(qpid::sys::OutputControl& o, const std::string& i, Broker
: BrokerContext(b), ManagedConnection(getBroker(), i),
connection(pn_connection()),
transport(pn_transport()),
- out(o), id(i), haveOutput(true), closeInitiated(false)
+ out(o), id(i), haveOutput(true), closeInitiated(false), closeRequested(false)
{
if (pn_transport_bind(transport, connection)) {
//error
@@ -169,9 +169,22 @@ size_t Connection::encode(char* buffer, size_t size)
bool Connection::canEncode()
{
if (!closeInitiated) {
+ if (closeRequested) {
+ close();
+ return true;
+ }
try {
- for (Sessions::iterator i = sessions.begin();i != sessions.end(); ++i) {
- if (i->second->dispatch()) haveOutput = true;
+ for (Sessions::iterator i = sessions.begin();i != sessions.end();) {
+ if (i->second->endedByManagement()) {
+ pn_session_close(i->first);
+ i->second->close();
+ sessions.erase(i++);
+ haveOutput = true;
+ QPID_LOG_CAT(debug, model, id << " session ended by management");
+ } else {
+ if (i->second->dispatch()) haveOutput = true;
+ ++i;
+ }
}
process();
} catch (const Exception& e) {
@@ -372,4 +385,10 @@ void Connection::setUserId(const std::string& user)
throw Exception(qpid::amqp::error_conditions::RESOURCE_LIMIT_EXCEEDED, "User connection denied by configured limit");
}
}
+
+void Connection::closedByManagement()
+{
+ closeRequested = true;
+ out.activateOutput();
+}
}}} // namespace qpid::broker::amqp