X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=948204dc8829a78c3a4595d5a03dde48733d0462;hp=c5a88a9d5820a0d61c0b8364af0aced414a32fdb;hb=0b43ec5d;hpb=3cc5654fec9db630eac146f8475067228efe51ae diff --git a/audiod.c b/audiod.c index c5a88a9d..948204dc 100644 --- a/audiod.c +++ b/audiod.c @@ -408,6 +408,7 @@ static void writer_cleanup(struct writer_node *wn) PARA_INFO_LOG("closing %s\n", writer_names[wn->writer_num]); w->close(wn); btr_remove_node(&wn->btrn); + task_reap(&wn->task); } static void close_writers(struct slot_info *s) @@ -1005,7 +1006,7 @@ err: static void signal_pre_select(struct sched *s, struct task *t) { - struct signal_task *st = container_of(t, struct signal_task, task); + struct signal_task *st = task_context(t); para_fd_set(st->fd, &s->rfds, &s->max_fileno); } @@ -1024,13 +1025,6 @@ static int signal_post_select(struct sched *s, __a_unused struct task *t) return 0; } -static void signal_setup_default(struct signal_task *st) -{ - st->task.pre_select = signal_pre_select; - st->task.post_select = signal_post_select; - sprintf(st->task.status, "signal task"); -} - static void command_pre_select(struct sched *s, struct task *t) { struct command_task *ct = container_of(t, struct command_task, task); @@ -1087,6 +1081,7 @@ static void close_stat_pipe(void) if (!stat_task->ct) return; client_close(stat_task->ct); + task_reap(&stat_task->ct->task); stat_task->ct = NULL; clear_and_dump_items(); stat_task->length_seconds = 0; @@ -1118,10 +1113,10 @@ static bool must_close_slot(int slot_num) return false; if (a->num_writers > 0) { for (i = 0; i < a->num_writers; i++) - if (s->wns && s->wns[i].task.error >= 0) + if (s->wns && s->wns[i].task->error >= 0) return false; } else { - if (s->wns && s->wns[0].task.error >= 0) + if (s->wns && s->wns[0].task->error >= 0) return false; } return true; @@ -1237,8 +1232,8 @@ static int status_post_select(struct sched *s, struct task *t) if (audiod_status == AUDIOD_OFF) { if (!st->ct) goto out; - if (st->ct->task.error >= 0) { - task_notify(&st->ct->task, E_AUDIOD_OFF); + if (st->ct->task->error >= 0) { + task_notify(st->ct->task, E_AUDIOD_OFF); goto out; } close_stat_pipe(); @@ -1261,14 +1256,14 @@ static int status_post_select(struct sched *s, struct task *t) struct timeval diff; tv_diff(now, &st->last_status_read, &diff); if (diff.tv_sec > 61) - task_notify(&st->ct->task, E_STATUS_TIMEOUT); + task_notify(st->ct->task, E_STATUS_TIMEOUT); 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) { - task_notify(&st->ct->task, -ret); + task_notify(st->ct->task, -ret); goto out; } if (sz != ret) { @@ -1421,7 +1416,6 @@ int main(int argc, char *argv[]) FOR_EACH_SLOT(i) clear_slot(i); setup_signal_handling(); - signal_setup_default(sig_task); init_status_task(stat_task); init_command_task(cmd_task); @@ -1429,7 +1423,12 @@ int main(int argc, char *argv[]) if (conf.daemon_given) daemonize(false /* parent exits immediately */); - register_task(&sched, &sig_task->task); + sig_task->task = task_register(&(struct task_info) { + .name = "signal", + .pre_select = signal_pre_select, + .post_select = signal_post_select, + .context = sig_task, + }, &sched); register_task(&sched, &cmd_task->task); register_task(&sched, &stat_task->task); sched.default_timeout.tv_sec = 2;