WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH V6 3/3] libxl, Introduce a QMP client

Anthony PERARD writes ("[Xen-devel] [PATCH V6 3/3] libxl, Introduce a QMP 
client"):
> QMP stands for QEMU Monitor Protocol and it is used to query information
> from QEMU or to control QEMU.

>      if (dm_starting) {
> +        if (dm_info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_QEMU
_XEN) {
> +            libxl__qmp_initializations(ctx, domid);
> +        }
...
> +    flexarray_append(dm_args,
> +                     libxl__sprintf(gc, "socket,id=libxl-cmd,path=%s/qmp-%d,
server,nowait",
> +                                    libxl_run_dir_path(),

Lines too long, please wrap

> +static void qmp_handle_error_response(libxl__qmp_handler *qmp,
> +                                      const libxl__json_object *resp)
> +{
> +    callback_id_pair *pp = qmp_get_callback_from_id(qmp, resp);
...
> +    if (pp) {
> +        if (pp->id == qmp->wait_for_id) {
> +            /* tell that the id have been processed */
> +            qmp->wait_for_id = 0;
> +        }
> +        SIMPLEQ_REMOVE(&qmp->callback_list, pp, callback_id_pair, next);
> +        free(pp);

I think this needs to call the callback, or the code which set up the
callback will surely just continue to wait forever.

...

Later: I see that you have a single wait_for_id.  What if multiple
callers want to use a single qmp for multiple things ?  Or is
"wait_for_id" simply the one that you're waiting on synchronously ?

> +static int qmp_next(libxl__qmp_handler *qmp)
> +{
...
> +        ret = select(qmp->qmp_fd + 1, &rfds, NULL, NULL, &timeout);
> +        if (ret > 0) {
> +            rd = read(qmp->qmp_fd, qmp->buffer, QMP_RECEIVE_BUFFER_SIZE);
> +            if (rd > 0) {
> +                break;
...
> +    s = qmp->buffer;
> +    s_end = qmp->buffer + rd;
> +    while (s < s_end) {
> +        libxl__json_object *o = libxl__json_parse(qmp->ctx, &qmp->yajl_ctx,
> +                                                  &s, s_end - s);

This assumes that the response will be received in a single read().
This is not correct.  read() may return partial results; it may also
aggregate multiple writes from the sending qemu into a single read()
result.

You need to pull data into the buffer and then test the buffer for
completeness (eg by looking for the cr-lf), and split the buffer up
into packets yourself, and if there are partial packets left over
go round and read again.


Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>