// // Copyright (c) ZeroC, Inc. All rights reserved. // #ifndef TOPIC_MANAGER_I_H #define TOPIC_MANAGER_I_H #include #include #include #include #include namespace IceStorm { class PersistentInstance; class TopicImpl; // // TopicManager implementation. // class TopicManagerImpl final : public IceStormElection::Replica, public IceStorm::Instrumentation::ObserverUpdater, public std::enable_shared_from_this { public: static std::shared_ptr create(const std::shared_ptr&); // TopicManager methods. std::shared_ptr create(const std::string&); std::shared_ptr retrieve(const std::string&); TopicDict retrieveAll(); // Observer methods. void observerInit(const IceStormElection::LogUpdate&, const IceStormElection::TopicContentSeq&); void observerCreateTopic(const IceStormElection::LogUpdate&, const std::string&); void observerDestroyTopic(const IceStormElection::LogUpdate&, const std::string&); void observerAddSubscriber(const IceStormElection::LogUpdate&, const std::string&, const IceStorm::SubscriberRecord&); void observerRemoveSubscriber(const IceStormElection::LogUpdate&, const std::string&, const Ice::IdentitySeq&); // Sync methods. void getContent(IceStormElection::LogUpdate&, IceStormElection::TopicContentSeq&); // Replica methods. IceStormElection::LogUpdate getLastLogUpdate() const override; void sync(const std::shared_ptr&) override; void initMaster(const std::set&, const IceStormElection::LogUpdate&) override; std::shared_ptr getObserver() const override; std::shared_ptr getSync() const override; void reap(); void shutdown(); std::shared_ptr getServant() const; private: TopicManagerImpl(std::shared_ptr); void updateTopicObservers() override; void updateSubscriberObservers() override; std::shared_ptr installTopic(const std::string&, const Ice::Identity&, bool, const IceStorm::SubscriberRecordSeq& = IceStorm::SubscriberRecordSeq()); const std::shared_ptr _instance; std::map> _topics; std::shared_ptr _managerImpl; std::shared_ptr _observer; std::shared_ptr _sync; LLUMap _lluMap; SubscriberMap _subscriberMap; std::recursive_mutex _mutex; }; } // End namespace IceStorm #endif