[BUG] event pollers must not wait if a task exists in the run queue

Under some circumstances, a task may already lie in the run queue
(eg: inter-task wakeup). It is disastrous to wait for an event in
this case because some processing gets delayed.
diff --git a/src/ev_epoll.c b/src/ev_epoll.c
index 326d5a4..0ce68b0 100644
--- a/src/ev_epoll.c
+++ b/src/ev_epoll.c
@@ -232,7 +232,9 @@
 		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;
diff --git a/src/ev_kqueue.c b/src/ev_kqueue.c
index 773db74..f34cdc3 100644
--- a/src/ev_kqueue.c
+++ b/src/ev_kqueue.c
@@ -106,7 +106,11 @@
 	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))
diff --git a/src/ev_poll.c b/src/ev_poll.c
index 54cd138..63dce5b 100644
--- a/src/ev_poll.c
+++ b/src/ev_poll.c
@@ -124,7 +124,9 @@
 	}
       
 	/* 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;
diff --git a/src/ev_select.c b/src/ev_select.c
index 1b897de..bbbbfe0 100644
--- a/src/ev_select.c
+++ b/src/ev_select.c
@@ -89,7 +89,7 @@
 		
 	/* 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 */
diff --git a/src/ev_sepoll.c b/src/ev_sepoll.c
index 26c5b03..800ac0b 100644
--- a/src/ev_sepoll.c
+++ b/src/ev_sepoll.c
@@ -424,9 +424,10 @@
 	}
 	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.
 		 */