mirror of
https://github.com/zeromq/libzmq.git
synced 2024-12-13 18:55:10 +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.
|
// 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,20 +176,23 @@ 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 ();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Clean up the pollset and update the fd_table accordingly.
|
void zmq::poll_t::cleanup_retired ()
|
||||||
if (retired) {
|
{
|
||||||
pollset_t::size_type i = 0;
|
// Clean up the pollset and update the fd_table accordingly.
|
||||||
while (i < pollset.size ()) {
|
if (retired) {
|
||||||
if (pollset[i].fd == retired_fd)
|
pollset_t::size_type i = 0;
|
||||||
pollset.erase (pollset.begin () + i);
|
while (i < pollset.size ()) {
|
||||||
else {
|
if (pollset[i].fd == retired_fd)
|
||||||
fd_table[pollset[i].fd].index = i;
|
pollset.erase (pollset.begin () + i);
|
||||||
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.
|
// 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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user