diff options
Diffstat (limited to 'cpp/src/Glacier2/RequestQueue.cpp')
-rw-r--r-- | cpp/src/Glacier2/RequestQueue.cpp | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp index f1c7667f596..8d8db6e264b 100644 --- a/cpp/src/Glacier2/RequestQueue.cpp +++ b/cpp/src/Glacier2/RequestQueue.cpp @@ -1,6 +1,6 @@ // ********************************************************************** // -// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved. +// Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. @@ -8,6 +8,7 @@ // ********************************************************************** #include <Glacier2/RequestQueue.h> +#include <Glacier2/SessionRouterI.h> #include <set> using namespace std; @@ -24,7 +25,12 @@ class AMI_Array_Object_ice_invokeI : public AMI_Array_Object_ice_invoke { public: - AMI_Array_Object_ice_invokeI(const AMD_Array_Object_ice_invokePtr& amdCB) : _amdCB(amdCB) + AMI_Array_Object_ice_invokeI(const AMD_Array_Object_ice_invokePtr& amdCB, + const InstancePtr& instance, + const ConnectionPtr& connection) : + _amdCB(amdCB), + _instance(instance), + _connection(connection) { } @@ -40,6 +46,30 @@ public: virtual void ice_exception(const Exception& ex) { + // + // If the connection has been lost, destroy the session. + // + if(_connection) + { + try + { + ex.ice_throw(); + } + catch(const Ice::ConnectionLostException&) + { + try + { + _instance->sessionRouter()->destroySession(_connection); + } + catch(const Exception&) + { + } + } + catch(const Exception&) + { + } + } + if(_amdCB) { _amdCB->ice_exception(ex); @@ -49,19 +79,22 @@ public: private: const AMD_Array_Object_ice_invokePtr _amdCB; + const InstancePtr _instance; + const ConnectionPtr _connection; }; } Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*, const Byte*>& inParams, const Current& current, bool forwardContext, const Ice::Context& sslContext, - const AMD_Array_Object_ice_invokePtr& amdCB) : + const AMD_Array_Object_ice_invokePtr& amdCB, const ConnectionPtr& connection) : _proxy(proxy), _inParams(inParams.first, inParams.second), _current(current), _forwardContext(forwardContext), _sslContext(sslContext), - _amdCB(amdCB) + _amdCB(amdCB), + _connection(connection) { // // If this is not a twoway call, we can finish the AMD call right @@ -81,7 +114,7 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*, bool -Glacier2::Request::invoke() +Glacier2::Request::invoke(const InstancePtr& instance) { pair<const Byte*, const Byte*> inPair; if(_inParams.size() == 0) @@ -128,11 +161,11 @@ Glacier2::Request::invoke() AMI_Array_Object_ice_invokePtr amiCB; if(_proxy->ice_isTwoway()) { - amiCB = new AMI_Array_Object_ice_invokeI(_amdCB); + amiCB = new AMI_Array_Object_ice_invokeI(_amdCB, instance, _connection); } else { - amiCB = new AMI_Array_Object_ice_invokeI(0); + amiCB = new AMI_Array_Object_ice_invokeI(0, instance, _connection); } if(_forwardContext) @@ -194,8 +227,10 @@ Glacier2::Request::override(const RequestPtr& other) const return _override == other->_override; } -Glacier2::RequestQueue::RequestQueue(const RequestQueueThreadPtr& requestQueueThread) : - _requestQueueThread(requestQueueThread) +Glacier2::RequestQueue::RequestQueue(const RequestQueueThreadPtr& requestQueueThread, + const InstancePtr& instance) : + _requestQueueThread(requestQueueThread), + _instance(instance) { } @@ -238,7 +273,7 @@ Glacier2::RequestQueue::flushRequests(set<Ice::ObjectPrx>& batchProxies) { try { - if((*p)->invoke()) // If batch invocation, add the proxy to the batch proxy set. + if((*p)->invoke(_instance)) // If batch invocation, add the proxy to the batch proxy set. { batchProxies.insert((*p)->getProxy()); } |