qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Kevin Wolf <kwolf@redhat.com>
Cc: Luiz Capitulino <lcapitulino@redhat.com>,
	Michael Roth <mdroth@linux.vnet.ibm.com>,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 08/14] qapi: convert eject (qmp and hmp) to QAPI
Date: Thu, 25 Aug 2011 08:40:08 -0500	[thread overview]
Message-ID: <4E5650B8.9040809@codemonkey.ws> (raw)
In-Reply-To: <4E563DD9.7030406@redhat.com>

On 08/25/2011 07:19 AM, Kevin Wolf wrote:
> Am 24.08.2011 20:43, schrieb Anthony Liguori:
>> Signed-off-by: Anthony Liguori<aliguori@us.ibm.com>
>> ---
>>   blockdev.c       |   22 +++++++++++-----------
>>   blockdev.h       |    1 -
>>   hmp-commands.hx  |    3 +--
>>   hmp.c            |   14 ++++++++++++++
>>   hmp.h            |    1 +
>>   qapi-schema.json |   25 +++++++++++++++++++++++++
>>   qmp-commands.hx  |    3 +--
>>   7 files changed, 53 insertions(+), 16 deletions(-)
>
> All of the conversion patches I've read so far add more lines than they
> delete (even when you ignore changes to the schema, which is mostly new
> documentation), even though I had expected code generation to do the
> opposite, that is less hand-written code.
>
> Is this expected, or are these first examples just exceptions?

Yes.  These are extremely simple interfaces so unmarshalling a couple 
strings by hand really isn't all that hard to do.  Plus, this series 
adds 4 new commands and also adds significantly more documentation than 
has ever existed before (in fact, that's the largest add in this patch).

The real code savings comes in for the commands that return complex data 
structures like query-vnc.  Not only do we save code, but we save a lot 
of complexity.

In the full conversion branch, I think we're generating somewhere around 
10k lines of code.  So there's a pretty significant savings.

>
>> diff --git a/blockdev.c b/blockdev.c
>> index d272659..6b7fc41 100644
>> --- a/blockdev.c
>> +++ b/blockdev.c
>> @@ -16,6 +16,7 @@
>>   #include "sysemu.h"
>>   #include "hw/qdev.h"
>>   #include "block_int.h"
>> +#include "qmp-commands.h"
>>
>>   static QTAILQ_HEAD(drivelist, DriveInfo) drives = QTAILQ_HEAD_INITIALIZER(drives);
>>
>> @@ -644,32 +645,31 @@ out:
>>       return ret;
>>   }
>>
>> -static int eject_device(Monitor *mon, BlockDriverState *bs, int force)
>> +static int eject_device(BlockDriverState *bs, int force, Error **errp)
>>   {
>>       if (!bdrv_is_removable(bs)) {
>> -        qerror_report(QERR_DEVICE_NOT_REMOVABLE, bdrv_get_device_name(bs));
>> +        error_set(errp, QERR_DEVICE_NOT_REMOVABLE, bdrv_get_device_name(bs));
>>           return -1;
>>       }
>>       if (!force&&  bdrv_is_locked(bs)) {
>> -        qerror_report(QERR_DEVICE_LOCKED, bdrv_get_device_name(bs));
>> +        error_set(errp, QERR_DEVICE_LOCKED, bdrv_get_device_name(bs));
>>           return -1;
>>       }
>>       bdrv_close(bs);
>>       return 0;
>>   }
>>
>> -int do_eject(Monitor *mon, const QDict *qdict, QObject **ret_data)
>> +void qmp_eject(const char *device, bool has_force, bool force, Error **errp)
>
> Wow, this is ugly. :-)
>
> I would suspect that many cases of optional arguments are like this: If
> it isn't specified, the very first thing the monitor handler does is to
> assign a default value (false in this case). Can't we include default
> values in the schema and get the handling outside instead of an
> additional has_xyz parameter that can easily be ignored by accident,
> like in the code below?

There are quite a few commands that actually rely on tristate behavior. 
  So they'll do things like:

if (has_force) {
    if (force) {
       do_A();
    } else {
       do_B();
    }
} else {
    do_C();
}

It's not pretty, but it lets us preserve compatibility.  I think it's 
also safer for dealing with pointers because otherwise you have a mix of 
pointers that may be null and may not be null.  Having a clear 
indication of which pointers are nullable makes for safer code.

Regards,

Anthony Liguori

