]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: optimize link_node_enumerator() a bit
authorLennart Poettering <lennart@poettering.net>
Tue, 19 Jan 2016 17:35:32 +0000 (18:35 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 19 Jan 2016 20:56:54 +0000 (21:56 +0100)
strv_consume() is pretty expensive when invoked piecemeal, hence optimize it a bit by pre-allocating a properly sized
array.

src/network/networkd-link-bus.c

index d09a3c2d07d1e38a85f6f6acde59143dfcb0ecfd..8a32aea905c3e8f70bc06c150770d8830361e475 100644 (file)
@@ -59,15 +59,19 @@ static char *link_bus_path(Link *link) {
 int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
         _cleanup_strv_free_ char **l = NULL;
         Manager *m = userdata;
+        unsigned c = 0;
         Link *link;
         Iterator i;
-        int r;
 
         assert(bus);
         assert(path);
         assert(m);
         assert(nodes);
 
+        l = new0(char*, hashmap_size(m->links) + 1);
+        if (!l)
+                return -ENOMEM;
+
         HASHMAP_FOREACH(link, m->links, i) {
                 char *p;
 
@@ -75,11 +79,10 @@ int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***
                 if (!p)
                         return -ENOMEM;
 
-                r = strv_consume(&l, p);
-                if (r < 0)
-                        return r;
+                l[c++] = p;
         }
 
+        l[c] = NULL;
         *nodes = l;
         l = NULL;