@@ -683,10 +683,12 @@ class active_poller_t
683
683
684
684
void add (zmq::socket_ref socket, event_flags events, handler_type handler)
685
685
{
686
+ const Ref ref{socket};
687
+
686
688
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) " );
688
690
auto ret = handlers.emplace (
689
- socket , std::make_shared<handler_type>(std::move (handler)));
691
+ ref , std::make_shared<handler_type>(std::move (handler)));
690
692
if (!ret.second )
691
693
throw error_t (EINVAL); // already added
692
694
try {
@@ -695,7 +697,28 @@ class active_poller_t
695
697
}
696
698
catch (...) {
697
699
// 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);
699
722
throw ;
700
723
}
701
724
}
@@ -707,11 +730,23 @@ class active_poller_t
707
730
need_rebuild = true ;
708
731
}
709
732
733
+ void remove (fd_t fd)
734
+ {
735
+ base_poller.remove (fd);
736
+ handlers.erase (fd);
737
+ need_rebuild = true ;
738
+ }
739
+
710
740
void modify (zmq::socket_ref socket, event_flags events)
711
741
{
712
742
base_poller.modify (socket, events);
713
743
}
714
744
745
+ void modify (fd_t fd, event_flags events)
746
+ {
747
+ base_poller.modify (fd, events);
748
+ }
749
+
715
750
size_t wait (std::chrono::milliseconds timeout)
716
751
{
717
752
if (need_rebuild) {
@@ -741,7 +776,10 @@ class active_poller_t
741
776
bool need_rebuild{false };
742
777
743
778
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
+
745
783
std::vector<decltype (base_poller)::event_type> poller_events{};
746
784
std::vector<std::shared_ptr<handler_type>> poller_handlers{};
747
785
}; // class active_poller_t
0 commit comments