>
>>   {
>>       BlockDriverState *bs;
>> -    int force = qdict_get_try_bool(qdict, "force", 0);
>> -    const char *filename = qdict_get_str(qdict, "device");
>>
>> -    bs = bdrv_find(filename);
>> +    bs = bdrv_find(device);
>>       if (!bs) {
>> -        qerror_report(QERR_DEVICE_NOT_FOUND, filename);
>> -        return -1;
>> +        error_set(errp, QERR_DEVICE_NOT_FOUND, device);
>> +        return;
>>       }
>> -    return eject_device(mon, bs, force);
>> +
>> +    eject_device(bs, force, errp);
>>   }
>
> Kevin
>

  reply	other threads:[~2011-08-25 13:40 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-24 18:42 [Qemu-devel] [PATCH 00/14] Convert commands to QAPI (batch 1) Anthony Liguori
2011-08-24 18:42 ` [Qemu-devel] [PATCH 01/14] qerror: add qerror_report_err() Anthony Liguori
2011-08-24 20:15   ` Luiz Capitulino
2011-09-02 15:59     ` Anthony Liguori
2011-08-24 18:42 ` [Qemu-devel] [PATCH 02/14] qapi: add code generation support for middle mode Anthony Liguori
2011-08-24 18:42 ` [Qemu-devel] [PATCH 03/14] qapi: use middle mode in QMP server Anthony Liguori
2011-08-24 20:20   ` Luiz Capitulino
2011-08-24 20:38     ` Anthony Liguori
2011-08-25 16:24   ` Michael Roth
2011-08-25 16:30     ` Luiz Capitulino
2011-09-02 16:00     ` Anthony Liguori
2011-09-02 16:09       ` Luiz Capitulino
2011-09-02 16:31         ` Michael Roth
2011-09-02 16:45           ` Anthony Liguori
2011-09-02 16:57             ` Luiz Capitulino
2011-08-24 18:42 ` [Qemu-devel] [PATCH 04/14] qapi: convert query-name Anthony Liguori
2011-08-24 20:28   ` Luiz Capitulino
2011-08-24 20:41     ` Anthony Liguori
2011-08-24 21:02       ` Luiz Capitulino
2011-08-24 18:43 ` [Qemu-devel] [PATCH 05/14] block: add unsafe_probe Anthony Liguori
2011-08-24 18:43 ` [Qemu-devel] [PATCH 06/14] monitor: expose readline state Anthony Liguori
2011-08-24 18:43 ` [Qemu-devel] [PATCH 07/14] qerror: add additional parameter to QERR_DEVICE_ENCRYPTED Anthony Liguori
2011-08-24 18:43 ` [Qemu-devel] [PATCH 08/14] qapi: convert eject (qmp and hmp) to QAPI Anthony Liguori
2011-08-24 21:06   ` Luiz Capitulino
2011-08-25 12:19   ` Kevin Wolf
2011-08-25 13:40     ` Anthony Liguori [this message]
2011-08-25 13:52       ` Kevin Wolf
2011-08-25 14:03         ` Avi Kivity
2011-09-02 16:05         ` Anthony Liguori
2011-09-02 16:36           ` Kevin Wolf
2011-08-24 18:43 ` [Qemu-devel] [PATCH 09/14] qapi: convert block_passwd and add set-blockdev-password Anthony Liguori
2011-08-25 12:29   ` Kevin Wolf
2011-08-24 18:43 ` [Qemu-devel] [PATCH 10/14] qapi: add change-vnc-password Anthony Liguori
2011-08-25  9:07   ` Gerd Hoffmann
2011-08-25 13:12     ` Anthony Liguori
2011-08-25 13:33   ` Luiz Capitulino
2011-09-02 16:08     ` Anthony Liguori
2011-08-24 18:43 ` [Qemu-devel] [PATCH 11/14] qapi: add change-vnc-listen Anthony Liguori
2011-08-25 13:32   ` Luiz Capitulino
2011-09-02 16:11     ` Anthony Liguori
2011-08-24 18:43 ` [Qemu-devel] [PATCH 12/14] qapi: introduce change-blockdev Anthony Liguori
2011-08-25 12:46   ` Kevin Wolf
2011-08-25 12:56     ` Anthony Liguori
2011-08-25 13:47       ` Kevin Wolf
2011-08-25 13:50         ` Anthony Liguori
2011-08-25 14:09   ` Luiz Capitulino
2011-08-25 14:21     ` Anthony Liguori
2011-08-25 14:52       ` Luiz Capitulino
2011-08-24 18:43 ` [Qemu-devel] [PATCH 13/14] qapi: convert change Anthony Liguori
2011-08-25 14:43   ` Luiz Capitulino
2011-08-24 18:43 ` [Qemu-devel] [PATCH 14/14] vnc: don't demote authentication protocol when disabling login Anthony Liguori
2011-08-24 20:45   ` Daniel P. Berrange
2011-08-24 20:47     ` Anthony Liguori
2011-08-25 14:55 ` [Qemu-devel] [PATCH 00/14] Convert commands to QAPI (batch 1) Luiz Capitulino

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4E5650B8.9040809@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=kwolf@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).