12 #include <mrpt/core/format.h>
19 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
27 class SocketMonitor :
public zmq::monitor_t
30 SocketMonitor() =
default;
33 zmq::monitor_t::abort();
34 if (runningMonitor_.joinable()) runningMonitor_.join();
37 void monitor(zmq::socket_t& s)
39 static std::atomic_int nonce = 1000;
40 const int v = nonce++;
42 const std::string endpoint =
43 mrpt::format(
"inproc://monitor%i_%p.req", v,
s.operator
void*());
45 runningMonitor_ = std::thread(
50 zmq::monitor_t::monitor(s, endpoint, ZMQ_EVENT_ALL);
52 catch (
const std::exception& e)
54 if (zmq_errno() == ETERM)
60 std::cerr <<
"[MySocketMonitor] Error: " << e.what()
61 <<
" (zmq_errno=" << zmq_errno() <<
")\n";
67 void setConnected(
bool v)
69 std::lock_guard<std::mutex> lck(connectedMtx_);
73 void on_event_disconnected(
74 [[maybe_unused]]
const zmq_event_t& event_, [[maybe_unused]]
const char* addr_)
override
79 void on_event_connected(
80 [[maybe_unused]]
const zmq_event_t& event_, [[maybe_unused]]
const char* addr_)
override
85 bool connected()
const
87 std::lock_guard<std::mutex> lck(connectedMtx_);
92 bool connected_ =
false;
93 mutable std::mutex connectedMtx_;
95 std::thread runningMonitor_;