Message ID | 1382321765-29052-3-git-send-email-xiawenc@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
On 10/21/2013 03:16 AM, Wenchao Xia 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(-) Reviewed-by: Eric Blake <eblake@redhat.com>
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. > QEVENT_SHUTDOWN, > QEVENT_RESET, > QEVENT_POWERDOWN, > @@ -54,11 +54,11 @@ typedef enum MonitorEvent { > * defining new events here */ > > QEVENT_MAX, > -} MonitorEvent; > +} QEvent; > > int monitor_cur_is_qmp(void); > > -void monitor_protocol_event(MonitorEvent event, QObject *data); > +void monitor_protocol_event(QEvent event, QObject *data); > void monitor_init(CharDriverState *chr, int flags); > > int monitor_suspend(Monitor *mon); > diff --git a/monitor.c b/monitor.c > index 74f3f1b..9377834 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -175,7 +175,7 @@ typedef struct MonitorControl { > * instance. > */ > typedef struct MonitorEventState { > - MonitorEvent event; /* Event being tracked */ > + QEvent event; /* Event being tracked */ > int64_t rate; /* Period over which to throttle. 0 to disable */ > int64_t last; /* Time at which event was last emitted */ > QEMUTimer *timer; /* Timer for handling delayed events */ > @@ -517,7 +517,7 @@ QemuMutex monitor_event_state_lock; > * Emits the event to every monitor instance > */ > static void > -monitor_protocol_event_emit(MonitorEvent event, > +monitor_protocol_event_emit(QEvent event, > QObject *data) > { > Monitor *mon; > @@ -536,7 +536,7 @@ monitor_protocol_event_emit(MonitorEvent event, > * applying any rate limiting if required. > */ > static void > -monitor_protocol_event_queue(MonitorEvent event, > +monitor_protocol_event_queue(QEvent event, > QObject *data) > { > MonitorEventState *evstate; > @@ -614,7 +614,7 @@ static void monitor_protocol_event_handler(void *opaque) > * milliseconds > */ > static void > -monitor_protocol_event_throttle(MonitorEvent event, > +monitor_protocol_event_throttle(QEvent event, > int64_t rate) > { > MonitorEventState *evstate; > @@ -650,7 +650,7 @@ static void monitor_protocol_event_init(void) > * > * Event-specific data can be emitted through the (optional) 'data' parameter. > */ > -void monitor_protocol_event(MonitorEvent event, QObject *data) > +void monitor_protocol_event(QEvent event, QObject *data) > { > QDict *qmp; > const char *event_name; > @@ -1067,7 +1067,7 @@ CommandInfoList *qmp_query_commands(Error **errp) > EventInfoList *qmp_query_events(Error **errp) > { > EventInfoList *info, *ev_list = NULL; > - MonitorEvent e; > + QEvent e; > > for (e = 0 ; e < QEVENT_MAX ; e++) { > const char *event_name = monitor_event_names[e]; > diff --git a/stubs/mon-protocol-event.c b/stubs/mon-protocol-event.c > index 0946e94..e769729 100644 > --- a/stubs/mon-protocol-event.c > +++ b/stubs/mon-protocol-event.c > @@ -1,6 +1,6 @@ > #include "qemu-common.h" > #include "monitor/monitor.h" > > -void monitor_protocol_event(MonitorEvent event, QObject *data) > +void monitor_protocol_event(QEvent event, QObject *data) > { > } > diff --git a/ui/vnc.c b/ui/vnc.c > index 5601cc3..47fda54 100644 > --- a/ui/vnc.c > +++ b/ui/vnc.c > @@ -275,7 +275,7 @@ static void vnc_client_cache_addr(VncState *client) > client->info = QOBJECT(qdict); > } > > -static void vnc_qmp_event(VncState *vs, MonitorEvent event) > +static void vnc_qmp_event(VncState *vs, QEvent event) > { > QDict *server; > QObject *data;
Hey guys, I've just rolled out Qemu 1.6 to fix problems I've been having, which worked fine .. but I've now lost discard support which is a problem. Is there an easy / quick fix for this without digging through other people's code? I'm happy to compile up whatever is necessary, I just need the "discard" option to work for Libvirt / Qemu 1.6 ... tia Gareth. On Thu, Oct 31, 2013 at 04:35:43PM +0800, Amos Kong wrote: > On Thu, Oct 31, 2013 at 04:07:15PM +0800, Osier Yang wrote: > > CC to Amos. > > > > On 30/10/13 16:19, whitearchey wrote: > > > > > >In QEMU 1.6 parameters of 'drive' option were removed: > > > > > >QemuOptsList qemu_drive_opts = { > > > .name = "drive", > > > .head = QTAILQ_HEAD_INITIALIZER(qemu_drive_opts.head), > > > .desc = { > > > /* > > > * no elements => accept any params > > > * validation will happen later > > > */ > > > { /* end of list */ } > > > }, > > >}; > > > > > >But libvirt still checks for QEMU_CAPS_DRIVE_DISCARD using QMP > > >query-command-line-options: > > > > > >static struct virQEMUCapsCommandLineProps virQEMUCapsCommandLine[] = { > > > { "machine", "mem-merge", QEMU_CAPS_MEM_MERGE }, > > > { "drive", "discard", QEMU_CAPS_DRIVE_DISCARD }, > > > { "realtime", "mlock", QEMU_CAPS_MLOCK }, > > >}; > > >... > > >qemuMonitorGetCommandLineOptionParameters(mon, > > >virQEMUCapsCommandLine[i].option, &values) > > > > > >So, when I try to use discard option in domain xml I get this error: > > > > > >error : qemuBuildDriveStr:3986 : unsupported configuration: > > >discard is not supported by this QEMU binary > > > > > > > It's a qemu problem, the command "query-command-line-options" should > > keep working > > after the structures were changed for any option, in this case, all > > the option descs were > > moved to "qemu_common_drive_opts" instead. > > { 'execute': 'query-command-line-options', 'arguments': { 'option': 'drive' } > } > > { > "return": [ > { > "parameters": [ > ], > "option": "drive" > } > ] > } > > It returns a NULL parameters list, that's true, some error handling > should be done by libvirt.
于 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? { 'Union': 'QMPEvent', 'base': 'QMPEventBase', 'discriminator': 'event', 'data': { 'SHUTDOWN' : 'EventShutdown', 'POWERDOWN' : 'EventPowerdown', 'RESET' : 'EventReset' } } I used "Event" as union name before, but I am afraid it is too generic, so changed it as QMPEvent. >> QEVENT_SHUTDOWN, >> QEVENT_RESET, >> QEVENT_POWERDOWN, >> @@ -54,11 +54,11 @@ typedef enum MonitorEvent { >> * defining new events here */ >> >> QEVENT_MAX, >> -} MonitorEvent; >> +} QEvent; >> >> int monitor_cur_is_qmp(void); >> >> -void monitor_protocol_event(MonitorEvent event, QObject *data); >> +void monitor_protocol_event(QEvent event, QObject *data); >> void monitor_init(CharDriverState *chr, int flags); >> >> int monitor_suspend(Monitor *mon); >> diff --git a/monitor.c b/monitor.c >> index 74f3f1b..9377834 100644 >> --- a/monitor.c >> +++ b/monitor.c >> @@ -175,7 +175,7 @@ typedef struct MonitorControl { >> * instance. >> */ >> typedef struct MonitorEventState { >> - MonitorEvent event; /* Event being tracked */ >> + QEvent event; /* Event being tracked */ >> int64_t rate; /* Period over which to throttle. 0 to disable */ >> int64_t last; /* Time at which event was last emitted */ >> QEMUTimer *timer; /* Timer for handling delayed events */ >> @@ -517,7 +517,7 @@ QemuMutex monitor_event_state_lock; >> * Emits the event to every monitor instance >> */ >> static void >> -monitor_protocol_event_emit(MonitorEvent event, >> +monitor_protocol_event_emit(QEvent event, >> QObject *data) >> { >> Monitor *mon; >> @@ -536,7 +536,7 @@ monitor_protocol_event_emit(MonitorEvent event, >> * applying any rate limiting if required. >> */ >> static void >> -monitor_protocol_event_queue(MonitorEvent event, >> +monitor_protocol_event_queue(QEvent event, >> QObject *data) >> { >> MonitorEventState *evstate; >> @@ -614,7 +614,7 @@ static void monitor_protocol_event_handler(void *opaque) >> * milliseconds >> */ >> static void >> -monitor_protocol_event_throttle(MonitorEvent event, >> +monitor_protocol_event_throttle(QEvent event, >> int64_t rate) >> { >> MonitorEventState *evstate; >> @@ -650,7 +650,7 @@ static void monitor_protocol_event_init(void) >> * >> * Event-specific data can be emitted through the (optional) 'data' parameter. >> */ >> -void monitor_protocol_event(MonitorEvent event, QObject *data) >> +void monitor_protocol_event(QEvent event, QObject *data) >> { >> QDict *qmp; >> const char *event_name; >> @@ -1067,7 +1067,7 @@ CommandInfoList *qmp_query_commands(Error **errp) >> EventInfoList *qmp_query_events(Error **errp) >> { >> EventInfoList *info, *ev_list = NULL; >> - MonitorEvent e; >> + QEvent e; >> >> for (e = 0 ; e < QEVENT_MAX ; e++) { >> const char *event_name = monitor_event_names[e]; >> diff --git a/stubs/mon-protocol-event.c b/stubs/mon-protocol-event.c >> index 0946e94..e769729 100644 >> --- a/stubs/mon-protocol-event.c >> +++ b/stubs/mon-protocol-event.c >> @@ -1,6 +1,6 @@ >> #include "qemu-common.h" >> #include "monitor/monitor.h" >> >> -void monitor_protocol_event(MonitorEvent event, QObject *data) >> +void monitor_protocol_event(QEvent event, QObject *data) >> { >> } >> diff --git a/ui/vnc.c b/ui/vnc.c >> index 5601cc3..47fda54 100644 >> --- a/ui/vnc.c >> +++ b/ui/vnc.c >> @@ -275,7 +275,7 @@ static void vnc_client_cache_addr(VncState *client) >> client->info = QOBJECT(qdict); >> } >> >> -static void vnc_qmp_event(VncState *vs, MonitorEvent event) >> +static void vnc_qmp_event(VncState *vs, QEvent event) >> { >> QDict *server; >> QObject *data; >
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.
于 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); We may need to make *e as opaque and handly writing code for "switch ", but with union, the generated code would do that for us, so I think union is better.
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.
于 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. 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. 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.
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.
于 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. >
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 { QEVENT_SHUTDOWN, QEVENT_RESET, QEVENT_POWERDOWN, @@ -54,11 +54,11 @@ typedef enum MonitorEvent { * defining new events here */ QEVENT_MAX, -} MonitorEvent; +} QEvent; int monitor_cur_is_qmp(void); -void monitor_protocol_event(MonitorEvent event, QObject *data); +void monitor_protocol_event(QEvent event, QObject *data); void monitor_init(CharDriverState *chr, int flags); int monitor_suspend(Monitor *mon); diff --git a/monitor.c b/monitor.c index 74f3f1b..9377834 100644 --- a/monitor.c +++ b/monitor.c @@ -175,7 +175,7 @@ typedef struct MonitorControl { * instance. */ typedef struct MonitorEventState { - MonitorEvent event; /* Event being tracked */ + QEvent event; /* Event being tracked */ int64_t rate; /* Period over which to throttle. 0 to disable */ int64_t last; /* Time at which event was last emitted */ QEMUTimer *timer; /* Timer for handling delayed events */ @@ -517,7 +517,7 @@ QemuMutex monitor_event_state_lock; * Emits the event to every monitor instance */ static void -monitor_protocol_event_emit(MonitorEvent event, +monitor_protocol_event_emit(QEvent event, QObject *data) { Monitor *mon; @@ -536,7 +536,7 @@ monitor_protocol_event_emit(MonitorEvent event, * applying any rate limiting if required. */ static void -monitor_protocol_event_queue(MonitorEvent event, +monitor_protocol_event_queue(QEvent event, QObject *data) { MonitorEventState *evstate; @@ -614,7 +614,7 @@ static void monitor_protocol_event_handler(void *opaque) * milliseconds */ static void -monitor_protocol_event_throttle(MonitorEvent event, +monitor_protocol_event_throttle(QEvent event, int64_t rate) { MonitorEventState *evstate; @@ -650,7 +650,7 @@ static void monitor_protocol_event_init(void) * * Event-specific data can be emitted through the (optional) 'data' parameter. */ -void monitor_protocol_event(MonitorEvent event, QObject *data) +void monitor_protocol_event(QEvent event, QObject *data) { QDict *qmp; const char *event_name; @@ -1067,7 +1067,7 @@ CommandInfoList *qmp_query_commands(Error **errp) EventInfoList *qmp_query_events(Error **errp) { EventInfoList *info, *ev_list = NULL; - MonitorEvent e; + QEvent e; for (e = 0 ; e < QEVENT_MAX ; e++) { const char *event_name = monitor_event_names[e]; diff --git a/stubs/mon-protocol-event.c b/stubs/mon-protocol-event.c index 0946e94..e769729 100644 --- a/stubs/mon-protocol-event.c +++ b/stubs/mon-protocol-event.c @@ -1,6 +1,6 @@ #include "qemu-common.h" #include "monitor/monitor.h" -void monitor_protocol_event(MonitorEvent event, QObject *data) +void monitor_protocol_event(QEvent event, QObject *data) { } diff --git a/ui/vnc.c b/ui/vnc.c index 5601cc3..47fda54 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -275,7 +275,7 @@ static void vnc_client_cache_addr(VncState *client) client->info = QOBJECT(qdict); } -static void vnc_qmp_event(VncState *vs, MonitorEvent event) +static void vnc_qmp_event(VncState *vs, QEvent event) { QDict *server; QObject *data;
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(-)