void CollocatedRequestHandler::sendResponse(Int requestId, BasicStream* os, Byte, bool amd) { OutgoingAsyncBasePtr outAsync; { Lock sync(*this); assert(_response); os->i = os->b.begin() + sizeof(replyHdr) + 4; if(_traceLevels->protocol >= 1) { fillInValue(os, 10, static_cast<Int>(os->b.size())); traceRecv(*os, _logger, _traceLevels); } map<int, OutgoingBase*>::iterator p = _requests.find(requestId); if(p != _requests.end()) { p->second->completed(*os); _requests.erase(p); } else { map<int, OutgoingAsyncBasePtr>::iterator q = _asyncRequests.find(requestId); if(q != _asyncRequests.end()) { os->swap(*q->second->getIs()); if(q->second->completed()) { 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->invokeCompletedAsync(); } else { outAsync->invokeCompleted(); } } _adapter->decDirectCount(); }
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->completed(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->invokeCompletedAsync(); } else { outAsync->invokeCompleted(); } } }