s->fns = NULL;
}
-/*
- * Whenever a task commits suicide by returning from post_select with t->error
- * < 0, it also removes its btr node. We do exactly that to kill a running
- * task. Note that the scheduler checks t->error also _before_ each pre/post
- * select call, so the victim will never be scheduled again.
- */
-static void kill_btrn(struct btr_node **btrnp, struct task *t, int error)
-{
- if (t->error < 0)
- return;
- t->error = error;
- btr_remove_node(btrnp);
-}
-
static void notify_receivers(int error)
{
int i;
if (!st->ct)
goto out;
if (st->ct->task.error >= 0) {
- kill_btrn(&st->ct->btrn, &st->ct->task, -E_AUDIOD_OFF);
+ task_notify(&st->ct->task, E_AUDIOD_OFF);
goto out;
}
close_stat_pipe();
struct timeval diff;
tv_diff(now, &st->last_status_read, &diff);
if (diff.tv_sec > 61)
- kill_btrn(&st->ct->btrn, &st->ct->task,
- -E_STATUS_TIMEOUT);
+ task_notify(&st->ct->task, E_AUDIOD_OFF);
goto out;
}
btr_merge(st->btrn, st->min_iqs);
sz = btr_next_buffer(st->btrn, &buf);
ret = for_each_stat_item(buf, sz, update_item);
if (ret < 0) {
- kill_btrn(&st->ct->btrn, &st->ct->task, ret);
+ task_notify(&st->ct->task, E_AUDIOD_OFF);
goto out;
}
if (sz != ret) {