[libvirt] [PATCH v1 13/31] network_conf: Introduce virNetworkObjListForEach

Michal Privoznik mprivozn at redhat.com
Thu Feb 26 14:17:22 UTC 2015


This API will be used in the future to call passed callback over
each network object in the list. It's slightly different to it
virDomainObjListForEach counterpart, because virDomainObjList
uses a hash table to store domain object, while virNetworkObjList
uses an array. Therefore, iterating over the entries is slightly
more complicated, as we want to allow the callback to remove the
network object while still iterating.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/conf/network_conf.c  | 22 ++++++++++++++++++++++
 src/conf/network_conf.h  |  6 ++++++
 src/libvirt_private.syms |  1 +
 3 files changed, 29 insertions(+)

diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index d0e7e1b..bcfcccd 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -4290,3 +4290,25 @@ virNetworkObjListExport(virConnectPtr conn,
     VIR_FREE(tmp_nets);
     return ret;
 }
+
+int
+virNetworkObjListForEach(virNetworkObjListPtr nets,
+                         virNetworkObjListIterator callback,
+                         void *opaque)
+{
+    int ret = 0;
+    size_t i = 0, oldcount;
+
+    /* Deliberately don't use for-loop here. We want to allow
+     * @callback to remove a network object, in which case
+     * nets->count is decremented. */
+    while (i < nets->count) {
+        oldcount = nets->count;
+        if (callback(nets->objs[i], opaque) < 0)
+            ret = -1;
+        if (oldcount == nets->count)
+            i++;
+    }
+
+    return ret;
+}
diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
index 16aea99..b9acc0e 100644
--- a/src/conf/network_conf.h
+++ b/src/conf/network_conf.h
@@ -445,6 +445,12 @@ int virNetworkObjListExport(virConnectPtr conn,
                             virNetworkObjListFilter filter,
                             unsigned int flags);
 
+typedef int (*virNetworkObjListIterator)(virNetworkObjPtr dom,
+                                         void *opaque);
+
+int virNetworkObjListForEach(virNetworkObjListPtr nets,
+                             virNetworkObjListIterator callback,
+                             void *opaque);
 /* for testing */
 int
 virNetworkDefUpdateSection(virNetworkDefPtr def,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index cbba8a9..8577006 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -570,6 +570,7 @@ virNetworkObjFree;
 virNetworkObjGetPersistentDef;
 virNetworkObjIsDuplicate;
 virNetworkObjListExport;
+virNetworkObjListForEach;
 virNetworkObjListFree;
 virNetworkObjLock;
 virNetworkObjReplacePersistentDef;
-- 
2.0.5




More information about the libvir-list mailing list