server: Lookup user only once.
[paraslash.git] / audiod.c
index 91f6e1e6a474f165870bb4bbe615dccad4fcffbf..5ef5778107e22dd44e44402f2961cc0f6192a594 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -1031,19 +1031,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 +1082,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 */
@@ -1228,14 +1244,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)