Problem: No type-safe alternatives when polling or needing a reference to a socket

Solution: Introduce a socket_ref that is a non-owning nullable reference to a socket
This commit is contained in:
Gudmundur Adalsteinsson
2019-04-07 21:10:04 +00:00
parent b0ac8acd60
commit c6a3529cd1
5 changed files with 443 additions and 209 deletions

View File

@@ -373,12 +373,12 @@ class active_poller_t
using handler_t = std::function<void(short)>;
void add(zmq::socket_t &socket, short events, handler_t handler)
void add(zmq::socket_ref socket, short events, handler_t handler)
{
auto it = decltype(handlers)::iterator{};
auto inserted = bool{};
std::tie(it, inserted) =
handlers.emplace(static_cast<void *>(socket),
handlers.emplace(socket,
std::make_shared<handler_t>(std::move(handler)));
try {
base_poller.add(socket, events,
@@ -388,20 +388,20 @@ class active_poller_t
catch (const zmq::error_t &) {
// rollback
if (inserted) {
handlers.erase(static_cast<void *>(socket));
handlers.erase(socket);
}
throw;
}
}
void remove(zmq::socket_t &socket)
void remove(zmq::socket_ref socket)
{
base_poller.remove(socket);
handlers.erase(static_cast<void *>(socket));
handlers.erase(socket);
need_rebuild = true;
}
void modify(zmq::socket_t &socket, short events)
void modify(zmq::socket_ref socket, short events)
{
base_poller.modify(socket, events);
}
@@ -435,7 +435,7 @@ class active_poller_t
bool need_rebuild{false};
poller_t<handler_t> base_poller{};
std::unordered_map<void *, std::shared_ptr<handler_t>> handlers{};
std::unordered_map<socket_ref, std::shared_ptr<handler_t>> handlers{};
std::vector<zmq_poller_event_t> poller_events{};
std::vector<std::shared_ptr<handler_t>> poller_handlers{};
}; // class active_poller_t