On Thu, Nov 16, 2017 at 11:58:03AM -0500, John Ferlan wrote:
> Create an API to walk the pools->objs[] list in order to perform a
> callback function for each element of the objs array that doesn't care
> about whether the action succeeds or fails as the desire is to run the
> code over every element in the array rather than fail as soon as or if
> one fails.
>
> Signed-off-by: John Ferlan <jfer...@redhat.com>
> ---
>  src/conf/virstorageobj.c     |  29 +++++++++++
>  src/conf/virstorageobj.h     |   9 ++++
>  src/libvirt_private.syms     |   1 +
>  src/storage/storage_driver.c | 115 
> +++++++++++++++++++++++--------------------
>  4 files changed, 100 insertions(+), 54 deletions(-)
>
> diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c
> index 2ca8453139..3cae34d970 100644
> --- a/src/conf/virstorageobj.c
> +++ b/src/conf/virstorageobj.c
> @@ -230,6 +230,35 @@ virStoragePoolObjListFree(virStoragePoolObjListPtr pools)
>  }
>
>
> +/**
> + * virStoragePoolObjListForEach
> + * @pools: Pointer to pools object
> + * @iter: Callback iteration helper
> + * @opaque: Opaque data to use as argument to helper
> + *
> + * For each object in @pools, call the @iter helper using @opaque as
> + * an argument.  This function doesn't care whether the @iter fails or
> + * not as it's being used for Autostart and UpdateAllState callers
> + * that want to iterate over all the @pools objects not stopping if
> + * one happens to fail.
> + */
> +void
> +virStoragePoolObjListForEach(virStoragePoolObjListPtr pools,
> +                             virStoragePoolObjListIterator iter,
> +                             const void *opaque)
> +{
> +    size_t i;
> +    virStoragePoolObjPtr obj;
> +
> +    for (i = 0; i < pools->count; i++) {
> +        obj = pools->objs[i];
> +        virStoragePoolObjLock(obj);
> +        iter(obj, opaque);
> +        virStoragePoolObjUnlock(obj);
> +    }
> +}
> +
> +
>  void
>  virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
>                          virStoragePoolObjPtr obj)
> diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h
> index a4d7186d12..c84877694e 100644
> --- a/src/conf/virstorageobj.h
> +++ b/src/conf/virstorageobj.h
> @@ -226,6 +226,15 @@ virStoragePoolObjFree(virStoragePoolObjPtr obj);
>  void
>  virStoragePoolObjListFree(virStoragePoolObjListPtr pools);
>
> +typedef void
> +(*virStoragePoolObjListIterator)(virStoragePoolObjPtr obj,
> +                                 const void *opaque);
> +
> +void
> +virStoragePoolObjListForEach(virStoragePoolObjListPtr pools,
> +                             virStoragePoolObjListIterator iter,
> +                             const void *opaque);
> +
>  void
>  virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
>                          virStoragePoolObjPtr obj);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 57ba8f4038..62f423649a 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1089,6 +1089,7 @@ virStoragePoolObjIsActive;
>  virStoragePoolObjIsAutostart;
>  virStoragePoolObjIsDuplicate;
>  virStoragePoolObjListExport;
> +virStoragePoolObjListForEach;
>  virStoragePoolObjListFree;
>  virStoragePoolObjLoadAllConfigs;
>  virStoragePoolObjLoadAllState;
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index 7cc3c518b4..db327a875a 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -157,24 +157,75 @@ storagePoolUpdateState(virStoragePoolObjPtr obj)
>      return;
>  }
>
> +
> +
> +static void
> +storagePoolUpdateAllStateCallback(virStoragePoolObjPtr obj,
> +                                  const void *opaque ATTRIBUTE_UNUSED)
> +{
> +    storagePoolUpdateState(obj);
> +}

May I suggest converting storagePoolUpdateState to
storagePoolUpdateStateCallback? I this particular case I find the additional
level of wrapping functions unnecessary.

Reviewed-by: Erik Skultety <eskul...@redhat.com>

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

Reply via email to