]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared/cpu-set-util: move the part to print cpu-set into a separate function
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sun, 19 May 2019 16:02:38 +0000 (18:02 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 21 May 2019 06:44:03 +0000 (08:44 +0200)
Also avoid unnecessary asprintf() when we can write to the output area
directly.

src/core/dbus-execute.c
src/shared/cpu-set-util.c
src/shared/cpu-set-util.h
src/test/test-cpu-set-util.c

index 8e83c6390eb7664da85b09b5874ab944f582ef91..5a56aad5927933318016606f8233cb756dc6ea21 100644 (file)
@@ -1571,32 +1571,13 @@ int bus_exec_context_set_transient_property(
                                 unit_write_settingf(u, flags, name, "%s=", name);
                         } else {
                                 _cleanup_free_ char *str = NULL;
-                                size_t allocated = 0, len = 0, i, ncpus;
+                                size_t ncpus;
 
-                                ncpus = CPU_SIZE_TO_NUM(n);
-
-                                for (i = 0; i < ncpus; i++) {
-                                        _cleanup_free_ char *p = NULL;
-                                        size_t add;
-
-                                        if (!CPU_ISSET_S(i, n, (cpu_set_t*) a))
-                                                continue;
-
-                                        r = asprintf(&p, "%zu", i);
-                                        if (r < 0)
-                                                return -ENOMEM;
-
-                                        add = strlen(p);
-
-                                        if (!GREEDY_REALLOC(str, allocated, len + add + 2))
-                                                return -ENOMEM;
-
-                                        strcpy(mempcpy(str + len, p, add), " ");
-                                        len += add + 1;
-                                }
+                                str = cpu_set_to_string(a, n);
+                                if (!str)
+                                        return -ENOMEM;
 
-                                if (len != 0)
-                                        str[len - 1] = '\0';
+                                ncpus = CPU_SIZE_TO_NUM(n);
 
                                 if (!c->cpuset || c->cpuset_ncpus < ncpus) {
                                         cpu_set_t *cpuset;
index 9a789ae7565b51e0e5c2afd0268b610ea4273494..aa5c4d110d24b93c710f729e8ad9d6c7097b1095 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <errno.h>
 #include <stddef.h>
+#include <stdio.h>
 #include <syslog.h>
 
 #include "alloc-util.h"
 #include "parse-util.h"
 #include "string-util.h"
 
+char* cpu_set_to_string(const cpu_set_t *set, size_t setsize) {
+        _cleanup_free_ char *str = NULL;
+        size_t allocated = 0, len = 0;
+        int i, r;
+
+        for (i = 0; (size_t) i < setsize * 8; i++) {
+                if (!CPU_ISSET_S(i, setsize, set))
+                        continue;
+
+                if (!GREEDY_REALLOC(str, allocated, len + 1 + DECIMAL_STR_MAX(int)))
+                        return NULL;
+
+                r = sprintf(str + len, len > 0 ? " %d" : "%d", i);
+                assert_se(r > 0);
+                len += r;
+        }
+
+        return TAKE_PTR(str) ?: strdup("");
+}
+
 cpu_set_t* cpu_set_malloc(unsigned *ncpus) {
         cpu_set_t *c;
         unsigned n = 1024;
index 1b6bd35b1cbeed62ddeab754da601b71fce7fd3e..fea8ac83626a43bdccbe9f5906800ce663604f3c 100644 (file)
@@ -22,6 +22,7 @@ static inline cpu_set_t* cpu_set_mfree(cpu_set_t *p) {
 
 cpu_set_t* cpu_set_malloc(unsigned *ncpus);
 
+char* cpu_set_to_string(const cpu_set_t *set, size_t setsize);
 int parse_cpu_set_internal(const char *rvalue, cpu_set_t **cpu_set, bool warn, const char *unit, const char *filename, unsigned line, const char *lvalue);
 
 static inline int parse_cpu_set_and_warn(const char *rvalue, cpu_set_t **cpu_set, const char *unit, const char *filename, unsigned line, const char *lvalue) {
index c9272459b44a195002448452c80db424d1a74074..ff5edb2a692e0e96672957f2be96cb2f0a3e71bd 100644 (file)
@@ -6,6 +6,7 @@
 
 static void test_parse_cpu_set(void) {
         cpu_set_t *c = NULL;
+        _cleanup_free_ char *str = NULL;
         int ncpus;
         int cpu;
 
@@ -15,6 +16,10 @@ static void test_parse_cpu_set(void) {
         assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus), c));
         assert_se(CPU_ISSET_S(2, CPU_ALLOC_SIZE(ncpus), c));
         assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 2);
+
+        assert_se(str = cpu_set_to_string(c, CPU_ALLOC_SIZE(ncpus)));
+        log_info("cpu_set_to_string: %s", str);
+        str = mfree(str);
         c = cpu_set_mfree(c);
 
         /* A more interesting range */
@@ -25,6 +30,9 @@ static void test_parse_cpu_set(void) {
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
         for (cpu = 8; cpu < 12; cpu++)
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
+        assert_se(str = cpu_set_to_string(c, CPU_ALLOC_SIZE(ncpus)));
+        log_info("cpu_set_to_string: %s", str);
+        str = mfree(str);
         c = cpu_set_mfree(c);
 
         /* Quoted strings */
@@ -33,6 +41,9 @@ static void test_parse_cpu_set(void) {
         assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 4);
         for (cpu = 8; cpu < 12; cpu++)
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
+        assert_se(str = cpu_set_to_string(c, CPU_ALLOC_SIZE(ncpus)));
+        log_info("cpu_set_to_string: %s", str);
+        str = mfree(str);
         c = cpu_set_mfree(c);
 
         /* Use commas as separators */
@@ -43,6 +54,9 @@ static void test_parse_cpu_set(void) {
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
         for (cpu = 8; cpu < 12; cpu++)
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
+        assert_se(str = cpu_set_to_string(c, CPU_ALLOC_SIZE(ncpus)));
+        log_info("cpu_set_to_string: %s", str);
+        str = mfree(str);
         c = cpu_set_mfree(c);
 
         /* Commas with spaces (and trailing comma, space) */
@@ -51,6 +65,9 @@ static void test_parse_cpu_set(void) {
         assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
         for (cpu = 0; cpu < 8; cpu++)
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
+        assert_se(str = cpu_set_to_string(c, CPU_ALLOC_SIZE(ncpus)));
+        log_info("cpu_set_to_string: %s", str);
+        str = mfree(str);
         c = cpu_set_mfree(c);
 
         /* Ranges */
@@ -61,6 +78,9 @@ static void test_parse_cpu_set(void) {
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
         for (cpu = 8; cpu < 12; cpu++)
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
+        assert_se(str = cpu_set_to_string(c, CPU_ALLOC_SIZE(ncpus)));
+        log_info("cpu_set_to_string: %s", str);
+        str = mfree(str);
         c = cpu_set_mfree(c);
 
         /* Ranges with trailing comma, space */
@@ -71,6 +91,9 @@ static void test_parse_cpu_set(void) {
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
         for (cpu = 8; cpu < 12; cpu++)
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
+        assert_se(str = cpu_set_to_string(c, CPU_ALLOC_SIZE(ncpus)));
+        log_info("cpu_set_to_string: %s", str);
+        str = mfree(str);
         c = cpu_set_mfree(c);
 
         /* Negative range (returns empty cpu_set) */
@@ -85,6 +108,9 @@ static void test_parse_cpu_set(void) {
         assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 12);
         for (cpu = 0; cpu < 12; cpu++)
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
+        assert_se(str = cpu_set_to_string(c, CPU_ALLOC_SIZE(ncpus)));
+        log_info("cpu_set_to_string: %s", str);
+        str = mfree(str);
         c = cpu_set_mfree(c);
 
         /* Mix ranges and individual CPUs */
@@ -95,6 +121,9 @@ static void test_parse_cpu_set(void) {
         assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus), c));
         for (cpu = 4; cpu < 12; cpu++)
                 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
+        assert_se(str = cpu_set_to_string(c, CPU_ALLOC_SIZE(ncpus)));
+        log_info("cpu_set_to_string: %s", str);
+        str = mfree(str);
         c = cpu_set_mfree(c);
 
         /* Garbage */