X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=sched.c;h=ae82b23338284d9278c1fffd90c93460b65bd6da;hp=e67579b32339c17101bbe2e3cedc45c9410cc7bc;hb=5edb8fd098c2f392702a7b07bda664f1acf4b350;hpb=58ce610c5a46eb03810d8a93b10d5bc51bc10b12 diff --git a/sched.c b/sched.c index e67579b3..ae82b233 100644 --- a/sched.c +++ b/sched.c @@ -98,14 +98,6 @@ static void sched_post_select(struct sched *s) t->notification = 0; if (t->error >= 0) continue; - /* - * We have to check whether the list is empty because the call - * to ->post_select() might have called sched_shutdown(). In - * this case t has been unregistered already, so we must not - * unregister it again. - */ - if (list_empty(&s->post_select_list)) - return; unregister_task(t); } } @@ -195,29 +187,6 @@ void register_task(struct sched *s, struct task *t) } } -/** - * Unregister all tasks. - * - * \param s The scheduler instance to shut down. - * - * This will cause \a schedule() to return immediately because both the - * \a pre_select_list and the \a post_select_list are empty. This function - * must be called from the post_select (rather than the pre_select) method. - */ -void sched_shutdown(struct sched *s) -{ - struct task *t, *tmp; - - list_for_each_entry_safe(t, tmp, &s->pre_select_list, pre_select_node) { - t->error = -E_SCHED_SHUTDOWN; - unregister_task(t); - } - list_for_each_entry_safe(t, tmp, &s->post_select_list, post_select_node) { - t->error = -E_SCHED_SHUTDOWN; - unregister_task(t); - } -} - /** * Get the list of all registered tasks. * @@ -295,6 +264,25 @@ 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. *