From: Timo Sirainen Date: Mon, 15 Mar 2021 13:37:55 +0000 (+0200) Subject: lib: cpu-time - Use the original struct rusage as the initial_usage X-Git-Tag: 2.3.15~219 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fde5380485ea19376c2db983aa71ebdc014e00c9;p=thirdparty%2Fdovecot%2Fcore.git lib: cpu-time - Use the original struct rusage as the initial_usage This will allow separation of user and system CPU usage tracking. They could have been tracked with two separate struct timevals, but the extra memory usage is small and it might be nice to have all the available data for debugging. --- diff --git a/src/lib/cpu-limit.c b/src/lib/cpu-limit.c index 4d341d2b69..1b1ea7e521 100644 --- a/src/lib/cpu-limit.c +++ b/src/lib/cpu-limit.c @@ -13,7 +13,7 @@ static struct cpu_limit *volatile cpu_limit = NULL; struct cpu_limit { struct cpu_limit *parent; - struct timeval initial_usage; + struct rusage initial_usage; struct rlimit old_limit, limit; void (*callback)(void *context); @@ -64,13 +64,14 @@ cpu_limit_init(unsigned int cpu_limit_sec, /* Query cpu usage so far */ if (getrusage(RUSAGE_SELF, &rusage) < 0) i_fatal("getrusage() failed: %m"); - climit->initial_usage = rusage.ru_utime; - timeval_add(&climit->initial_usage, &rusage.ru_stime); + climit->initial_usage = rusage; climit->limit = climit->old_limit; /* rlimit is in seconds. Truncate initial_usage to seconds for the initial sanity check. */ - climit->limit.rlim_cur = climit->initial_usage.tv_sec; + struct timeval initial_total = climit->initial_usage.ru_utime; + timeval_add(&initial_total, &climit->initial_usage.ru_stime); + climit->limit.rlim_cur = initial_total.tv_sec; if (climit->limit.rlim_max != RLIM_INFINITY && climit->limit.rlim_cur > climit->limit.rlim_max) { @@ -122,7 +123,9 @@ unsigned int cpu_limit_get_usage_msecs(struct cpu_limit *climit) cpu_usage = rusage.ru_utime; timeval_add(&cpu_usage, &rusage.ru_stime); - usage_diff = timeval_diff_msecs(&cpu_usage, &climit->initial_usage); + struct timeval initial_total = climit->initial_usage.ru_utime; + timeval_add(&initial_total, &climit->initial_usage.ru_stime); + usage_diff = timeval_diff_msecs(&cpu_usage, &initial_total); i_assert(usage_diff >= 0); return (unsigned int)usage_diff;