On Wed, Mar 10, 2021 at 06:41:35PM +0100, Michal Privoznik wrote:
On 3/10/21 4:36 PM, Michal Privoznik wrote:
> On 3/9/21 6:44 PM, Daniel P. Berrangé wrote:
> > One of the conventions we have had since the early days of libvirt is
> > that every struct typedef, has a corresponding "Ptr" typedef too.
> >
> > For example
> >
> > typedef struct _virDomainDef virDomainDef;
> > typedef virDomainDef *virDomainDefPtr;
> >
> > Periodically someone has questioned what the purpose of these Ptr
> > typedefs is, and we've not had an compelling answer, other than
> > that's what we've always done.
> >
>
> One possible upside is that it allows for less scary function headers,
> for instance:
>
> virDomainChrGetDomainPtrsInternal(virDomainDefPtr vmdef,
> virDomainChrDeviceType type,
> virDomainChrDefPtr ***arrPtr,
> size_t **cntPtr);
>
> Three levels of dereference don't look as bad as four.
> But yeah, I agree we should drop them. I wonder if cocci can help here.
> Or even plain in-place sed, except we'd have to be careful with
> statements like:
>
> virSomethingPtr a, b;
>
> where both @a and @b are pointers, and plain substitution would break it:
>
> virSomething *a, b;
>
> (here only @a is poitner, ofc).
>
> But since we have Peter nagging about this kind of variable declaration,
> it's not something one couldn't fix by hand. And in fact, whilst we're
> at it we could declare each variable at its own line.
Okay, another problem: how does this g_auto() and similar work? I mean, now
we have:
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(virSysinfoDefPtr, virSysinfoDefFree, NULL);
and it works fine. But obviously either of:
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(virSysinfoDef *, ...);
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(virSysinfoDef, ...);
is plain wrong. Maybe we can switch to g_autoptr() instead.
Yes, we should be using g_autoptr even today, because g_auto is not for
this use case:
https://developer.gnome.org/glib/2.64/glib-Miscellaneous-Macros.html#g-auto
"This is meant to be used with stack-allocated structures and non-pointer types.
For the (more commonly used) pointer version, see g_autoptr()."
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 :|