X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=f12dbc1b999a0892abdcea5791692f1f5dfab3c3;hp=2367d9cb443ecc1d0f52f64e31f76a731b13c8b4;hb=1cccf6fa93c251f8f2805aa5fb163741d851c051;hpb=70677862e5548461918ce42af206cdca61dc250f diff --git a/audiod.c b/audiod.c index 2367d9cb..f12dbc1b 100644 --- a/audiod.c +++ b/audiod.c @@ -5,8 +5,14 @@ */ /** \file audiod.c The paraslash's audio daemon. */ + +#include +#include #include #include +#include +#include +#include #include #include "para.h" @@ -1007,7 +1013,7 @@ static int signal_post_select(struct sched *s, __a_unused struct task *t) case SIGINT: case SIGTERM: case SIGHUP: - PARA_EMERG_LOG("terminating on signal %d\n", signum); + PARA_NOTICE_LOG("received signal %d\n", signum); clean_exit(EXIT_FAILURE, "caught deadly signal"); } return 0; @@ -1031,19 +1037,35 @@ static int command_post_select(struct sched *s, struct task *t) int ret; struct command_task *ct = container_of(t, struct command_task, task); static struct timeval last_status_dump; - struct timeval tmp, delay = {0, 500 * 1000}; - - tv_add(&last_status_dump, &delay, &tmp); - if (tv_diff(&tmp, now, NULL) < 0) { - audiod_status_dump(); - last_status_dump = *now; - } + struct timeval tmp, delay; + bool force = true; ret = handle_connect(ct->fd, &s->rfds); if (ret < 0) PARA_ERROR_LOG("%s\n", para_strerror(-ret)); - audiod_status_dump(); - return 0; + else if (ret > 0) + goto dump; + + /* if last status dump was less than 500ms ago, do nothing */ + delay.tv_sec = 0; + delay.tv_usec = 500 * 1000; + tv_add(&last_status_dump, &delay, &tmp); + if (tv_diff(now, &tmp, NULL) < 0) + return 0; + + /* + * If last status dump was more than 5s ago, force update. Otherwise, + * update only those items that have changed. + */ + delay.tv_sec = 5; + delay.tv_usec = 0; + tv_add(&last_status_dump, &delay, &tmp); + if (tv_diff(now, &tmp, NULL) < 0) + force = false; +dump: + audiod_status_dump(force); + last_status_dump = *now; + return 1; } static void init_command_task(struct command_task *ct) @@ -1066,7 +1088,7 @@ static void close_stat_pipe(void) stat_task->offset_seconds = 0; stat_task->vss_status = 0; stat_task->current_audio_format_num = -1; - audiod_status_dump(); + audiod_status_dump(true); } /* avoid busy loop if server is down */ @@ -1136,13 +1158,14 @@ void __noreturn clean_exit(int status, const char *msg) { int i; - PARA_EMERG_LOG("%s\n", msg); if (socket_name) unlink(socket_name); close_stat_pipe(); FOR_EACH_SLOT(i) close_slot(i); audiod_cmdline_parser_free(&conf); + close_stat_clients(); + PARA_EMERG_LOG("%s\n", msg); exit(status); } @@ -1227,14 +1250,15 @@ static int status_post_select(struct sched *s, struct task *t) char *buf; size_t sz; int ret; - if (st->ct->task.error < 0) { + + ret = btr_node_status(st->btrn, st->min_iqs, BTR_NT_LEAF); + if (ret < 0) { close_stat_pipe(); goto out; } if (st->ct->status != CL_EXECUTING) goto out; - ret = btr_node_status(st->btrn, st->min_iqs, BTR_NT_LEAF); - if (ret <= 0) { + if (ret == 0) { struct timeval diff; tv_diff(now, &st->last_status_read, &diff); if (diff.tv_sec > 61)