[libvirt] [PATCH v2 1/4] util: string: Introduce macro for automatic string lists

Michal Privoznik mprivozn at redhat.com
Wed Feb 27 12:32:43 UTC 2019


On 2/27/19 10:52 AM, Erik Skultety wrote:
> On Tue, Feb 26, 2019 at 04:48:23PM +0100, Peter Krempa wrote:
>> Similar to VIR_AUTOPTR, VIR_AUTOSTRINGLIST defines a list of strings
>> which will be freed if the pointer is leaving scope.
>>
>> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
>> ---
>>   src/libvirt_private.syms |  1 +
>>   src/util/virstring.c     | 10 ++++++++++
>>   src/util/virstring.h     | 10 ++++++++++
>>   3 files changed, 21 insertions(+)
>>
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>> index 038a744981..e68e3f3a3b 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
>> @@ -2958,6 +2958,7 @@ virStringHasControlChars;
>>   virStringIsEmpty;
>>   virStringIsPrintable;
>>   virStringListAdd;
>> +virStringListAutoFree;
>>   virStringListFree;
>>   virStringListFreeCount;
>>   virStringListGetFirstWithPrefix;
>> diff --git a/src/util/virstring.c b/src/util/virstring.c
>> index e890dde546..8a791f96d4 100644
>> --- a/src/util/virstring.c
>> +++ b/src/util/virstring.c
>> @@ -318,6 +318,16 @@ void virStringListFree(char **strings)
>>   }
>>
>>
>> +void virStringListAutoFree(char ***strings)
>> +{
>> +    if (!*strings)
>> +        return;
>> +
>> +    virStringListFree(*strings);
>> +    *strings = NULL;
>> +}
>> +
>> +
>>   /**
>>    * virStringListFreeCount:
>>    * @strings: array of strings to free
>> diff --git a/src/util/virstring.h b/src/util/virstring.h
>> index aef82471c2..d14b7f4f49 100644
>> --- a/src/util/virstring.h
>> +++ b/src/util/virstring.h
>> @@ -53,6 +53,7 @@ int virStringListCopy(char ***dst,
>>                         const char **src);
>>
>>   void virStringListFree(char **strings);
>> +void virStringListAutoFree(char ***strings);
>>   void virStringListFreeCount(char **strings,
>>                               size_t count);
>>
>> @@ -307,6 +308,15 @@ int virStringParsePort(const char *str,
>>                          unsigned int *port)
>>       ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
>>
>> +/**
>> + * VIR_AUTOSTRINGLIST:
>> + *
>> + * Declares a NULL-terminated list of strings which will be automatically freed
>> + * when the pointer goes out of scope.
>> + */
>> +# define VIR_AUTOSTRINGLIST \
>> +        __attribute__((cleanup(virStringListAutoFree))) char **
>> +
> 
> IIRC at the beginning we said that all the VIR_AUTO macros should be consistent
> in terms of how we use the macro, IOW:
> 
> VIR_AUTOFREE(type)
> VIR_AUTOPTR(type)
> VIR_AUTOCLEAN(type)

Well, we already have VIR_AUTOCLOSE. I don't mind having a macro that 
implicitly defines type of a variable.

On the other hand, this could be renamed to VIR_AUTOLISTFREE as it is 
capable of freeing any NULL terminated list of pointers where plain 
free() ove each member is enough. But it will have to lose the implicit 
type def in that case.

Michal




More information about the libvir-list mailing list