
On Wed, Feb 27, 2019 at 01:32:43PM +0100, Michal Privoznik wrote:
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.
Oh, I completely forgot about VIR_AUTOCLOSE which supports Peter's argument about the case where the freeing function is tied to the macro regardless of type.