+/**
+ * Return the notification value of a task.
+ *
+ * \param t The task to get the notification value from.
+ *
+ * \return The notification value. If this is negative, the task has been
+ * notified by another task. Tasks are supposed to check for notifications by
+ * calling this function from their post_select method.
+ *
+ * \sa \ref task_notify().
+ */
+int task_get_notification(struct task *t)
+{
+ return t->notification;
+}
+
+/**
+ * Set the notification value of all tasks of a scheduler instance.
+ *
+ * \param s The scheduler instance whose tasks should be notified.
+ * \param err A positive error code.
+ *
+ * This simply iterates over all existing tasks of \a s and sets each
+ * task's notification value to \p -err.
+ */
+void task_notify_all(struct sched *s, int err)
+{
+ struct task *t;
+
+ list_for_each_entry(t, &s->pre_select_list, pre_select_node)
+ task_notify(t, err);
+ list_for_each_entry(t, &s->post_select_list, post_select_node)
+ task_notify(t, err);
+}
+
+/**
+ * Set the select timeout to the minimal possible value.
+ *
+ * \param s Pointer to the scheduler struct.
+ *
+ * This causes the next select() call to return immediately.
+ */
+void sched_min_delay(struct sched *s)
+{
+ s->select_timeout.tv_sec = s->select_timeout.tv_usec = 0;
+}
+
+/**
+ * Impose an upper bound for the timeout of the next select() call.
+ *
+ * \param to Maximal allowed timeout.
+ * \param s Pointer to the scheduler struct.
+ *
+ * If the current scheduler timeout is already smaller than \a to, this
+ * function does nothing. Otherwise the timeout for the next select() call is
+ * set to the given value.
+ *
+ * \sa sched_request_timeout_ms().
+ */
+void sched_request_timeout(struct timeval *to, struct sched *s)
+{
+ if (tv_diff(&s->select_timeout, to, NULL) > 0)
+ s->select_timeout = *to;
+}
+
+/**
+ * Force the next select() call to return before the given amount of milliseconds.
+ *
+ * \param ms The maximal allowed timeout in milliseconds.
+ * \param s Pointer to the scheduler struct.
+ *
+ * Like sched_request_timeout() this imposes an upper bound on the timeout
+ * value for the next select() call.
+ */
+void sched_request_timeout_ms(long unsigned ms, struct sched *s)
+{
+ struct timeval tv;
+ ms2tv(ms, &tv);
+ sched_request_timeout(&tv, s);
+}
+
+/**
+ * Force the next select() call to return before the given future time.
+ *
+ * \param barrier Absolute time before select() should return.
+ * \param s Pointer to the scheduler struct.
+ *
+ * \return If \a barrier is in the past, this function does nothing and returns
+ * zero. Otherwise it returns one.
+ *
+ * \sa sched_request_barrier_or_min_delay().
+ */
+int sched_request_barrier(struct timeval *barrier, struct sched *s)
+{
+ struct timeval diff;
+
+ if (tv_diff(now, barrier, &diff) > 0)
+ return 0;
+ sched_request_timeout(&diff, s);
+ return 1;
+}
+
+/**
+ * Force the next select() call to return before the given time.
+ *
+ * \param barrier Absolute time before select() should return.
+ * \param s Pointer to the scheduler struct.
+ *
+ * \return If \a barrier is in the past, this function requests a minimal
+ * timeout and returns zero. Otherwise it returns one.
+ *
+ * \sa sched_min_delay(), sched_request_barrier().
+ */
+int sched_request_barrier_or_min_delay(struct timeval *barrier, struct sched *s)
+{
+ struct timeval diff;
+
+ if (tv_diff(now, barrier, &diff) > 0) {
+ sched_min_delay(s);
+ return 0;