From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: Luiz Capitulino <lcapitulino@redhat.com>
Cc: kwolf@redhat.com, pbonzini@redhat.com, qemu-devel@nongnu.org,
stefanha@redhat.com, armbru@redhat.com
Subject: Re: [Qemu-devel] [PATCH 2/6] qapi: rename MonitorEvent to QEvent
Date: Wed, 06 Nov 2013 11:25:50 +0800 [thread overview]
Message-ID: <5279B6BE.9050809@linux.vnet.ibm.com> (raw)
In-Reply-To: <20131105090612.010a6e46@redhat.com>
于 2013/11/5 22:06, Luiz Capitulino 写道:
> On Tue, 05 Nov 2013 13:31:09 +0800
> Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:
>
>> 于 2013/11/5 10:51, Luiz Capitulino 写道:
>>> On Tue, 05 Nov 2013 10:17:28 +0800
>>> Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:
>>>
>>>> 于 2013/11/4 21:33, Luiz Capitulino 写道:
>>>>> On Mon, 04 Nov 2013 09:59:50 +0800
>>>>> Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:
>>>>>
>>>>>> 于 2013/11/1 22:02, Luiz Capitulino 写道:
>>>>>>> On Mon, 21 Oct 2013 10:16:01 +0800
>>>>>>> Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:
>>>>>>>
>>>>>>>> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
>>>>>>>> ---
>>>>>>>> block.c | 2 +-
>>>>>>>> include/block/block_int.h | 2 +-
>>>>>>>> include/monitor/monitor.h | 6 +++---
>>>>>>>> monitor.c | 12 ++++++------
>>>>>>>> stubs/mon-protocol-event.c | 2 +-
>>>>>>>> ui/vnc.c | 2 +-
>>>>>>>> 6 files changed, 13 insertions(+), 13 deletions(-)
>>>>>>>>
>>>>>>>> diff --git a/block.c b/block.c
>>>>>>>> index 2c15e5d..458a4f8 100644
>>>>>>>> --- a/block.c
>>>>>>>> +++ b/block.c
>>>>>>>> @@ -1760,7 +1760,7 @@ void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
>>>>>>>> }
>>>>>>>>
>>>>>>>> void bdrv_emit_qmp_error_event(const BlockDriverState *bdrv,
>>>>>>>> - MonitorEvent ev,
>>>>>>>> + QEvent ev,
>>>>>>>> BlockErrorAction action, bool is_read)
>>>>>>>> {
>>>>>>>> QObject *data;
>>>>>>>> diff --git a/include/block/block_int.h b/include/block/block_int.h
>>>>>>>> index bcc72e2..bfdaf84 100644
>>>>>>>> --- a/include/block/block_int.h
>>>>>>>> +++ b/include/block/block_int.h
>>>>>>>> @@ -337,7 +337,7 @@ AioContext *bdrv_get_aio_context(BlockDriverState *bs);
>>>>>>>> int is_windows_drive(const char *filename);
>>>>>>>> #endif
>>>>>>>> void bdrv_emit_qmp_error_event(const BlockDriverState *bdrv,
>>>>>>>> - MonitorEvent ev,
>>>>>>>> + QEvent ev,
>>>>>>>> BlockErrorAction action, bool is_read);
>>>>>>>>
>>>>>>>> /**
>>>>>>>> diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
>>>>>>>> index 10fa0e3..8b14a6f 100644
>>>>>>>> --- a/include/monitor/monitor.h
>>>>>>>> +++ b/include/monitor/monitor.h
>>>>>>>> @@ -20,7 +20,7 @@ extern Monitor *default_mon;
>>>>>>>> #define MONITOR_CMD_ASYNC 0x0001
>>>>>>>>
>>>>>>>> /* QMP events */
>>>>>>>> -typedef enum MonitorEvent {
>>>>>>>> +typedef enum QEvent {
>>>>>>>
>>>>>>> Qt has a QEvent class, so QEvent is not a good name for us if we're
>>>>>>> considering making it public in the schema (which could become an
>>>>>>> external library in the distant future).
>>>>>>>
>>>>>>> I suggest calling it QMPEvent.
>>>>>>>
>>>>>>
>>>>>> Maybe QMPEventType, since QMPEvent should be used an union?
>>>>>
>>>>> If we add the 'event' type, like:
>>>>>
>>>>> { 'event': 'BLOCK_IO_ERROR', 'data': { ... } }
>>>>>
>>>>> Then we don't need an union.
>>>>>
>>>>
>>>> It would bring a little trouble to C code caller, for example the
>>>> event generate function(just like monitor_protocol_event) would be:
>>>> event_generate(QMPEvent *e);
>>>
>>> Hmm, no.
>>>
>>> Today, events are open-coded and an event's definition lives in the code,
>>> like the DEVICE_TRAY_MOVED event:
>>>
>>> static void bdrv_emit_qmp_eject_event(BlockDriverState *bs, bool ejected)
>>> {
>>> QObject *data;
>>>
>>> data = qobject_from_jsonf("{ 'device': %s, 'tray-open': %i }",
>>> bdrv_get_device_name(bs), ejected);
>>> monitor_protocol_event(QEVENT_DEVICE_TRAY_MOVED, data);
>>>
>>> qobject_decref(data);
>>> }
>>>
>>> Having an union for the event's names saves some typing elsewhere, but
>>> it doesn't solve the problem of having the event definition in the code.
>>> Adding event type support to the QAPI does solve this problem.
>>>
>>> Taking the DEVICE_TRAY_MOVED event as an example, we would have the
>>> following entry in the qapi-schema.json file:
>>>
>>> { 'event': 'DEVICE_TRAY_MOVED', 'data': { 'device': 'str',
>>> 'tray-open': 'bool' } }
>>>
>>> Then the QAPI generator would generate this function:
>>>
>>> void qmp_send_event_device_tray_moved(const char *device, bool tray_open);
>>>
>>> This function uses visitors to build a qobject which is then passed
>>> to monitor_protocol_event(), along with the event name. Also note that
>>> monitor_protocol_event() could take the event name as a string, which
>>> completely eliminates the current enum MonitorEvent.
>>>
>>> I believe this is the direction we want to go wrt events.
>>>
>>
>> It seems a different direction: let QAPI generator recognize
>> keyword 'event', and generate emit functions.
>
> Yes, the same way we have it for QMP commands.
>
>> My draft is a bit different:
>> caller:
>>
>> QMPEvent *e = g_malloc0(sizeof(QMPEvent));
>> e->kind = QMP_EVENT_TYPE_DEVICE_TRAY_MOVED;
>> e->device_tray_moved = g_malloc0(sizeof(QMPEventDeviceTrayMoved));
>> e->device_tray_moved->device = g_strdup("ide0-hd");
>> e->device_tray_moved->tray_open = false;
>> qmp_event_generate(e);
>> qapi_free_QMPEvent(e);
>>
>> Then qmp_event_generate() will use visitors to build qobject and then
>> emit it.
>
> Seems a lot more complex to me, we're going to write a lot of code if
> we do this.
>
OK, it is a good enough reason, I'll write qapi-event.py to get
qapi-event.h and qapi-event.c.
>> Compared with above, I think qmp_send_event_device_tray_moved()
>> method saves malloc and free calls, other things are similar(My draft
>> tells the caller how to set value by structure define, while your way
>> tells it by function define), but it may require more modification
>> for genrator scripts which I need to rework on, so wonder whether the
>> easier way is acceptable.
>
> We'll add event support to the code generator only once, then all
> a programmer has to do to add a new event is to add an new entry
> in the qapi-schema.json and call the generated qmp_send_event_()
> function from the appropriate place. That's trivial compared to
> what you showed above. Besides, there are other advantages. One of
> them is adding support to allow for C code to listen for events,
> which we might want to have in the future and builds nicely on
> top of having the QAPI event type.
>
next prev parent reply other threads:[~2013-11-06 3:26 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-21 2:15 [Qemu-devel] [PATCH 0/6] qapi: generate event defines automatically Wenchao Xia
2013-10-21 2:16 ` [Qemu-devel] [PATCH 1/6] block: use type MonitorEvent directly Wenchao Xia
2013-10-21 2:16 ` [Qemu-devel] [PATCH 2/6] qapi: rename MonitorEvent to QEvent Wenchao Xia
2013-10-21 20:38 ` Eric Blake
2013-11-01 14:02 ` Luiz Capitulino
2013-11-01 14:21 ` [Qemu-devel] [libvirt] QEMU 1.6 and drive discard parameter Gareth Bult
2013-11-04 1:59 ` [Qemu-devel] [PATCH 2/6] qapi: rename MonitorEvent to QEvent Wenchao Xia
2013-11-04 13:33 ` Luiz Capitulino
2013-11-05 2:17 ` Wenchao Xia
2013-11-05 2:51 ` Luiz Capitulino
2013-11-05 5:31 ` Wenchao Xia
2013-11-05 14:06 ` Luiz Capitulino
2013-11-06 3:25 ` Wenchao Xia [this message]
2013-10-21 2:16 ` [Qemu-devel] [PATCH 3/6] qapi: rename prefix QEVENT to Q_EVENT Wenchao Xia
2013-10-21 20:41 ` Eric Blake
2013-10-22 2:43 ` Wenchao Xia
2013-10-28 10:44 ` Paolo Bonzini
2013-10-29 5:22 ` Wenchao Xia
2013-10-29 16:09 ` Eric Blake
2013-10-30 7:26 ` Wenchao Xia
2013-11-01 14:06 ` Luiz Capitulino
2013-10-29 18:18 ` Kevin Wolf
2013-10-30 7:27 ` Wenchao Xia
2013-10-30 11:55 ` Paolo Bonzini
2013-10-31 5:26 ` Wenchao Xia
2013-10-21 2:16 ` [Qemu-devel] [PATCH 4/6] qapi: move event defines to qapi-schema.json Wenchao Xia
2013-10-21 20:45 ` Eric Blake
2013-10-21 2:16 ` [Qemu-devel] [PATCH 5/6] qapi: remove var monitor_event_names[] Wenchao Xia
2013-10-21 20:47 ` Eric Blake
2013-10-21 2:16 ` [Qemu-devel] [PATCH 6/6] qapi: add doc for QEvent Wenchao Xia
2013-10-21 21:00 ` Eric Blake
2013-10-22 3:19 ` Wenchao Xia
2013-10-22 3:46 ` Eric Blake
2013-10-23 0:37 ` Wenchao Xia
2013-10-29 23:02 ` Eric Blake
2013-10-30 7:51 ` Wenchao Xia
2013-10-22 6:55 ` Wenchao Xia
2013-10-22 7:33 ` Wenchao Xia
2013-10-22 8:58 ` Eric Blake
2013-10-25 9:16 ` [Qemu-devel] [PATCH 0/6] qapi: generate event defines automatically Wenchao Xia
2013-11-01 14:28 ` Luiz Capitulino
2013-11-04 1:54 ` Wenchao Xia
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=5279B6BE.9050809@linux.vnet.ibm.com \
--to=xiawenc@linux.vnet.ibm.com \
--cc=armbru@redhat.com \
--cc=kwolf@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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).