]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
nodedev: add internal virNodeDeviceObjListFind()
authorJonathon Jongsma <jjongsma@redhat.com>
Thu, 15 Jul 2021 22:07:32 +0000 (17:07 -0500)
committerJonathon Jongsma <jjongsma@redhat.com>
Fri, 6 Aug 2021 20:01:52 +0000 (15:01 -0500)
This is a generic function that you can provide your own predicate
function to search for a particular device. It will be used in an
upcoming commit.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/virnodedeviceobj.c
src/conf/virnodedeviceobj.h
src/libvirt_private.syms

index e8f6792138b2a0ed83f40ce8333e792947189132..6cf4d8b15aaa680ed4db91bcf62bc441f3805edc 100644 (file)
@@ -1023,9 +1023,9 @@ virNodeDeviceObjSetPersistent(virNodeDeviceObj *obj,
 }
 
 
-struct virNodeDeviceObjListRemoveHelperData
-{
-    virNodeDeviceObjListRemoveIterator callback;
+typedef struct _PredicateHelperData PredicateHelperData;
+struct _PredicateHelperData {
+    virNodeDeviceObjListPredicate predicate;
     void *opaque;
 };
 
@@ -1033,9 +1033,9 @@ static int virNodeDeviceObjListRemoveHelper(void *key G_GNUC_UNUSED,
                                             void *value,
                                             void *opaque)
 {
-    struct virNodeDeviceObjListRemoveHelperData *data = opaque;
+    PredicateHelperData *data = opaque;
 
-    return data->callback(value, data->opaque);
+    return data->predicate(value, data->opaque);
 }
 
 
@@ -1051,11 +1051,11 @@ static int virNodeDeviceObjListRemoveHelper(void *key G_GNUC_UNUSED,
  */
 void
 virNodeDeviceObjListForEachRemove(virNodeDeviceObjList *devs,
-                                  virNodeDeviceObjListRemoveIterator callback,
+                                  virNodeDeviceObjListPredicate callback,
                                   void *opaque)
 {
-    struct virNodeDeviceObjListRemoveHelperData data = {
-        .callback = callback,
+    PredicateHelperData data = {
+        .predicate = callback,
         .opaque = opaque
     };
 
@@ -1065,3 +1065,40 @@ virNodeDeviceObjListForEachRemove(virNodeDeviceObjList *devs,
                                 &data);
     virObjectRWUnlock(devs);
 }
+
+
+static int virNodeDeviceObjListFindHelper(const void *payload,
+                                          const char *name G_GNUC_UNUSED,
+                                          const void *opaque)
+{
+    PredicateHelperData *data = (PredicateHelperData *) opaque;
+    virNodeDeviceObj *obj = (virNodeDeviceObj *) payload;
+
+    return data->predicate(obj, data->opaque);
+}
+
+
+/**
+ * virNodeDeviceObjListFind
+ * @devs: Pointer to object list
+ * @predicate: function to test the device for a certain property
+ * @opaque: Opaque data to use as argument to helper
+ *
+ * For each object in @devs, call the @predicate helper using @opaque as
+ * an argument until it returns TRUE. The list may not be modified while
+ * iterating.
+ */
+virNodeDeviceObj *
+virNodeDeviceObjListFind(virNodeDeviceObjList *devs,
+                         virNodeDeviceObjListPredicate predicate,
+                         void *opaque)
+{
+    PredicateHelperData data = {
+        .predicate = predicate,
+        .opaque = opaque
+    };
+
+    return virNodeDeviceObjListSearch(devs,
+                                      virNodeDeviceObjListFindHelper,
+                                      &data);
+}
index 7353e4619b60cf051f996a1deabbb56bd70675bd..0cb78748a442c00fae340a4981b6a3b42db52f59 100644 (file)
@@ -136,9 +136,14 @@ void
 virNodeDeviceObjSetPersistent(virNodeDeviceObj *obj,
                               bool persistent);
 
-typedef bool (*virNodeDeviceObjListRemoveIterator)(virNodeDeviceObj *obj,
-                                                   const void *opaque);
+typedef bool (*virNodeDeviceObjListPredicate)(virNodeDeviceObj *obj,
+                                              const void *opaque);
 
 void virNodeDeviceObjListForEachRemove(virNodeDeviceObjList *devs,
-                                       virNodeDeviceObjListRemoveIterator callback,
+                                       virNodeDeviceObjListPredicate callback,
                                        void *opaque);
+
+virNodeDeviceObj *
+virNodeDeviceObjListFind(virNodeDeviceObjList *devs,
+                         virNodeDeviceObjListPredicate callback,
+                         void *opaque);
index e4168a06b962ff10f866b9ad868911f1d7d65820..6fc8239d2e629d226403cab5c449aed5b6080cc5 100644 (file)
@@ -1290,6 +1290,7 @@ virNodeDeviceObjIsActive;
 virNodeDeviceObjIsPersistent;
 virNodeDeviceObjListAssignDef;
 virNodeDeviceObjListExport;
+virNodeDeviceObjListFind;
 virNodeDeviceObjListFindByName;
 virNodeDeviceObjListFindBySysfsPath;
 virNodeDeviceObjListFindMediatedDeviceByUUID;