On 2/28/19 8:39 AM, Peter Krempa wrote:
On Wed, Feb 27, 2019 at 10:52:47 +0100, 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(a)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)
>
> although I can't say I personally don't like your version, nevertheless, as
I
> said we should remain consistent and use 'char **' explicitly when using the
> macro.
I'm not sure I understood. Did you mean that it should be used as:
VIR_AUTOSTRINGLIST char **list = NULL; ?
I have this vague recollection of lengthy discussions over how to handle
"char **" when these changes were being made originally. Too lazy to go
look that up though.
I do think VIR_AUTOSTRINGLIST is ok - perhaps shorter to type and easier
to read than VIR_AUTOCHARARRAYLIST.
Not sure I like VIR_AUTOLISTFREE because that to me says more like a
list of "anything" (not just strings).
JMO,
John