[libvirt] [PATCH 2/4] storage: Introduce virStoragePoolObjListForEach

John Ferlan jferlan at redhat.com
Thu Nov 23 12:16:32 UTC 2017



On 11/23/2017 04:42 AM, Erik Skultety wrote:
> 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 <jferlan at 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 <eskultet at redhat.com>
> 

Hmm..  right... I looked ahead in the other series to see if there was a
reason for this and I couldn't find one (it's been a few weeks since I
made the changes so I couldn't remember). At some point in time
(shortly) there's a conversion to use hash tables too (it's really close).

Tks -

John

(




More information about the libvir-list mailing list