|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V3] xl: create VFB for PV guest when VNC is specified
Wei Liu writes ("Re: [Xen-devel] [PATCH V3] xl: create VFB for PV guest when
VNC is specified"):
> On Tue, Dec 17, 2013 at 04:40:46PM +0000, Ian Campbell wrote:
> > There's also an argument that this should be functionality provided in
> > helpers generated by the IDL, but that certainly isn't 4.4 material...
>
> OK. Now it looks like this.
>
> #define ARRAY_EXTEND_INIT(ptr,count,name) \
> ({ \
> typeof((ptr)) *_xl_array_ptr = &(ptr); \
> typeof((count)) *_xl_array_count = &(count); \
> typeof((count)) _xl_array_count_saved = *_xl_array_count; \
> *_xl_array_ptr = xrealloc(*_xl_array_ptr, \
> sizeof(**_xl_array_ptr) * \
> (*_xl_array_count + 1)); \
> (*_xl_array_count)++; \
> libxl_device_##name##_init(*_xl_array_ptr + _xl_array_count_saved); \
> (*_xl_array_ptr + _xl_array_count_saved); \
> })
>
> It 1) only evaluates its arguments once, 2) initializes the new element
> with corresponding function, 3) returns the new element.
I still think the bikeshed is the wrong colour and the result is very
ugly, but this will do.
Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Here's my real opinion:
If you are going to only use "name" once I don't think the token
pasting is justified. It would be justified if you used "name" to
automatically compute the right expression for ptr and count, but I
can see why you didn't want to do this.
> Longer local variables names are chosen in the hope that they don't
> clash with other names...
I realise you're copying what other people have done, but there is a
lot of cargo cult superstition about what needs to be, and what
doesn't need to be, in these kind of macro local variable names.
The leading _ is pretty pointless. The "xl" is pointless too because
these are inside the code for xl, so only other code inside xl will
see them.
I would call these variables array_extend_ptr et al.
As I've said I think evaluating the arguments multiple times is
better. After all they have to be lvalues.
So I would do:
#define ARRAY_EXTEND_INIT(array,count,initfn) \
({ \
typeof((count)) array_extend_old_count = (count); \
(count)++; \
(array) = xrealloc((array), sizeof(*array) * (count)); \
(initfn)(&(array)[array_extend_old_count]); \
&(array)[array_extend_old_count]; \
})
#define ADD_VDEV(container,things,initfn) \
ARRAY_EXTEND_INIT((container)->things, \
(container)->num_##things, \
(initfn))
...
vtpm = ADD_VDEV(d_config, vtpms, libxl_device_vtpm_init);
vtpm->devid = d_config->num_vtpms;
(not even compiled by me, obviously)
Sadly you can't generate "init" from "kind" because
libxl_device_pci_init but d_config->pcidevs.
Thanks,
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |