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