
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@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