[libvirt] [PATCHv4 04/17] conf: use VIR_(APPEND|DELETE)_ELEMENT for domain device lists

Laine Stump laine at laine.org
Mon Dec 10 21:20:25 UTC 2012


The convenience macros replace manual alloc/movement except in cases
where the list has been pre-allocated to the necessary size, *and* a new
item is just being appended - in that case it's just as concise (and
arguably easier to interpret) to leave it as is - a simple direct
assignment ("list[count++] = item").

Note that when the pointer being appended to the array will continue
to be used by its original name after the append is done, we must use
VIR_APPEND_ELEMENT_COPY, so that the original pointer isn't
cleared. This was only necessary in one case (virDomainNetInsert(),
since the same pointer may also be sent to virDomainHostdevInsert())
---
 src/conf/domain_conf.c | 105 +++++++------------------------------------------
 1 file changed, 14 insertions(+), 91 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 6aa5f79..321d6dd 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7840,9 +7840,8 @@ virDomainChrTargetTypeToString(int deviceType,
 int
 virDomainHostdevInsert(virDomainDefPtr def, virDomainHostdevDefPtr hostdev)
 {
-    if (VIR_REALLOC_N(def->hostdevs, def->nhostdevs + 1) < 0)
+    if (VIR_APPEND_ELEMENT(def->hostdevs, def->nhostdevs, hostdev) < 0)
         return -1;
-    def->hostdevs[def->nhostdevs++]  = hostdev;
     return 0;
 }
 
@@ -7851,19 +7850,7 @@ virDomainHostdevRemove(virDomainDefPtr def, size_t i)
 {
     virDomainHostdevDefPtr hostdev = def->hostdevs[i];
 
-    if (def->nhostdevs > 1) {
-        memmove(def->hostdevs + i,
-                def->hostdevs + i + 1,
-                sizeof(*def->hostdevs) *
-                (def->nhostdevs - (i + 1)));
-        def->nhostdevs--;
-        if (VIR_REALLOC_N(def->hostdevs, def->nhostdevs) < 0) {
-            /* ignore, harmless */
-        }
-    } else {
-        VIR_FREE(def->hostdevs);
-        def->nhostdevs = 0;
-    }
+    VIR_DELETE_ELEMENT(def->hostdevs, i, def->nhostdevs);
     return hostdev;
 }
 
@@ -8018,13 +8005,8 @@ void virDomainDiskInsertPreAlloced(virDomainDefPtr def,
     if (insertAt == -1)
         insertAt = def->ndisks;
 
-    if (insertAt < def->ndisks)
-        memmove(def->disks + insertAt + 1,
-                def->disks + insertAt,
-                (sizeof(def->disks[0]) * (def->ndisks-insertAt)));
-
-    def->disks[insertAt] = disk;
-    def->ndisks++;
+    ignore_value(VIR_INSERT_ELEMENT_INPLACE(def->disks, insertAt,
+                                            def->ndisks, disk));
 }
 
 
@@ -8033,19 +8015,7 @@ virDomainDiskRemove(virDomainDefPtr def, size_t i)
 {
     virDomainDiskDefPtr disk = def->disks[i];
 
-    if (def->ndisks > 1) {
-        memmove(def->disks + i,
-                def->disks + i + 1,
-                sizeof(*def->disks) *
-                (def->ndisks - (i + 1)));
-        def->ndisks--;
-        if (VIR_REALLOC_N(def->disks, def->ndisks) < 0) {
-            /* ignore, harmless */
-        }
-    } else {
-        VIR_FREE(def->disks);
-        def->ndisks = 0;
-    }
+    VIR_DELETE_ELEMENT(def->disks, i, def->ndisks);
     return disk;
 }
 
@@ -8072,10 +8042,8 @@ virDomainHasDiskMirror(virDomainObjPtr vm)
 
 int virDomainNetInsert(virDomainDefPtr def, virDomainNetDefPtr net)
 {
-    if (VIR_REALLOC_N(def->nets, def->nnets + 1) < 0)
+    if (VIR_APPEND_ELEMENT_COPY(def->nets, def->nnets, net) < 0)
         return -1;
-    def->nets[def->nnets]  = net;
-    def->nnets++;
     if (net->type == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
         /* hostdev net devices must also exist in the hostdevs array */
         return virDomainHostdevInsert(def, &net->data.hostdev.def);
@@ -8148,18 +8116,7 @@ virDomainNetRemove(virDomainDefPtr def, size_t i)
             }
         }
     }
-    if (def->nnets > 1) {
-        memmove(def->nets + i,
-                def->nets + i + 1,
-                sizeof(*def->nets) * (def->nnets - (i + 1)));
-        def->nnets--;
-        if (VIR_REALLOC_N(def->nets, def->nnets) < 0) {
-            /* ignore harmless */
-        }
-    } else {
-        VIR_FREE(def->nets);
-        def->nnets = 0;
-    }
+    VIR_DELETE_ELEMENT(def->nets, i, def->nnets);
     return net;
 }
 
@@ -8206,13 +8163,8 @@ void virDomainControllerInsertPreAlloced(virDomainDefPtr def,
     if (insertAt == -1)
         insertAt = def->ncontrollers;
 
-    if (insertAt < def->ncontrollers)
-        memmove(def->controllers + insertAt + 1,
-                def->controllers + insertAt,
-                (sizeof(def->controllers[0]) * (def->ncontrollers-insertAt)));
-
-    def->controllers[insertAt] = controller;
-    def->ncontrollers++;
+    ignore_value(VIR_INSERT_ELEMENT_INPLACE(def->controllers, insertAt,
+                                            def->ncontrollers, controller));
 }
 
 int
@@ -8236,20 +8188,7 @@ virDomainControllerRemove(virDomainDefPtr def, size_t i)
 {
     virDomainControllerDefPtr controller = def->controllers[i];
 
-    if (def->ncontrollers > 1) {
-        memmove(def->controllers + i,
-                def->controllers + i + 1,
-                sizeof(*def->controllers) *
-                (def->ncontrollers - (i + 1)));
-        def->ncontrollers--;
-        if (VIR_REALLOC_N(def->controllers, def->ncontrollers) < 0) {
-            /* ignore, harmless */
-        }
-    } else {
-        VIR_FREE(def->controllers);
-        def->ncontrollers = 0;
-    }
-
+    VIR_DELETE_ELEMENT(def->controllers, i, def->ncontrollers);
     return controller;
 }
 
@@ -8311,16 +8250,7 @@ virDomainLeaseRemoveAt(virDomainDefPtr def, size_t i)
 
     virDomainLeaseDefPtr lease = def->leases[i];
 
-    if (def->nleases > 1) {
-        memmove(def->leases + i,
-                def->leases + i + 1,
-                sizeof(*def->leases) *
-                (def->nleases - (i + 1)));
-        VIR_SHRINK_N(def->leases, def->nleases, 1);
-    } else {
-        VIR_FREE(def->leases);
-        def->nleases = 0;
-    }
+    VIR_DELETE_ELEMENT(def->leases, i, def->nleases);
     return lease;
 }
 
@@ -8607,15 +8537,11 @@ static int virDomainDefMaybeAddController(virDomainDefPtr def,
         cont->opts.vioserial.vectors = -1;
     }
 
-
-    if (VIR_REALLOC_N(def->controllers, def->ncontrollers+1) < 0) {
+    if (VIR_APPEND_ELEMENT(def->controllers, def->ncontrollers, cont) < 0) {
         VIR_FREE(cont);
         virReportOOMError();
         return -1;
     }
-    def->controllers[def->ncontrollers] = cont;
-    def->ncontrollers++;
-
     return 0;
 }
 
@@ -9923,12 +9849,10 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
             input->bus = VIR_DOMAIN_INPUT_BUS_XEN;
         }
 
-        if (VIR_REALLOC_N(def->inputs, def->ninputs + 1) < 0) {
+        if (VIR_APPEND_ELEMENT(def->inputs, def->ninputs, input) < 0) {
             virDomainInputDefFree(input);
             goto no_memory;
         }
-        def->inputs[def->ninputs] = input;
-        def->ninputs++;
     }
 
 
@@ -9980,11 +9904,10 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
         }
         video->vram = virDomainVideoDefaultRAM(def, video->type);
         video->heads = 1;
-        if (VIR_ALLOC_N(def->videos, 1) < 0) {
+        if (VIR_APPEND_ELEMENT(def->videos, def->nvideos, video) < 0) {
             virDomainVideoDefFree(video);
             goto no_memory;
         }
-        def->videos[def->nvideos++] = video;
     }
 
     /* analysis of the host devices */
-- 
1.7.11.7




More information about the libvir-list mailing list