qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Luiz Capitulino <lcapitulino@redhat.com>
To: Wenchao Xia <xiawenc@linux.vnet.ibm.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: Tue, 5 Nov 2013 09:06:12 -0500	[thread overview]
Message-ID: <20131105090612.010a6e46@redhat.com> (raw)
In-Reply-To: <5278829D.90905@linux.vnet.ibm.com>

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.

>    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.

  reply	other threads:[~2013-11-05 14:06 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 [this message]
2013-11-06  3:25                 ` Wenchao Xia
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=20131105090612.010a6e46@redhat.com \
    --to=lcapitulino@redhat.com \
    --cc=armbru@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=xiawenc@linux.vnet.ibm.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).