On Tue, Feb 6, 2018 at 4:43 PM, Wei Liu <wei.l...@citrix.com> wrote:

> On Wed, Nov 01, 2017 at 05:04:44PM +0200, Oleksandr Grytsov wrote:
> > From: Oleksandr Grytsov <oleksandr_gryt...@epam.com>
> >
> > Add getting vsnd list amd info API
> >
> > Signed-off-by: Oleksandr Grytsov <oleksandr_gryt...@epam.com>
> > ---
> >  tools/libxl/libxl.h         |  10 ++
> >  tools/libxl/libxl_types.idl |  19 +++
> >  tools/libxl/libxl_utils.h   |   3 +
> >  tools/libxl/libxl_vsnd.c    | 375 ++++++++++++++++++++++++++++++
> +++++++++++++-
> >  4 files changed, 404 insertions(+), 3 deletions(-)
> >
> > diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
> > index 7200d49..acb73ce 100644
> > --- a/tools/libxl/libxl.h
> > +++ b/tools/libxl/libxl.h
> > @@ -1927,6 +1927,16 @@ int libxl_device_vsnd_destroy(libxl_ctx *ctx,
> uint32_t domid,
> >                                const libxl_asyncop_how *ao_how)
> >                                LIBXL_EXTERNAL_CALLERS_ONLY;
> >
> > +libxl_device_vsnd *libxl_device_vsnd_list(libxl_ctx *ctx,
> > +                                          uint32_t domid, int *num)
> > +                                          LIBXL_EXTERNAL_CALLERS_ONLY;
> > +void libxl_device_vsnd_list_free(libxl_device_vsnd* list, int num)
> > +                                 LIBXL_EXTERNAL_CALLERS_ONLY;
> > +int libxl_device_vsnd_getinfo(libxl_ctx *ctx, uint32_t domid,
> > +                              libxl_device_vsnd *vsnd,
> > +                              libxl_vsndinfo *vsndlinfo)
> > +                              LIBXL_EXTERNAL_CALLERS_ONLY;
> > +
> >  /* Keyboard */
> >  int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid,
> libxl_device_vkb *vkb,
> >                           const libxl_asyncop_how *ao_how)
> > diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> > index aa30196..553e724 100644
> > --- a/tools/libxl/libxl_types.idl
> > +++ b/tools/libxl/libxl_types.idl
> > @@ -988,6 +988,25 @@ libxl_vdisplinfo = Struct("vdisplinfo", [
> >      ("connectors", Array(libxl_connectorinfo, "num_connectors"))
> >      ], dir=DIR_OUT)
> >
> > +libxl_streaminfo = Struct("streaminfo", [
> > +    ("req_evtch", integer),
> > +    ("req_rref", integer)
> > +    ])
> > +
> > +libxl_pcminfo = Struct("pcminfo", [
> > +    ("streams", Array(libxl_streaminfo, "num_vsnd_streams"))
> > +    ])
> > +
> > +libxl_vsndinfo = Struct("vsndinfo", [
> > +    ("backend", string),
> > +    ("backend_id", uint32),
> > +    ("frontend", string),
> > +    ("frontend_id", uint32),
> > +    ("devid", libxl_devid),
> > +    ("state", integer),
> > +    ("pcms", Array(libxl_pcminfo, "num_vsnd_pcms"))
> > +    ])
> > +
> >  # NUMA node characteristics: size and free are how much memory it has,
> and how
> >  # much of it is free, respectively. dists is an array of distances from
> this
> >  # node to each other node.
> > diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h
> > index 9e743dc..5455752 100644
> > --- a/tools/libxl/libxl_utils.h
> > +++ b/tools/libxl/libxl_utils.h
> > @@ -82,6 +82,9 @@ int libxl_devid_to_device_usbctrl(libxl_ctx *ctx,
> uint32_t domid,
> >  int libxl_devid_to_device_vdispl(libxl_ctx *ctx, uint32_t domid,
> >                                   int devid, libxl_device_vdispl
> *vdispl);
> >
> > +int libxl_devid_to_device_vsnd(libxl_ctx *ctx, uint32_t domid,
> > +                               int devid, libxl_device_vsnd *vsnd);
> > +
> >  int libxl_ctrlport_to_device_usbdev(libxl_ctx *ctx, uint32_t domid,
> >                                      int ctrl, int port,
> >                                      libxl_device_usbdev *usbdev);
> > diff --git a/tools/libxl/libxl_vsnd.c b/tools/libxl/libxl_vsnd.c
> > index 99e4be3..35f1aed 100644
> > --- a/tools/libxl/libxl_vsnd.c
> > +++ b/tools/libxl/libxl_vsnd.c
> > @@ -37,22 +37,247 @@ static int libxl__device_from_vsnd(libxl__gc *gc,
> uint32_t domid,
> >     return 0;
> >  }
> >
> > +static int libxl__sample_rates_from_string(libxl__gc *gc, const char
> *str,
> > +                                           libxl_vsnd_params *params)
> > +{
> > +    char *tmp = libxl__strdup(gc, str);
> > +
> > +    params->num_sample_rates = 0;
> > +    params->sample_rates = NULL;
> > +
> > +    char *p = strtok(tmp, " ,");
> > +
> > +    while (p != NULL) {
> > +        params->sample_rates = realloc(params->sample_rates,
> > +                                       sizeof(*params->sample_rates) *
> > +                                       (params->num_sample_rates + 1));
>
> This is problematic. You need to check if realloc returns NULL before
> overwriting sample_rates.
>
> It is also a bit expensive to realloc 1 element at a time. Is is
> possible to know the size before hand? If not, then fine.
>
> Please use libxl__realloc instead. We have quite a few wrappers in
> libxl. In general please use them unless you have very compelling reason
> not to.
>
> There could be other places in your two series that I missed, please fix
> them.
>
> Wei.
>

Yes, I agree that it is bit expensive to make realloc for each element.
I will count num elements before. About using realloc instead of
libxl_realloc in this place. it is autogenerated structure and it will be
freed with appropriate API. Using libxl__realloc will cause double free
issue.

-- 
Best Regards,
Oleksandr Grytsov.
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to