#include <regex.h>
#include <assert.h>
#include <sys/time.h>
+#include <stdbool.h>
#include "para.h"
#include "ipc.h"
list_del(&t->post_select_node);
}
+static inline bool timeout_is_zero(struct sched *s)
+{
+ struct timeval *tv = &s->select_timeout;
+ return tv->tv_sec == 0 && tv->tv_usec == 0;
+}
+
static void sched_preselect(struct sched *s)
{
struct task *t, *tmp;
list_for_each_entry_safe(t, tmp, &pre_select_list, pre_select_node) {
- if (t->pre_select)
- t->pre_select(s, t);
- if (t->error < 0)
+ if (t->error < 0) {
unregister_task(t);
+ continue;
+ }
+ if (!t->pre_select)
+ continue;
+ t->pre_select(s, t);
+ if (timeout_is_zero(s))
+ break;
}
}
sched_preselect(s);
if (list_empty(&pre_select_list) && list_empty(&post_select_list))
return 0;
- ret = s->select_function(s->max_fileno + 1, &s->rfds, &s->wfds,
- &s->select_timeout);
- if (ret < 0)
- return ret;
- if (ret == 0) {
- /*
- * APUE: Be careful not to check the descriptor sets on return
- * unless the return value is greater than zero. The return
- * state of the descriptor sets is implementation dependent if
- * either a signal is caught or the timer expires.
- */
- FD_ZERO(&s->rfds);
- FD_ZERO(&s->wfds);
+ if (!timeout_is_zero(s)) {
+ ret = s->select_function(s->max_fileno + 1, &s->rfds, &s->wfds,
+ &s->select_timeout);
+ if (ret < 0)
+ return ret;
+ if (ret == 0) {
+ /*
+ * APUE: Be careful not to check the descriptor sets on return
+ * unless the return value is greater than zero. The return
+ * state of the descriptor sets is implementation dependent if
+ * either a signal is caught or the timer expires.
+ */
+ FD_ZERO(&s->rfds);
+ FD_ZERO(&s->wfds);
+ }
+ gettimeofday(now, NULL);
}
- gettimeofday(now, NULL);
sched_post_select(s);
if (list_empty(&pre_select_list) && list_empty(&post_select_list))
return 0;