void ConnectRequestHandler::asyncRequestCanceled(const OutgoingAsyncBasePtr& outAsync, const Ice::LocalException& ex) { { Lock sync(*this); if(_exception) { return; // The request has been notified of a failure already. } if(!initialized()) { for(deque<ProxyOutgoingAsyncBasePtr>::iterator p = _requests.begin(); p != _requests.end(); ++p) { if(p->get() == outAsync.get()) { _requests.erase(p); if(outAsync->exception(ex)) { outAsync->invokeExceptionAsync(); } return; } } } } _connection->asyncRequestCanceled(outAsync, ex); }
void CollocatedRequestHandler::asyncRequestCanceled(const OutgoingAsyncBasePtr& outAsync, const LocalException& ex) { Lock sync(*this); map<OutgoingAsyncBasePtr, Int>::iterator p = _sendAsyncRequests.find(outAsync); if(p != _sendAsyncRequests.end()) { if(p->second > 0) { _asyncRequests.erase(p->second); } _sendAsyncRequests.erase(p); if(outAsync->exception(ex)) { outAsync->invokeExceptionAsync(); } _adapter->decDirectCount(); // invokeAll won't be called, decrease the direct count. return; } OutgoingAsyncPtr o = ICE_DYNAMIC_CAST(OutgoingAsync, outAsync); if(o) { for(map<Int, OutgoingAsyncBasePtr>::iterator q = _asyncRequests.begin(); q != _asyncRequests.end(); ++q) { if(q->second.get() == o.get()) { _asyncRequests.erase(q); if(outAsync->exception(ex)) { outAsync->invokeExceptionAsync(); } return; } } } }
void CollocatedRequestHandler::handleException(int requestId, const Exception& ex, bool amd) { if(requestId == 0) { return; // Ignore exception for oneway messages. } OutgoingAsyncBasePtr outAsync; { Lock sync(*this); map<int, OutgoingBase*>::iterator p = _requests.find(requestId); if(p != _requests.end()) { p->second->completed(ex); _requests.erase(p); } else { map<int, OutgoingAsyncBasePtr>::iterator q = _asyncRequests.find(requestId); if(q != _asyncRequests.end()) { if(q->second->exception(ex)) { outAsync = q->second; } _asyncRequests.erase(q); } } } if(outAsync) { // // If called from an AMD dispatch, invoke asynchronously // the completion callback since this might be called from // the user code. // if(amd) { outAsync->invokeExceptionAsync(); } else { outAsync->invokeException(); } } }