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