On Wed, Jul 10, 2019 at 05:32:16PM +0200, Ján Tomko wrote: > On Thu, Jun 27, 2019 at 10:54:33AM +0100, Daniel P. Berrangé wrote: > > The current VIR_AUTOPTR macro assumes that the struct needs to have a > > auto-free function auto-generated to call the real free function. > > > > The new VIR_AUTOSTRUCT macro allows for structs which already have a > > free function which takes a pointer to a pointer to the struct and can > > thus be used directly for auto-cleanup. > > > > Signed-off-by: Daniel P. Berrangé <berra...@redhat.com> > > --- > > src/util/viralloc.h | 13 +++++++++++++ > > 1 file changed, 13 insertions(+) > > > > diff --git a/src/util/viralloc.h b/src/util/viralloc.h > > index 2b82096fde..5de18b9ea0 100644 > > --- a/src/util/viralloc.h > > +++ b/src/util/viralloc.h > > @@ -614,3 +614,16 @@ void virAllocTestHook(void (*func)(int, void*), void > > *data); > > * when the variable goes out of scope. > > */ > > #define VIR_AUTOFREE(type) __attribute__((cleanup(virFree))) type > > + > > +/** > > + * VIR_AUTOSTRUCT: > > + * @type: type of the struct variable to be freed automatically > > + * > > + * Macro to automatically free the memory allocated to > > + * the struct variable declared with it by calling vir$STRUCTFree > > + * when the variable goes out of scope. > > + * > > + * The vir$STRUCTFree function must take a pointer to a pointer > > + * to the struct. > > + */ > > +#define VIR_AUTOSTRUCT(type) __attribute__((cleanup(type ## Free))) type > > commit a4bfc2521f8aeff8f4e4431a8e2332cc74806b8a > util: Move the VIR_AUTO(CLEAN|PTR) helper macros into a separate header > > moved the macros not depending on other stuff from viralloc.h to > virautoclean.h > > This macro would better fit there.
I'm going to drop this patch in fact. I realized there's a trivial way to use the existing VIR_AUTOPTR in the way I want: diff --git a/src/util/virsystemd.h b/src/util/virsystemd.h index 2858732d00..5d56c78835 100644 --- a/src/util/virsystemd.h +++ b/src/util/virsystemd.h @@ -79,3 +79,5 @@ void virSystemdActivationClaimFDs(virSystemdActivationPtr act, size_t *nfds); void virSystemdActivationFree(virSystemdActivationPtr *act); + +#define virSystemdActivationAutoPtrFree virSystemdActivationFree diff --git a/tests/virsystemdtest.c b/tests/virsystemdtest.c index edca45d9f0..586c512fca 100644 --- a/tests/virsystemdtest.c +++ b/tests/virsystemdtest.c @@ -554,7 +554,7 @@ testActivation(bool useNames) virSystemdActivationMap map[2]; int *fds = NULL; size_t nfds = 0; - VIR_AUTOSTRUCT(virSystemdActivation) *act = NULL; + VIR_AUTOPTR(virSystemdActivation) act = NULL; if (testActivationCreateFDs(&sockUNIX, &sockIP, &nsockIP) < 0) return -1; This is nicer because it lets us incrementally get rid of all the VIR_DEFINE_AUTOPTR_FUNC() by converting the regular xxxFree() funcs to take a pointer to a pointer, without having to replace all the VIR_AUTOPTR uss with VIR_AUTOSTRUCT Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list