[libvirt] [PATCH v2 28/35] util: numa: use VIR_AUTOPTR for aggregate types

Sukrit Bhatnagar skrtbhtngr at gmail.com
Sun Aug 5 20:43:55 UTC 2018


By making use of GNU C's cleanup attribute handled by the
VIR_AUTOPTR macro for declaring aggregate pointer variables,
majority of the calls to *Free functions can be dropped, which
in turn leads to getting rid of most of our cleanup sections.

Signed-off-by: Sukrit Bhatnagar <skrtbhtngr at gmail.com>
---
 src/util/virnuma.c | 28 +++++++++-------------------
 1 file changed, 9 insertions(+), 19 deletions(-)

diff --git a/src/util/virnuma.c b/src/util/virnuma.c
index 6c6be1c..c1457be 100644
--- a/src/util/virnuma.c
+++ b/src/util/virnuma.c
@@ -57,8 +57,8 @@ char *
 virNumaGetAutoPlacementAdvice(unsigned short vcpus,
                               unsigned long long balloon)
 {
-    virCommandPtr cmd = NULL;
     char *output = NULL;
+    VIR_AUTOPTR(virCommand) cmd = NULL;
 
     cmd = virCommandNewArgList(NUMAD, "-w", NULL);
     virCommandAddArgFormat(cmd, "%d:%llu", vcpus,
@@ -71,7 +71,6 @@ virNumaGetAutoPlacementAdvice(unsigned short vcpus,
                        _("Failed to query numad for the "
                          "advisory nodeset"));
 
-    virCommandFree(cmd);
     return output;
 }
 #else /* !HAVE_NUMAD */
@@ -252,41 +251,38 @@ int
 virNumaGetNodeCPUs(int node,
                    virBitmapPtr *cpus)
 {
+    VIR_AUTOPTR(virBitmap) cpumap = NULL;
     VIR_AUTOFREE(unsigned long *) mask = NULL;
     VIR_AUTOFREE(unsigned long *) allonesmask = NULL;
-    virBitmapPtr cpumap = NULL;
     int ncpus = 0;
     int max_n_cpus = virNumaGetMaxCPUs();
     int mask_n_bytes = max_n_cpus / 8;
     size_t i;
-    int ret = -1;
 
     *cpus = NULL;
 
     if (VIR_ALLOC_N(mask, mask_n_bytes / sizeof(*mask)) < 0)
-        goto cleanup;
+        return -1;
 
     if (VIR_ALLOC_N(allonesmask, mask_n_bytes / sizeof(*mask)) < 0)
-        goto cleanup;
+        return -1;
 
     memset(allonesmask, 0xff, mask_n_bytes);
 
     /* The first time this returns -1, ENOENT if node doesn't exist... */
     if (numa_node_to_cpus(node, mask, mask_n_bytes) < 0) {
         VIR_WARN("NUMA topology for cell %d is not available, ignoring", node);
-        ret = -2;
-        goto cleanup;
+        return -2;
     }
 
     /* second, third... times it returns an all-1's mask */
     if (memcmp(mask, allonesmask, mask_n_bytes) == 0) {
         VIR_DEBUG("NUMA topology for cell %d is invalid, ignoring", node);
-        ret = -2;
-        goto cleanup;
+        return -2;
     }
 
     if (!(cpumap = virBitmapNew(max_n_cpus)))
-        goto cleanup;
+        return -1;
 
     for (i = 0; i < max_n_cpus; i++) {
         if (MASK_CPU_ISSET(mask, i)) {
@@ -295,14 +291,8 @@ virNumaGetNodeCPUs(int node,
         }
     }
 
-    *cpus = cpumap;
-    cpumap = NULL;
-    ret = ncpus;
-
- cleanup:
-    virBitmapFree(cpumap);
-
-    return ret;
+    VIR_STEAL_PTR(*cpus, cpumap);
+    return ncpus;
 }
 # undef MASK_CPU_ISSET
 # undef n_bits
-- 
1.8.3.1




More information about the libvir-list mailing list