X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=0f8fb1a7bd5bba86cc046dbd3224053ef5b079d2;hp=29ceda5355b13d76b822693df63669dcad2909d0;hb=9337bed6e84a4068e750fb6597646b45778eeba7;hpb=7edbace7e8190121765a0517053c00b0106a1bcc diff --git a/audiod.c b/audiod.c index 29ceda53..0f8fb1a7 100644 --- a/audiod.c +++ b/audiod.c @@ -137,6 +137,8 @@ struct status_task { unsigned loaded; /** the associated task structure */ struct task task; + /** do not restart client command until this time */ + struct timeval restart_barrier; }; static struct status_task status_task_struct, *stat_task = &status_task_struct; @@ -452,7 +454,8 @@ static void setup_signal_handling(void) para_install_sighandler(SIGTERM); para_install_sighandler(SIGCHLD); para_install_sighandler(SIGHUP); - signal(SIGPIPE, SIG_IGN); + para_install_sighandler(SIGPIPE); +// signal(SIGPIPE, SIG_IGN); } static void audiod_status_dump(void) @@ -584,7 +587,7 @@ static void close_stat_pipe(void) close(stat_task->fd); del_close_on_fork_list(stat_task->fd); stat_task->fd = -1; - kill_all_decoders(); +// kill_all_decoders(); for (i = 0; i < NUM_STAT_ITEMS; i++) { free(stat_item_values[i]); stat_item_values[i] = NULL; @@ -651,7 +654,6 @@ static void open_filters(int slot_num) s->fc->task.pre_select = filter_pre_select; s->fc->task.event_handler = filter_event_handler; s->fc->task.private_data = s->fc; - s->fc->task.flags = 0; s->fc->eof = 0; s->receiver_node->output_eof = &s->fc->eof; @@ -735,7 +737,6 @@ static void open_writers(int slot_num) for (i = 0; i < a->num_writers; i++) { s->wng->writer_nodes[i].conf = a->writer_conf[i]; s->wng->writer_nodes[i].writer = a->writers[i]; - sprintf(s->wng->writer_nodes[i].task.status, "writer_node"); } ret = wng_open(s->wng); if (ret < 0) { @@ -786,8 +787,7 @@ static void open_receiver(int format) rn->task.pre_select = a->receiver->pre_select; rn->task.post_select = a->receiver->post_select; rn->task.event_handler = rn_event_handler; - rn->task.flags = 0; - sprintf(rn->task.status, "receiver node"); + sprintf(rn->task.status, "%s receiver node", rn->receiver->name); register_task(&rn->task); } @@ -798,7 +798,7 @@ static int is_frozen(int format) return (tv_diff(now, &a->restart_barrier, NULL) > 0)? 0 : 1; } -static void open_current_receiver(void) +static void open_current_receiver(struct sched *s) { int i; @@ -810,6 +810,13 @@ static void open_current_receiver(void) if (decoder_running(i) || is_frozen(i)) return; open_receiver(i); + /* + * the receiver didn't get a chance to put his fd to the fd set. + * Make the upcoming select() return immediately to avoid a long + * timeout. + */ + s->timeout.tv_sec = 0; + s->timeout.tv_usec = 1; } static void compute_time_diff(const struct timeval *status_time) @@ -947,7 +954,7 @@ static void audiod_pre_select(struct sched *s, __a_unused struct task *t) if (audiod_status != AUDIOD_ON || !playing) kill_all_decoders(); else if (playing) - open_current_receiver(); + open_current_receiver(s); FOR_EACH_SLOT(i) { struct slot_info *s = &slot[i]; struct audio_format_info *a; @@ -988,7 +995,6 @@ static void init_audiod_task(struct task *t) t->post_select = audiod_post_select; t->event_handler = NULL; t->private_data = t; - t->flags = 0; sprintf(t->status, "audiod task"); } @@ -1572,7 +1578,6 @@ void signal_setup_default(struct signal_task *st) st->task.pre_select = signal_pre_select; st->task.post_select = signal_post_select; st->task.private_data = st; - st->task.flags = 0; sprintf(st->task.status, "signal task"); } @@ -1605,19 +1610,22 @@ static void init_command_task(struct command_task *ct) ct->task.post_select = command_post_select; ct->task.event_handler = NULL; ct->task.private_data = ct; - ct->task.flags = 0; ct->fd = audiod_get_socket(); /* doesn't return on errors */ sprintf(ct->task.status, "command task"); } static void status_event_handler(__a_unused struct task *t) { + struct timeval delay = {1, 0}; + int i; + struct status_task *st = t->private_data; + PARA_ERROR_LOG("%s\n", PARA_STRERROR(-t->ret)); close_stat_pipe(); /* avoid busy loop if server is down */ - while (sleep(1) > 0) /* FIXME */ - ; /* try again*/ - + tv_add(now, &delay, &st->restart_barrier); + FOR_EACH_AUDIO_FORMAT(i) + afi[i].restart_barrier = st->restart_barrier; } static void status_pre_select(struct sched *s, struct task *t) @@ -1626,7 +1634,8 @@ static void status_pre_select(struct sched *s, struct task *t) t->ret = 1; if (st->fd >= 0 && audiod_status == AUDIOD_OFF) close_stat_pipe(); - if (st->fd < 0 && audiod_status != AUDIOD_OFF) { + if (st->fd < 0 && audiod_status != AUDIOD_OFF + && tv_diff(now, &st->restart_barrier, NULL) > 0) { st->fd = open_stat_pipe(); st->loaded = 0; st->buf[0] = '\0'; @@ -1655,14 +1664,12 @@ static void status_post_select(struct sched *s, struct task *t) static void init_status_task(struct status_task *st) { + memset(st, 0, sizeof(struct status_task)); st->task.pre_select = status_pre_select; st->task.post_select = status_post_select; st->task.event_handler = status_event_handler; st->task.private_data = st; - st->task.flags = 0; - st->loaded = 0; st->fd = -1; - st->buf[0] = '\0'; sprintf(st->task.status, "status task"); } @@ -1732,7 +1739,7 @@ int main(int argc, char *argv[]) register_task(&cmd_task->task); register_task(&stat_task->task); register_task(audiod_task); - s.default_timeout.tv_sec = 0; + s.default_timeout.tv_sec = 3; s.default_timeout.tv_usec = 99 * 1000; ret = sched(&s);