fd_flush_changes();
/* now let's wait for events */
- if (tv_iseternity(exp))
+ if (run_queue)
+ wait_time = 0;
+ else if (tv_iseternity(exp))
wait_time = -1;
else if (tv_isge(&now, exp))
wait_time = 0;
struct timespec timeout, *to_ptr;
to_ptr = NULL; // no timeout
- if (tv_isset(exp)) {
+ if (run_queue) {
+ timeout.tv_sec = timeout.tv_nsec = 0;
+ to_ptr = &timeout;
+ }
+ else if (tv_isset(exp)) {
struct timeval delta;
if (tv_isge(&now, exp))
}
/* now let's wait for events */
- if (tv_iseternity(exp))
+ if (run_queue)
+ wait_time = 0;
+ else if (tv_iseternity(exp))
wait_time = -1;
else if (tv_isge(&now, exp))
wait_time = 0;
/* allow select to return immediately when needed */
delta.tv_sec = delta.tv_usec = 0;
- if (tv_isset(exp)) {
+ if (!run_queue && tv_isset(exp)) {
if (tv_islt(&now, exp)) {
tv_remain(&now, exp, &delta);
/* To avoid eventual select loops due to timer precision */
}
last_skipped = 0;
- if (nbspec || status) {
+ if (nbspec || status || run_queue) {
/* Maybe we have processed some events that we must report, or
- * maybe we still have events in the spec list, so we must not
+ * maybe we still have events in the spec list, or there are
+ * some tasks left pending in the run_queue, so we must not
* wait in epoll() otherwise we will delay their delivery by
* the next timeout.
*/