From: Anthony Liguori <anthony@codemonkey.ws>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-devel@nongnu.org, Michael Roth <mdroth@linux.vnet.ibm.com>,
Luiz Capitulino <lcapitulino@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 08/14] qapi: convert eject (qmp and hmp) to QAPI
Date: Fri, 02 Sep 2011 11:05:13 -0500 [thread overview]
Message-ID: <4E60FEB9.8060508@codemonkey.ws> (raw)
In-Reply-To: <4E5653B4.9030206@redhat.com>
On 08/25/2011 08:52 AM, Kevin Wolf wrote:
> Am 25.08.2011 15:40, schrieb Anthony Liguori:
>> 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.
>
> I'm not saying that implementing a default value in generic (or
> generated) code works for all cases. But if the schema supported default
> values, we could get rid of the parameter in all simple cases (which I
> would expect to be the majority); and if there is no default value in
> the schema, we could still generate the has_* parameters.
I had thought about this but forgot to respond.
The problem is that the schema doesn't help the C API. We're going to
use QMP commands internally too. So if the schema defaulted optional
arguments, you'd end up having those default values open coded in the C
APIs. As ugly as it is, having an explicit not-specified flag allows
the C API to have the same semantics as the wire protocol.
Honestly, having optional arguments in the methods was a bad move. We
shouldn't do that anymore. Optional arguments should always be done via
a structure as Avi sort of suggested in another response.
Regards,
Anthony Liguori
>
> Kevin
>
next prev parent reply other threads:[~2011-09-02 16:05 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
2011-08-25 13:52 ` Kevin Wolf
2011-08-25 14:03 ` Avi Kivity
2011-09-02 16:05 ` Anthony Liguori [this message]
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=4E60FEB9.8060508@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).