]> xenbits.xensource.com Git - libvirt.git/commitdiff
virCPUDefCheckFeatures: Don't use 'virStringListAdd' to construct list
authorPeter Krempa <pkrempa@redhat.com>
Fri, 5 Feb 2021 14:13:28 +0000 (15:13 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 11 Feb 2021 16:05:32 +0000 (17:05 +0100)
We already know the upper bound of items we might need so we can
allocate the array upfront and avoid the quadratic complexity of
'virStringListAdd'.

In this instance the returned data is kept only temporarily so a
potential unused space due to filtered-out entries doesn't impose a
long-term burden on memory.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/cpu_conf.c

index eb4bfbbcfa1e97c784a98fadd414afdb3aa3eaed..8d800bd80dcd1f3160e19868b15cb66bb6b92a85 100644 (file)
@@ -990,21 +990,21 @@ virCPUDefCheckFeatures(virCPUDefPtr cpu,
                        void *opaque,
                        char ***features)
 {
-    g_auto(GStrv) list = NULL;
     size_t n = 0;
     size_t i;
 
     *features = NULL;
 
+    if (cpu->nfeatures == 0)
+        return 0;
+
+    *features = g_new0(char *, cpu->nfeatures + 1);
+
     for (i = 0; i < cpu->nfeatures; i++) {
-        if (filter(cpu->features[i].name, cpu->features[i].policy, opaque)) {
-            if (virStringListAdd(&list, cpu->features[i].name) < 0)
-                return -1;
-            n++;
-        }
+        if (filter(cpu->features[i].name, cpu->features[i].policy, opaque))
+            (*features)[n++] = g_strdup(cpu->features[i].name);
     }
 
-    *features = g_steal_pointer(&list);
     return n;
 }