#include <types/global.h>
#include <proto/fd.h>
-#include <proto/signal.h>
-#include <proto/task.h>
-
/* private data */
fd_nbupdt = 0;
/* compute the epoll_wait() timeout */
-
- if (fd_cache_num || run_queue || signal_queue_len) {
- /* 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 would delay their delivery by
- * the next timeout.
- */
+ if (!exp)
+ wait_time = MAX_DELAY_MS;
+ else if (tick_is_expired(exp, now_ms))
wait_time = 0;
- }
else {
- if (!exp)
+ wait_time = TICKS_TO_MS(tick_remain(now_ms, exp)) + 1;
+ if (wait_time > MAX_DELAY_MS)
wait_time = MAX_DELAY_MS;
- else if (tick_is_expired(exp, now_ms))
- wait_time = 0;
- else {
- wait_time = TICKS_TO_MS(tick_remain(now_ms, exp)) + 1;
- if (wait_time > MAX_DELAY_MS)
- wait_time = MAX_DELAY_MS;
- }
}
/* now let's wait for polled events */
#include <types/global.h>
#include <proto/fd.h>
-#include <proto/signal.h>
-#include <proto/task.h>
+
/* private data */
static int kqueue_fd;
timeout.tv_sec = 0;
timeout.tv_nsec = 0;
- if (!fd_cache_num && !run_queue && !signal_queue_len) {
- if (!exp) {
- delta_ms = MAX_DELAY_MS;
- timeout.tv_sec = (MAX_DELAY_MS / 1000);
- timeout.tv_nsec = (MAX_DELAY_MS % 1000) * 1000000;
- }
- else if (!tick_is_expired(exp, now_ms)) {
- delta_ms = TICKS_TO_MS(tick_remain(now_ms, exp)) + 1;
- if (delta_ms > MAX_DELAY_MS)
- delta_ms = MAX_DELAY_MS;
- timeout.tv_sec = (delta_ms / 1000);
- timeout.tv_nsec = (delta_ms % 1000) * 1000000;
- }
+ if (!exp) {
+ delta_ms = MAX_DELAY_MS;
+ timeout.tv_sec = (MAX_DELAY_MS / 1000);
+ timeout.tv_nsec = (MAX_DELAY_MS % 1000) * 1000000;
+ }
+ else if (!tick_is_expired(exp, now_ms)) {
+ delta_ms = TICKS_TO_MS(tick_remain(now_ms, exp)) + 1;
+ if (delta_ms > MAX_DELAY_MS)
+ delta_ms = MAX_DELAY_MS;
+ timeout.tv_sec = (delta_ms / 1000);
+ timeout.tv_nsec = (delta_ms % 1000) * 1000000;
}
fd = MIN(maxfd, global.tune.maxpollevents);
#include <types/global.h>
#include <proto/fd.h>
-#include <proto/signal.h>
-#include <proto/task.h>
static unsigned int *fd_evts[2];
}
/* now let's wait for events */
- if (fd_cache_num || run_queue || signal_queue_len)
- wait_time = 0;
- else if (!exp)
+ if (!exp)
wait_time = MAX_DELAY_MS;
else if (tick_is_expired(exp, now_ms))
wait_time = 0;
#include <types/global.h>
#include <proto/fd.h>
-#include <proto/signal.h>
-#include <proto/task.h>
static fd_set *fd_evts[2];
delta.tv_sec = 0;
delta.tv_usec = 0;
- if (!fd_cache_num && !run_queue && !signal_queue_len) {
- if (!exp) {
- delta_ms = MAX_DELAY_MS;
- delta.tv_sec = (MAX_DELAY_MS / 1000);
- delta.tv_usec = (MAX_DELAY_MS % 1000) * 1000;
- }
- else if (!tick_is_expired(exp, now_ms)) {
- delta_ms = TICKS_TO_MS(tick_remain(now_ms, exp)) + SCHEDULER_RESOLUTION;
- if (delta_ms > MAX_DELAY_MS)
- delta_ms = MAX_DELAY_MS;
- delta.tv_sec = (delta_ms / 1000);
- delta.tv_usec = (delta_ms % 1000) * 1000;
- }
+ if (!exp) {
+ delta_ms = MAX_DELAY_MS;
+ delta.tv_sec = (MAX_DELAY_MS / 1000);
+ delta.tv_usec = (MAX_DELAY_MS % 1000) * 1000;
+ }
+ else if (!tick_is_expired(exp, now_ms)) {
+ delta_ms = TICKS_TO_MS(tick_remain(now_ms, exp)) + SCHEDULER_RESOLUTION;
+ if (delta_ms > MAX_DELAY_MS)
+ delta_ms = MAX_DELAY_MS;
+ delta.tv_sec = (delta_ms / 1000);
+ delta.tv_usec = (delta_ms % 1000) * 1000;
}
/* let's restore fdset state */
if (jobs == 0)
break;
+ /* expire immediately if events are pending */
+ if (fd_cache_num || run_queue || signal_queue_len)
+ next = now_ms;
+
/* The poller will ensure it returns around <next> */
cur_poller.poll(&cur_poller, next);
fd_process_cached_events();