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:
Simon Giesecke 2018-02-11 13:45:40 +01:00
parent a2af3d18cc
commit 2f27bcd74b
2 changed files with 18 additions and 11 deletions

View File

@ -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;
}
}

View File

@ -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;