nodedev: add internal virNodeDeviceObjListFind()

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>
This commit is contained in:
Jonathon Jongsma 2021-07-15 17:07:32 -05:00
parent 1280a631ef
commit fdfe4b2837
3 changed files with 54 additions and 11 deletions

View 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);
}

View 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);

View File

@ -1290,6 +1290,7 @@ virNodeDeviceObjIsActive;
virNodeDeviceObjIsPersistent;
virNodeDeviceObjListAssignDef;
virNodeDeviceObjListExport;
virNodeDeviceObjListFind;
virNodeDeviceObjListFindByName;
virNodeDeviceObjListFindBySysfsPath;
virNodeDeviceObjListFindMediatedDeviceByUUID;