From: Andre Noll Date: Mon, 9 Sep 2013 21:20:31 +0000 (+0000) Subject: audiod: Don't compute stat info unnecessarily. X-Git-Tag: v0.5.1~11^2 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=1ff4b2cba04db47b59cc3da23c4245d14d697638;ds=inline 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. --- 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)