// // Copyright (c) ZeroC, Inc. All rights reserved. // #ifndef ICE_GRID_NODE_SESSION_MANAGER_H #define ICE_GRID_NODE_SESSION_MANAGER_H #include #include #include #include #include #include #include namespace IceGrid { class NodeI; typedef IceUtil::Handle NodeIPtr; class NodeSessionManager; class NodeSessionKeepAliveThread : public SessionKeepAliveThread { public: NodeSessionKeepAliveThread(const InternalRegistryPrx&, const NodeIPtr&, NodeSessionManager&); virtual NodeSessionPrx createSession(InternalRegistryPrx&, IceUtil::Time&); virtual void destroySession(const NodeSessionPrx&); virtual bool keepAlive(const NodeSessionPrx&); std::string getName() const { return _name; } protected: virtual NodeSessionPrx createSessionImpl(const InternalRegistryPrx&, IceUtil::Time&); const NodeIPtr _node; const std::string _replicaName; NodeSessionManager& _manager; }; typedef IceUtil::Handle NodeSessionKeepAliveThreadPtr; class NodeSessionManager : public SessionManager { public: NodeSessionManager(const Ice::CommunicatorPtr&, const std::string&); void create(const NodeIPtr&); void create(const InternalRegistryPrx&); void activate(); bool isWaitingForCreate(); bool waitForCreate(); void terminate(); void destroy(); void replicaInit(const InternalRegistryPrxSeq&); void replicaAdded(const InternalRegistryPrx&); void replicaRemoved(const InternalRegistryPrx&); NodeSessionPrx getMasterNodeSession() const { return _thread->getSession(); } std::vector getQueryObjects() { return findAllQueryObjects(true); } private: NodeSessionKeepAliveThreadPtr addReplicaSession(const InternalRegistryPrx&); void reapReplicas(); void syncServers(const NodeSessionPrx&); bool isDestroyed() { Lock sync(*this); return _destroyed; } class Thread : public NodeSessionKeepAliveThread { public: Thread(NodeSessionManager& manager) : NodeSessionKeepAliveThread(manager._master, manager._node, manager) { } virtual NodeSessionPrx createSession(InternalRegistryPrx& master, IceUtil::Time& timeout) { NodeSessionPrx session = NodeSessionKeepAliveThread::createSession(master, timeout); _manager.createdSession(session); _manager.reapReplicas(); return session; } virtual void destroySession(const NodeSessionPrx& session) { NodeSessionKeepAliveThread::destroySession(session); _manager.reapReplicas(); } virtual bool keepAlive(const NodeSessionPrx& session) { bool alive = NodeSessionKeepAliveThread::keepAlive(session); _manager.reapReplicas(); return alive; } }; typedef IceUtil::Handle ThreadPtr; friend class Thread; void createdSession(const NodeSessionPrx&); const NodeIPtr _node; ThreadPtr _thread; bool _destroyed; bool _activated; typedef std::map NodeSessionMap; NodeSessionMap _sessions; std::set _replicas; }; } #endif