Re: [PATCH v3 01/35] util: alloc: add macros for implementing automatic cleanup functionality

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jul 12, 2018 at 11:44:16PM +0530, Sukrit Bhatnagar wrote:
> On Thu, 12 Jul 2018 at 22:09, Erik Skultety <eskultet@xxxxxxxxxx> wrote:
> >
> > On Sat, Jun 30, 2018 at 02:30:05PM +0530, Sukrit Bhatnagar wrote:
> > > New macros are introduced which help in adding GNU C's cleanup
> > > attribute to variable declarations. Variables declared with these
> > > macros will have their allocated memory freed automatically when
> > > they go out of scope.
> > >
> > > Signed-off-by: Sukrit Bhatnagar <skrtbhtngr@xxxxxxxxx>
> > > ---
> > >  src/util/viralloc.h | 44 ++++++++++++++++++++++++++++++++++++++++++++
> > >  1 file changed, 44 insertions(+)
> > >
> > > diff --git a/src/util/viralloc.h b/src/util/viralloc.h
> > > index 69d0f90..5c1d0d5 100644
> > > --- a/src/util/viralloc.h
> > > +++ b/src/util/viralloc.h
> > > @@ -596,4 +596,48 @@ void virAllocTestInit(void);
> > >  int virAllocTestCount(void);
> > >  void virAllocTestOOM(int n, int m);
> > >  void virAllocTestHook(void (*func)(int, void*), void *data);
> > > +
> > > +# define VIR_AUTOPTR_TYPE_NAME(type) type##AutoPtr
> > > +# define VIR_AUTOPTR_FUNC_NAME(type) type##AutoPtrFree
> > > +
> > > +/**
> > > + * VIR_DEFINE_AUTOPTR_FUNC:
> > > + * @type: type of the variable to be freed automatically
> > > + * @func: cleanup function to be automatically called
> > > + *
> > > + * This macro defines a function for automatic freeing of
> > > + * resources allocated to a variable of type @type. This newly
> > > + * defined function works as a necessary wrapper around @func.
> > > + */
> > > +# define VIR_DEFINE_AUTOPTR_FUNC(type, func) \
> > > +    typedef type *VIR_AUTOPTR_TYPE_NAME(type); \
> >
> > So, it's not visible at first glance how ^this typedef is used...
> >
> > > +    static inline void VIR_AUTOPTR_FUNC_NAME(type)(type **_ptr) \
> > > +    { \
> > > +        if (*_ptr) \
> > > +            (func)(*_ptr); \
> > > +        *_ptr = NULL; \
> > > +    } \
> >
> > ...therefore I'd write it explicitly as
> >
> > VIR_AUTOPTR_FUNC_NAME(type)(VIR_AUTOPTR_TYPE_NAME(type) *_ptr)
> >
> > > +
> > > +# define VIR_AUTOPTR(type) \
> > > +    __attribute__((cleanup(VIR_AUTOPTR_FUNC_NAME(type)))) VIR_AUTOPTR_TYPE_NAME(type)
> > > +
> >
> > Also, since we're going to use it like this:
> > VIR_AUTOPTR(virDomainDef) foo
> >
> > instead of this:
> > VIR_AUTOPTR(virDomainDefPtr) foo
> >
> > why do we need VIR_AUTOPTR_TYPE_NAME anyway, since you could just use
> > "type *" in the VIR_AUTOPTR macro definition and that should work for external
> > types as well.
>
> I agree. We don't really need it. Here is how the code will look after
> the changes
> you suggested:
>
> # define VIR_AUTOPTR_FUNC_NAME(type) type##AutoPtrFree
>
> # define VIR_DEFINE_AUTOPTR_FUNC(type, func) \
>     static inline void VIR_AUTOPTR_FUNC_NAME(type)(type **_ptr) \
>     { \
>         if (*_ptr) \
>             (func)(*_ptr); \
>         *_ptr = NULL; \
>     } \
>
> # define VIR_AUTOFREE(type) __attribute__((cleanup(virFree))) type
>
> # define VIR_AUTOPTR(type) \
>     __attribute__((cleanup(VIR_AUTOPTR_FUNC_NAME(type)))) type *
>
>
> Shall I proceed to send the first series of patches?

Yep, please do, since there weren't any major flaws code-wise, I think it
should be very straightforward.

Erik

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux