// // Copyright (c) ZeroC, Inc. All rights reserved. // #ifndef INSTANCE_H #define INSTANCE_H #include #include #include #include #include #include namespace IceStormElection { class Observers; class NodeI; } namespace IceStorm { class TraceLevels; class TopicReaper { public: void add(const std::string&); std::vector consumeReapedTopics(); private: std::vector _topics; std::mutex _mutex; }; class Instance { public: enum SendQueueSizeMaxPolicy { RemoveSubscriber, DropEvents }; Instance(const std::string&, const std::string&, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr = nullptr, std::shared_ptr = nullptr); virtual ~Instance(); void setNode(std::shared_ptr); std::string instanceName() const; std::string serviceName() const; std::shared_ptr communicator() const; std::shared_ptr properties() const; std::shared_ptr publishAdapter() const; std::shared_ptr topicAdapter() const; std::shared_ptr nodeAdapter() const; std::shared_ptr observers() const; std::shared_ptr node() const; std::shared_ptr nodeProxy() const; std::shared_ptr traceLevels() const; IceUtil::TimerPtr timer() const; std::shared_ptr topicReplicaProxy() const; std::shared_ptr publisherReplicaProxy() const; std::shared_ptr observer() const; std::shared_ptr topicReaper() const; std::chrono::seconds discardInterval() const; std::chrono::milliseconds flushInterval() const; std::chrono::milliseconds sendTimeout() const; int sendQueueSizeMax() const; SendQueueSizeMaxPolicy sendQueueSizeMaxPolicy() const; void shutdown(); virtual void destroy(); private: const std::string _instanceName; const std::string _serviceName; const std::shared_ptr _communicator; const std::shared_ptr _publishAdapter; const std::shared_ptr _topicAdapter; const std::shared_ptr _nodeAdapter; const std::shared_ptr _nodeProxy; const std::shared_ptr _traceLevels; const std::chrono::seconds _discardInterval; const std::chrono::milliseconds _flushInterval; const std::chrono::milliseconds _sendTimeout; const int _sendQueueSizeMax; const SendQueueSizeMaxPolicy _sendQueueSizeMaxPolicy; const std::shared_ptr _topicReplicaProxy; const std::shared_ptr _publisherReplicaProxy; const std::shared_ptr _topicReaper; std::shared_ptr _node; std::shared_ptr _observers; IceUtil::TimerPtr _timer; std::shared_ptr _observer; }; using SubscriberMapRWCursor = IceDB::ReadWriteCursor; class PersistentInstance final : public Instance { public: PersistentInstance(const std::string&, const std::string&, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr = nullptr, std::shared_ptr = nullptr); const IceDB::Env& dbEnv() const { return _dbEnv; } LLUMap lluMap() const { return _lluMap; } SubscriberMap subscriberMap() const { return _subscriberMap; } void destroy() override; private: IceUtilInternal::FileLock _dbLock; IceDB::Env _dbEnv; LLUMap _lluMap; SubscriberMap _subscriberMap; }; } // End namespace IceStorm #endif