Merge branch 'pools' into merge-pools
diff --git a/src/ev_epoll.c b/src/ev_epoll.c
index a867e8d..d313d56 100644
--- a/src/ev_epoll.c
+++ b/src/ev_epoll.c
@@ -231,10 +231,12 @@
fd_flush_changes();
/* now let's wait for events */
- if (tv_isset(exp))
- wait_time = tv_ms_remain(&now, exp);
- else
+ if (tv_iseternity(exp))
wait_time = -1;
+ else if (tv_isge(&now, exp))
+ wait_time = 0;
+ else
+ wait_time = __tv_ms_elapsed(&now, exp) + 1;
status = epoll_wait(epoll_fd, epoll_events, maxfd, wait_time);
tv_now(&now);
diff --git a/src/ev_poll.c b/src/ev_poll.c
index 3c97707..0166bd6 100644
--- a/src/ev_poll.c
+++ b/src/ev_poll.c
@@ -124,10 +124,12 @@
}
/* now let's wait for events */
- if (tv_isset(exp))
- wait_time = tv_ms_remain(&now, exp);
- else
+ if (tv_iseternity(exp))
wait_time = -1;
+ else if (tv_isge(&now, exp))
+ wait_time = 0;
+ else
+ wait_time = __tv_ms_elapsed(&now, exp) + 1;
status = poll(poll_events, nbfd, wait_time);
tv_now(&now);
diff --git a/src/ev_sepoll.c b/src/ev_sepoll.c
index 516c0f5..3e25866 100644
--- a/src/ev_sepoll.c
+++ b/src/ev_sepoll.c
@@ -380,10 +380,12 @@
wait_time = 0;
}
else {
- if (tv_isset(exp))
- wait_time = tv_ms_remain(&now, exp);
- else
+ if (tv_iseternity(exp))
wait_time = -1;
+ else if (tv_isge(&now, exp))
+ wait_time = 0;
+ else
+ wait_time = __tv_ms_elapsed(&now, exp) + 1;
}
/* now let's wait for real events */
diff --git a/src/task.c b/src/task.c
index 182de25..7f6e0e7 100644
--- a/src/task.c
+++ b/src/task.c
@@ -96,28 +96,30 @@
struct task *task;
void *data;
+#ifdef WAKE_HINT_CHECK_FIRST
/*
* Hint: tasks are *rarely* expired. So we can try to optimize
- * by not scanning the tree at all in most cases.
+ * by not scanning the tree at all in most cases. However, this
+ * code costs 160 more bytes which do not look much useful because
+ * the performance win is not obvious.
*/
if (likely(timer_wq.data != NULL)) {
task = LIST_ELEM(timer_wq.data, struct task *, qlist);
if (likely(tv_isgt(&task->expire, &now))) {
- tv_remain(&now, &task->expire, next);
+ *next = task->expire;
return;
}
}
-
/* OK we lose. Let's scan the tree then. */
- tv_eternity(next);
+#endif
tree64_foreach(&timer_wq, data, stack, slen) {
task = LIST_ELEM(data, struct task *, qlist);
if (tv_isgt(&task->expire, &now)) {
- tv_remain(&now, &task->expire, next);
- break;
+ *next = task->expire;
+ return;
}
/*
@@ -132,6 +134,7 @@
task->state = TASK_RUNNING;
}
}
+ tv_eternity(next);
return;
}