From a4f93259dc3494d98addf38e69b87eb557d432b3 Mon Sep 17 00:00:00 2001 From: Benoit Foucher Date: Fri, 27 Jun 2014 10:31:41 +0200 Subject: Better collocation optimization, fix for ICE-5489, ICE-5484 --- cpp/src/Ice/CollocatedRequestHandler.h | 101 +++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 cpp/src/Ice/CollocatedRequestHandler.h (limited to 'cpp/src/Ice/CollocatedRequestHandler.h') diff --git a/cpp/src/Ice/CollocatedRequestHandler.h b/cpp/src/Ice/CollocatedRequestHandler.h new file mode 100644 index 00000000000..9a1c8096399 --- /dev/null +++ b/cpp/src/Ice/CollocatedRequestHandler.h @@ -0,0 +1,101 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 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. +// +// ********************************************************************** + +#ifndef ICE_COLLOCATED_REQUEST_HANDLER_H +#define ICE_COLLOCATED_REQUEST_HANDLER_H + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace Ice +{ + +class ObjectAdapterI; +typedef IceUtil::Handle ObjectAdapterIPtr; + +} + +namespace IceInternal +{ + +class Outgoing; +class BatchOutgoing; +class OutgoingAsync; +class BatchOutgoingAsync; + +class CollocatedRequestHandler : public RequestHandler, public ResponseHandler, private IceUtil::Monitor +{ +public: + + CollocatedRequestHandler(const ReferencePtr&, const Ice::ObjectAdapterPtr&); + + virtual ~CollocatedRequestHandler(); + + virtual void prepareBatchRequest(BasicStream*); + virtual void finishBatchRequest(BasicStream*); + virtual void abortBatchRequest(); + + virtual bool sendRequest(OutgoingMessageCallback*); + virtual AsyncStatus sendAsyncRequest(const OutgoingAsyncMessageCallbackPtr&); + + virtual void requestTimedOut(OutgoingMessageCallback*); + virtual void asyncRequestTimedOut(const OutgoingAsyncMessageCallbackPtr&); + + virtual void sendResponse(Ice::Int, BasicStream*, Ice::Byte); + virtual void sendNoResponse(); + virtual void invokeException(Ice::Int, const Ice::LocalException&, int); + + const ReferencePtr& getReference() const { return _reference; } // Inlined for performances. + + virtual Ice::ConnectionIPtr getConnection(bool); + + void invokeRequest(Outgoing*); + AsyncStatus invokeAsyncRequest(OutgoingAsync*); + void invokeBatchRequests(BatchOutgoing*); + AsyncStatus invokeAsyncBatchRequests(BatchOutgoingAsync*); + + bool sent(OutgoingMessageCallback*); + bool sentAsync(OutgoingAsyncMessageCallback*); + + void invokeAll(BasicStream*, Ice::Int, Ice::Int, bool); + +private: + + void handleException(Ice::Int, const Ice::Exception&, bool); + + const Ice::ObjectAdapterIPtr _adapter; + const Ice::LoggerPtr _logger; + const TraceLevelsPtr _traceLevels; + const bool _batchAutoFlush; + + int _requestId; + + std::map _sendRequests; + std::map _sendAsyncRequests; + + std::map _requests; + std::map _asyncRequests; + + bool _batchStreamInUse; + int _batchRequestNum; + BasicStream _batchStream; + size_t _batchMarker; +}; +typedef IceUtil::Handle CollocatedRequestHandlerPtr; + +} + +#endif -- cgit v1.2.3