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;
 }