// // Copyright (c) ZeroC, Inc. All rights reserved. // #ifndef REQUEST_H #define REQUEST_H #include #include #include namespace Glacier2 { class Instance; class Request; class RequestQueueThread; class Request { public: Request(std::shared_ptr, const std::pair&, const Ice::Current&, bool, const Ice::Context&, std::function)>, std::function); void invoke(std::function)>&&, std::function&&, std::function&& = nullptr); bool override(const std::shared_ptr&) const; bool hasOverride() const { return !_override.empty(); } private: friend class RequestQueue; void response(bool, const std::pair&); void exception(std::exception_ptr); void queued(); const std::shared_ptr _proxy; const Ice::ByteSeq _inParams; const Ice::Current _current; const bool _forwardContext; const Ice::Context _sslContext; const std::string _override; std::function&)> _response; std::function _exception; }; class RequestQueue : public std::enable_shared_from_this { public: RequestQueue(std::shared_ptr, std::shared_ptr, std::shared_ptr); bool addRequest(std::shared_ptr); void flushRequests(); void destroy(); void updateObserver(std::shared_ptr); private: void flush(); void response(bool, const std::pair&, const std::shared_ptr&); void exception(std::exception_ptr, const std::shared_ptr&); void sent(bool, const std::shared_ptr&); const std::shared_ptr _requestQueueThread; const std::shared_ptr _instance; const std::shared_ptr _connection; std::deque> _requests; bool _pendingSend; std::shared_ptr _pendingSendRequest; bool _destroyed; std::shared_ptr _observer; std::mutex _mutex; }; class RequestQueueThread { public: RequestQueueThread(std::chrono::milliseconds); ~RequestQueueThread(); void flushRequestQueue(std::shared_ptr); void destroy(); private: void run(); const std::chrono::milliseconds _sleepTime; bool _destroy; bool _sleep; std::vector> _queues; std::mutex _mutex; std::condition_variable _condVar; std::thread _thread; }; } #endif