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

Re: [Xen-devel] [PATCH v2 05/15] libxl: change libxl__ao_device_remove to libxl__ao_device



On Tue, 2012-05-22 at 16:10 +0100, Ian Jackson wrote:
> >  int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid,
> > -                                  libxl_device_nic *nic)
> > +                             libxl_device_nic *nic,
> > +                             const libxl_asyncop_how *ao_how)
> >  {
> > -    GC_INIT(ctx);
> > -    libxl__device device;
> > +    AO_CREATE(ctx, domid, ao_how);
> > +    libxl__device *device;
> > +    libxl__ao_device *aorm;
> >      int rc;
> >
> > -    rc = libxl__device_from_nic(gc, domid, nic, &device);
> > +    GCNEW(device);
> > +    rc = libxl__device_from_nic(gc, domid, nic, device);
> >      if (rc != 0) goto out;
> >
> > -    rc = libxl__device_destroy(gc, &device);
> > +    GCNEW(aorm);
> > +    libxl__init_ao_device(aorm, ao, NULL);
> > +    aorm->action = DEVICE_DISCONNECT;
> > +    aorm->force = 1;
> > +    aorm->dev = device;
> > +    aorm->callback = libxl__device_cb;
> > +    libxl__initiate_device_remove(egc, aorm);
> > +
> 
> Is there some way to make these functions less repetitive ?
> We have {nic,disk,vkb,vfb}_{remove,destroy} all of which have
> essentially identical innards.
> 
> I have some suggestions, in descending order of my own preference.
> 
> How about writing the common code once in a macro:
> 
>  1  #define DEFINE_DEVICE_REMOVE(type, removedestroy, force)       \
>  1     int libxl_device_##type##_##removedestroy(libxl_ctx *ctx,   \
>  1                 uint32_t domid, libxl_device_##type *nic,       \
>  1                 const libxl_asyncop_how *ao_how)                \
>  1     {                                                           \
>  1         AO_CREATE etc. etc.                                     \
>  1         rc = libxl__device_from_##type( etc. etc. )             \
>  1         etc. etc.                                               \
>  1     }
> 
>  8  DEFINE_DEVICE_REMOVE(nic, remove, 0)
>  .  DEFINE_DEVICE_REMOVE(nic, destroy, 1)
>  .  DEFINE_DEVICE_REMOVE(disk, remove, 0)
>  .  DEFINE_DEVICE_REMOVE(disk, destroy, 1)
>  .  DEFINE_DEVICE_REMOVE(vkb, remove, 0)
>  .  DEFINE_DEVICE_REMOVE(vkb, destroy, 1)
>  .  DEFINE_DEVICE_REMOVE(vfb, remove, 0)
>  .  DEFINE_DEVICE_REMOVE(vfb, destroy, 1)

[...]

> Or at least reducing the size of the octuplicated code like this:
> 
>  1  int device_remove(libxl_ao *ao, uint32_t domid,
>  1                    libxl__device *device, int force)
>  1  {
>  1    ...
>  1    GCNEW(aodev);
>  1    libxl__init_ao_device(aodev, ao, NULL);
>  1    aodev->action = DEVICE_DISCONNECT;
>  1    aodev->force = 1;
>  1    aodev->dev = device;
>  1    aodev->callback = libxl__device_cb;
>  1    libxl__initiate_device_addremove(egc, aodev);
>  1    etc. etc.
> 
>  8  int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid,
>  8                              libxl_device_nic *nic,
>  8                              const libxl_asyncop_how *ao_how)
>  8  {
>  8      AO_CREATE(ctx, domid, ao_how);
>  8      int rc;
>  8      libxl__device *device;
>  8
>  8      rc = libxl__device_from_nic(gc, domid, nic, &device);
>  8      if (rc) return AO_ABORT(rc);
>  8
>  8      device_remove(ao, domid, device, 0);
>  8      return AO_INPROGRESS;
>  8   }

Weirdly (given they were ordered by your preference) I have a preference
for either the first or last form (which I have left quoted above).

I probably slightly prefer the second option, but only slightly
(probably due to a general disquiet about macros which define
functions).

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.