[libvirt] [PATCH v2 1/4] util: string: Introduce macro for automatic string lists
Erik Skultety
eskultet at redhat.com
Thu Feb 28 14:38:50 UTC 2019
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 at 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.
More information about the libvir-list
mailing list