From 1ff4b2cba04db47b59cc3da23c4245d14d697638 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Mon, 9 Sep 2013 21:20:31 +0000 Subject: [PATCH] audiod: Don't compute stat info unnecessarily. 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 | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/audiod.c b/audiod.c index 9ed319f4..5ef57781 100644 --- 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) -- 2.39.2