@@ -47,10 +47,10 @@ namespace zmqpp
47
47
when += delay;
48
48
}
49
49
50
- void loop::add (socket& socket, Callable callable, short const event /* = POLL_IN */ )
50
+ void loop::add (socket& socket, Callable callable, short const event /* = POLL_IN */ , Callable after_remove_cb /* = Callable(nullptr) */ )
51
51
{
52
52
zmq_pollitem_t item{static_cast <void *> (socket), 0 , event, 0 };
53
- add (item, callable);
53
+ add (item, callable, after_remove_cb );
54
54
}
55
55
56
56
void loop::add (raw_socket_t const descriptor, Callable callable, short const event /* = POLL_IN */ )
@@ -59,11 +59,11 @@ namespace zmqpp
59
59
add (item, callable);
60
60
}
61
61
62
- void loop::add (const zmq_pollitem_t & item, Callable callable)
62
+ void loop::add (const zmq_pollitem_t & item, Callable callable, Callable after_remove_cb )
63
63
{
64
64
poller_.add (item);
65
65
rebuild_poller_ = true ;
66
- items_.push_back (std::make_pair (item, callable));
66
+ items_.push_back (std::make_tuple (item, callable, after_remove_cb ));
67
67
}
68
68
69
69
loop::timer_id_t loop::add (std::chrono::milliseconds delay, size_t times, Callable callable)
@@ -110,16 +110,24 @@ namespace zmqpp
110
110
sockRemoveLater_.push_back (&socket);
111
111
return ;
112
112
}
113
- items_.erase (std::remove_if (items_.begin (), items_.end (), [&socket](const PollItemCallablePair & pair) -> bool
113
+
114
+ std::vector<PollItemCallableTuple> cb_after_remove;
115
+
116
+ items_.erase (std::remove_if (items_.begin (), items_.end (),
117
+ [&socket, &cb_after_remove](const PollItemCallableTuple & tuple) -> bool
114
118
{
115
- const zmq_pollitem_t &item = pair. first ;
119
+ const zmq_pollitem_t &item = std::get< 0 >(tuple) ;
116
120
if (nullptr != item.socket && item.socket == static_cast <void *> (socket))
117
121
{
122
+ if (std::get<2 >(tuple))
123
+ cb_after_remove.push_back (tuple);
118
124
return true ;
119
125
}
120
126
return false ;
121
127
}), items_.end ());
122
128
poller_.remove (socket);
129
+ for (const PollItemCallableTuple& item : cb_after_remove)
130
+ std::get<2 >(item)();
123
131
}
124
132
125
133
void loop::remove (raw_socket_t const descriptor)
@@ -130,9 +138,9 @@ namespace zmqpp
130
138
fdRemoveLater_.push_back (descriptor);
131
139
return ;
132
140
}
133
- items_.erase (std::remove_if (items_.begin (), items_.end (), [descriptor](const PollItemCallablePair & pair ) -> bool
141
+ items_.erase (std::remove_if (items_.begin (), items_.end (), [descriptor](const PollItemCallableTuple & tuple ) -> bool
134
142
{
135
- const zmq_pollitem_t &item = pair. first ;
143
+ const zmq_pollitem_t &item = std::get< 0 >(tuple) ;
136
144
if (nullptr == item.socket && item.fd == descriptor)
137
145
{
138
146
return true ;
@@ -194,12 +202,12 @@ namespace zmqpp
194
202
195
203
bool loop::start_handle_poller ()
196
204
{
197
- for (const PollItemCallablePair &pair : items_)
205
+ for (const PollItemCallableTuple &tuple : items_)
198
206
{
199
- const zmq_pollitem_t &pollitem = pair. first ;
207
+ const zmq_pollitem_t &pollitem = std::get< 0 >(tuple) ;
200
208
201
209
if (poller_.has_input (pollitem) || poller_.has_error (pollitem) || poller_.has_output (pollitem))
202
- if (!pair. second ())
210
+ if (!std::get< 1 >(tuple) ())
203
211
return false ;
204
212
}
205
213
return true ;
0 commit comments