Commit 2f27bcd7 authored by Simon Giesecke's avatar Simon Giesecke

Problem: assertion failure in poll_t::poll if timer_event retired a

pollset entry

Solution: clean up retired entries before poll
parent a2af3d18
...@@ -142,6 +142,8 @@ void zmq::poll_t::loop () ...@@ -142,6 +142,8 @@ void zmq::poll_t::loop ()
// Execute any due timers. // Execute any due timers.
int timeout = (int) execute_timers (); int timeout = (int) execute_timers ();
cleanup_retired ();
if (pollset.empty ()) { if (pollset.empty ()) {
// TODO yield? or sleep for timeout? // TODO yield? or sleep for timeout?
continue; continue;
...@@ -174,7 +176,11 @@ void zmq::poll_t::loop () ...@@ -174,7 +176,11 @@ void zmq::poll_t::loop ()
if (pollset[i].revents & POLLIN) if (pollset[i].revents & POLLIN)
fd_table[pollset[i].fd].events->in_event (); fd_table[pollset[i].fd].events->in_event ();
} }
}
}
void zmq::poll_t::cleanup_retired ()
{
// Clean up the pollset and update the fd_table accordingly. // Clean up the pollset and update the fd_table accordingly.
if (retired) { if (retired) {
pollset_t::size_type i = 0; pollset_t::size_type i = 0;
...@@ -188,7 +194,6 @@ void zmq::poll_t::loop () ...@@ -188,7 +194,6 @@ void zmq::poll_t::loop ()
} }
retired = false; retired = false;
} }
}
} }
void zmq::poll_t::worker_routine (void *arg_) void zmq::poll_t::worker_routine (void *arg_)
......
...@@ -79,6 +79,8 @@ class poll_t : public poller_base_t ...@@ -79,6 +79,8 @@ class poll_t : public poller_base_t
// Main event loop. // Main event loop.
void loop (); void loop ();
void cleanup_retired();
// Reference to ZMQ context. // Reference to ZMQ context.
const ctx_t &ctx; const ctx_t &ctx;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment