X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=948204dc8829a78c3a4595d5a03dde48733d0462;hp=4b88ec5bba61c53be43e901edbae2bc8c7c84a5e;hb=0b43ec5d;hpb=8bf35b38357c3ce59f52ae87f6e84e4b6d183ac7 diff --git a/audiod.c b/audiod.c index 4b88ec5b..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) @@ -445,6 +446,7 @@ static void close_filters(struct slot_info *s) if (f->close) f->close(fn); btr_remove_node(&fn->btrn); + task_reap(&fn->task); } free(s->fns); s->fns = NULL; @@ -498,22 +500,26 @@ static void open_filters(struct slot_info *s) s->fns = para_calloc(nf * sizeof(struct filter_node)); parent = s->receiver_node->btrn; for (i = 0; i < nf; i++) { + char buf[20]; struct filter *f = filters + a->filter_nums[i]; fn = s->fns + i; fn->filter_num = a->filter_nums[i]; fn->conf = a->filter_conf[i]; - fn->task.pre_select = f->pre_select; - fn->task.post_select = f->post_select; fn->btrn = btr_new_node(&(struct btr_node_description) EMBRACE(.name = f->name, .parent = parent, .handler = f->execute, .context = fn)); f->open(fn); - register_task(&sched, &fn->task); + sprintf(buf, "%s (slot %d)", f->name, (int)(s - slot)); + fn->task = task_register(&(struct task_info) { + .name = buf, + .pre_select = f->pre_select, + .post_select = f->post_select, + .context = fn, + }, &sched); parent = fn->btrn; PARA_NOTICE_LOG("%s filter %d/%d (%s) started in slot %d\n", audio_formats[s->format], i, nf, f->name, (int)(s - slot)); - sprintf(fn->task.status, "%s (slot %d)", f->name, (int)(s - slot)); } } @@ -1000,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); } @@ -1019,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); @@ -1082,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; @@ -1109,14 +1109,14 @@ static bool must_close_slot(int slot_num) if (s->receiver_node && s->receiver_node->task->error >= 0) return false; for (i = 0; i < a->num_filters; i++) - if (s->fns && s->fns[i].task.error >= 0) + if (s->fns && s->fns[i].task->error >= 0) 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; @@ -1232,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(); @@ -1256,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) { @@ -1416,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); @@ -1424,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;