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 <pkre...@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
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list