]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: cpu_limit_get_usage_[m]secs() - Add type parameter
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 15 Mar 2021 13:42:56 +0000 (15:42 +0200)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Tue, 16 Mar 2021 10:04:53 +0000 (10:04 +0000)
It can now return user CPU, system CPU or both usages.

src/lib/cpu-limit.c
src/lib/cpu-limit.h

index 1b1ea7e521dde97ff6c9769355c32fa234b53f31..76d01b70183ed62601a9e70bce42f1d383f7458a 100644 (file)
@@ -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);
 
index 27fb016e6099a16f1a939ac02ea02ab8f56e9976..8b2b3a8d5a333bb247041969e2ec121e5871d540 100644 (file)
@@ -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