mirror of
https://github.com/zeromq/libzmq.git
synced 2024-12-12 18:40:27 +01:00
Problem: assertion failure in poll_t::poll if timer_event retired a
pollset entry Solution: clean up retired entries before poll
This commit is contained in:
parent
a2af3d18cc
commit
2f27bcd74b
27
src/poll.cpp
27
src/poll.cpp
@ -142,6 +142,8 @@ void zmq::poll_t::loop ()
|
||||
// Execute any due timers.
|
||||
int timeout = (int) execute_timers ();
|
||||
|
||||
cleanup_retired ();
|
||||
|
||||
if (pollset.empty ()) {
|
||||
// TODO yield? or sleep for timeout?
|
||||
continue;
|
||||
@ -174,20 +176,23 @@ void zmq::poll_t::loop ()
|
||||
if (pollset[i].revents & POLLIN)
|
||||
fd_table[pollset[i].fd].events->in_event ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Clean up the pollset and update the fd_table accordingly.
|
||||
if (retired) {
|
||||
pollset_t::size_type i = 0;
|
||||
while (i < pollset.size ()) {
|
||||
if (pollset[i].fd == retired_fd)
|
||||
pollset.erase (pollset.begin () + i);
|
||||
else {
|
||||
fd_table[pollset[i].fd].index = i;
|
||||
i++;
|
||||
}
|
||||
void zmq::poll_t::cleanup_retired ()
|
||||
{
|
||||
// Clean up the pollset and update the fd_table accordingly.
|
||||
if (retired) {
|
||||
pollset_t::size_type i = 0;
|
||||
while (i < pollset.size ()) {
|
||||
if (pollset[i].fd == retired_fd)
|
||||
pollset.erase (pollset.begin () + i);
|
||||
else {
|
||||
fd_table[pollset[i].fd].index = i;
|
||||
i++;
|
||||
}
|
||||
retired = false;
|
||||
}
|
||||
retired = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,6 +79,8 @@ class poll_t : public poller_base_t
|
||||
// Main event loop.
|
||||
void loop ();
|
||||
|
||||
void cleanup_retired();
|
||||
|
||||
// Reference to ZMQ context.
|
||||
const ctx_t &ctx;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user