[PATCH v1 13/31] network_conf: Introduce virNetworkObjListForEach

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
---
 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

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]