From: Timo Sirainen Date: Mon, 15 Mar 2021 13:42:56 +0000 (+0200) Subject: lib: cpu_limit_get_usage_[m]secs() - Add type parameter X-Git-Tag: 2.3.15~218 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=337e29dee546dbecc9cbb44de8a679e34ba6feec;p=thirdparty%2Fdovecot%2Fcore.git lib: cpu_limit_get_usage_[m]secs() - Add type parameter It can now return user CPU, system CPU or both usages. --- diff --git a/src/lib/cpu-limit.c b/src/lib/cpu-limit.c index 1b1ea7e521..76d01b7018 100644 --- a/src/lib/cpu-limit.c +++ b/src/lib/cpu-limit.c @@ -111,20 +111,26 @@ cpu_limit_init(unsigned int cpu_limit_sec, return climit; } -unsigned int cpu_limit_get_usage_msecs(struct cpu_limit *climit) +unsigned int +cpu_limit_get_usage_msecs(struct cpu_limit *climit, enum cpu_limit_type type) { struct rusage rusage; - struct timeval cpu_usage; + struct timeval cpu_usage = { 0, 0 }; int usage_diff; /* Query cpu usage so far */ if (getrusage(RUSAGE_SELF, &rusage) < 0) i_fatal("getrusage() failed: %m"); - cpu_usage = rusage.ru_utime; - timeval_add(&cpu_usage, &rusage.ru_stime); - - struct timeval initial_total = climit->initial_usage.ru_utime; - timeval_add(&initial_total, &climit->initial_usage.ru_stime); + if ((type & CPU_LIMIT_TYPE_USER) != 0) + timeval_add(&cpu_usage, &rusage.ru_utime); + if ((type & CPU_LIMIT_TYPE_SYSTEM) != 0) + timeval_add(&cpu_usage, &rusage.ru_stime); + + struct timeval initial_total = { 0, 0 }; + if ((type & CPU_LIMIT_TYPE_USER) != 0) + timeval_add(&initial_total, &climit->initial_usage.ru_utime); + if ((type & CPU_LIMIT_TYPE_SYSTEM) != 0) + timeval_add(&initial_total, &climit->initial_usage.ru_stime); usage_diff = timeval_diff_msecs(&cpu_usage, &initial_total); i_assert(usage_diff >= 0); diff --git a/src/lib/cpu-limit.h b/src/lib/cpu-limit.h index 27fb016e60..8b2b3a8d5a 100644 --- a/src/lib/cpu-limit.h +++ b/src/lib/cpu-limit.h @@ -3,6 +3,12 @@ struct cpu_limit; +enum cpu_limit_type { + CPU_LIMIT_TYPE_USER = BIT(0), + CPU_LIMIT_TYPE_SYSTEM = BIT(1), +}; +#define CPU_LIMIT_TYPE_ALL (CPU_LIMIT_TYPE_USER | CPU_LIMIT_TYPE_SYSTEM) + typedef void cpu_limit_callback_t(void *context); /* Call the callback when the CPU time limit is exceeded. The callback is called @@ -26,11 +32,13 @@ cpu_limit_init(unsigned int cpu_limit_sec, (cpu_limit_callback_t *)callback, context) void cpu_limit_deinit(struct cpu_limit **_climit); -unsigned int cpu_limit_get_usage_msecs(struct cpu_limit *climit); +unsigned int cpu_limit_get_usage_msecs(struct cpu_limit *climit, + enum cpu_limit_type type); -static inline unsigned int cpu_limit_get_usage_secs(struct cpu_limit *climit) +static inline unsigned int +cpu_limit_get_usage_secs(struct cpu_limit *climit, enum cpu_limit_type type) { - return cpu_limit_get_usage_msecs(climit) / 1000; + return cpu_limit_get_usage_msecs(climit, type) / 1000; } #endif