@@ -683,10 +683,12 @@ class active_poller_t
683683
684684 void add (zmq::socket_ref socket, event_flags events, handler_type handler)
685685 {
686+ const Ref ref{socket};
687+
686688 if (!handler)
687- throw std::invalid_argument (" null handler in active_poller_t::add" );
689+ throw std::invalid_argument (" null handler in active_poller_t::add (socket) " );
688690 auto ret = handlers.emplace (
689- socket , std::make_shared<handler_type>(std::move (handler)));
691+ ref , std::make_shared<handler_type>(std::move (handler)));
690692 if (!ret.second )
691693 throw error_t (EINVAL); // already added
692694 try {
@@ -695,7 +697,28 @@ class active_poller_t
695697 }
696698 catch (...) {
697699 // rollback
698- handlers.erase (socket);
700+ handlers.erase (ref);
701+ throw ;
702+ }
703+ }
704+
705+ void add (fd_t fd, event_flags events, handler_type handler)
706+ {
707+ const Ref ref{fd};
708+
709+ if (!handler)
710+ throw std::invalid_argument (" null handler in active_poller_t::add (fd)" );
711+ auto ret = handlers.emplace (
712+ ref, std::make_shared<handler_type>(std::move (handler)));
713+ if (!ret.second )
714+ throw error_t (EINVAL); // already added
715+ try {
716+ base_poller.add (fd, events, ret.first ->second .get ());
717+ need_rebuild = true ;
718+ }
719+ catch (...) {
720+ // rollback
721+ handlers.erase (ref);
699722 throw ;
700723 }
701724 }
@@ -707,11 +730,23 @@ class active_poller_t
707730 need_rebuild = true ;
708731 }
709732
733+ void remove (fd_t fd)
734+ {
735+ base_poller.remove (fd);
736+ handlers.erase (fd);
737+ need_rebuild = true ;
738+ }
739+
710740 void modify (zmq::socket_ref socket, event_flags events)
711741 {
712742 base_poller.modify (socket, events);
713743 }
714744
745+ void modify (fd_t fd, event_flags events)
746+ {
747+ base_poller.modify (fd, events);
748+ }
749+
715750 size_t wait (std::chrono::milliseconds timeout)
716751 {
717752 if (need_rebuild) {
@@ -741,7 +776,10 @@ class active_poller_t
741776 bool need_rebuild{false };
742777
743778 poller_t <handler_type> base_poller{};
744- std::unordered_map<socket_ref, std::shared_ptr<handler_type>> handlers{};
779+
780+ using Ref = std::variant<socket_ref, fd_t >;
781+ std::unordered_map<Ref, std::shared_ptr<handler_type>> handlers{};
782+
745783 std::vector<decltype (base_poller)::event_type> poller_events{};
746784 std::vector<std::shared_ptr<handler_type>> poller_handlers{};
747785}; // class active_poller_t
0 commit comments