lichao
2021-04-21 ad4f3dcedab29a690c5eedbb08ba1b393917db0b
src/topic_node.h
@@ -20,7 +20,9 @@
#include "msg.h"
#include "socket.h"
#include <atomic>
#include <memory>
#include <vector>
using namespace bhome_shm;
using namespace bhome_msg;
@@ -106,20 +108,32 @@
   };
   // some sockets may be the same one, using functions make it easy to change.
   enum { eSockStart,
         eSockNode = eSockStart,
         eSockPub = eSockNode,
         eSockServer,
         eSockClient,
         eSockSub,
         eSockEnd,
   };
   std::vector<std::unique_ptr<ShmSocket>> sockets_;
   ShmSocket &SockNode() { return sock_node_; }
   ShmSocket &SockPub() { return SockNode(); }
   ShmSocket &SockSub() { return sock_sub_; }
   ShmSocket &SockClient() { return sock_client_; }
   ShmSocket &SockServer() { return sock_server_; }
   bool IsRegistered() const { return registered_.load(); }
   ShmSocket &SockNode() { return *sockets_[eSockNode]; }
   ShmSocket &SockPub() { return *sockets_[eSockPub]; }
   ShmSocket &SockSub() { return *sockets_[eSockSub]; }
   ShmSocket &SockClient() { return *sockets_[eSockClient]; }
   ShmSocket &SockServer() { return *sockets_[eSockServer]; }
   ShmSocket sock_node_;
   ShmSocket sock_client_;
   ShmSocket sock_server_;
   ShmSocket sock_sub_;
   std::atomic<bool> registered_;
   std::atomic<bool> registered_ever_;
   enum State {
      eStateUnregistered,
      eStateOnline,
      eStateOffline // heartbeat fail.
   };
   void state(const State st) { state_.store(st); }
   void state_cas(State expected, const State val) { state_.compare_exchange_strong(expected, val); }
   State state() const { return state_.load(); }
   bool IsOnline() const { return state() == eStateOnline; }
   std::atomic<State> state_;
   TopicQueryCache topic_query_cache_;
};