audiod: Don't compute stat info unnecessarily.
authorAndre Noll <maan@systemlinux.org>
Mon, 9 Sep 2013 21:20:31 +0000 (21:20 +0000)
committerAndre Noll <maan@systemlinux.org>
Sun, 22 Sep 2013 00:29:19 +0000 (02:29 +0200)
Currently we compute this information in each scheduler iteration
and check whether it has changed since the last time we sent it to
the stat clients.

This is quite expensive, so this patch teaches para_audiod to only look
at the status items if the last write time was more than 500ms ago.

audiod.c

index 9ed319f..5ef5778 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -1031,22 +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 = {5, 0};
-       bool force = false;
-
-       tv_add(&last_status_dump, &delay, &tmp);
-       if (tv_diff(&tmp, now, NULL) < 0) {
-               last_status_dump = *now;
-               force = true;
-       }
+       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));
        else if (ret > 0)
-               force = true;
+               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);
-       return 0;
+       last_status_dump = *now;
+       return 1;
 }
 
 static void init_command_task(struct command_task *ct)