| | |
| | | |
| | | #include "msg.h" |
| | | #include "socket.h" |
| | | #include <atomic> |
| | | #include <memory> |
| | | #include <vector> |
| | | |
| | | using namespace bhome_shm; |
| | | using namespace bhome_msg; |
| | |
| | | }; |
| | | |
| | | // 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_; |
| | | }; |