return -E_NOT_INITIALIZED;
if (!s->select_function)
s->select_function = para_select;
- gettimeofday(now, NULL);
again:
FD_ZERO(&s->rfds);
FD_ZERO(&s->wfds);
s->timeout = s->default_timeout;
s->max_fileno = -1;
+ gettimeofday(now, NULL);
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->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);
sched_post_select(s);
if (list_empty(&pre_select_list) && list_empty(&post_select_list))
}
return -E_NO_SUCH_TASK;
}
+
+void sched_min_delay(struct sched *s)
+{
+ s->timeout.tv_sec = 0;
+ s->timeout.tv_usec = 1;
+}
+
+void sched_request_timeout(struct timeval *timeout, struct sched *s)
+{
+ if (tv_diff(&s->timeout, timeout, NULL) > 0)
+ s->timeout = *timeout;
+}
+
+void sched_request_timeout_ms(long unsigned ms, struct sched *s)
+{
+ struct timeval tv;
+ ms2tv(ms, &tv);
+ sched_request_timeout(&tv, s);
+}
+
+void sched_request_barrier(struct timeval *barrier, struct sched *s)
+{
+ struct timeval diff;
+
+ if (tv_diff(now, barrier, &diff) > 0)
+ return;
+ sched_request_timeout(&diff, s);
+}
+
+void sched_request_barrier_or_min_delay(struct timeval *barrier, struct sched *s)
+{
+ struct timeval diff;
+
+ if (tv_diff(now, barrier, &diff) > 0)
+ return sched_min_delay(s);
+ sched_request_timeout(&diff, s);
+}