This removes the need for using monitor_is_qmp() to check the subclass type, which is an anti-pattern. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- include/monitor/monitor.h | 1 + monitor/monitor-internal.h | 5 +++++ monitor/monitor.c | 15 +++------------ monitor/qmp.c | 20 ++++++++++++++++++++ 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index a135b3a590..8cb3db677b 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -3,6 +3,7 @@ #include "block/block.h" #include "qapi/qapi-types-misc.h" +#include "qapi/qapi-emit-events.h" #include "qemu/readline.h" #include "exec/hwaddr.h" #include "qom/object.h" diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 23cef68153..763b5c9625 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -111,6 +111,11 @@ struct MonitorClass { */ int (*vprintf)(Monitor *mon, const char *fmt, va_list ap) G_GNUC_PRINTF(2, 0); + /* + * If non-NULL, the monitor is able to send event + * notifications back to the client + */ + void (*emit_event)(Monitor *mon, QAPIEvent event, QDict *qdict); }; struct Monitor { diff --git a/monitor/monitor.c b/monitor/monitor.c index 1ab04a19fa..93fe542f23 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -345,22 +345,13 @@ static inline QEMUClockType monitor_get_event_clock(void) static void monitor_qapi_event_emit(QAPIEvent event, QDict *qdict) { Monitor *mon; - MonitorQMP *qmp_mon; trace_monitor_protocol_event_emit(event, qdict); QTAILQ_FOREACH(mon, &mon_list, entry) { - if (!monitor_is_qmp(mon)) { - continue; + MonitorClass *cls = MONITOR_GET_CLASS(mon); + if (cls->emit_event) { + cls->emit_event(mon, event, qdict); } - - qmp_mon = container_of(mon, MonitorQMP, parent_obj); - { - QEMU_LOCK_GUARD(&mon->mon_lock); - if (qmp_mon->commands == &qmp_cap_negotiation_commands) { - continue; - } - } - qmp_send_response(qmp_mon, qdict); } } diff --git a/monitor/qmp.c b/monitor/qmp.c index 6e23f7f4ed..b21dfbe578 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -99,11 +99,17 @@ static void monitor_qmp_set_pretty(Object *obj, bool val, Error **errp) mon->pretty = val; } +static void monitor_qmp_emit_event(Monitor *mon, QAPIEvent event, QDict *qdict); + static void monitor_qmp_class_init(ObjectClass *cls, const void *data) { + MonitorClass *moncls = MONITOR_CLASS(cls); + object_class_property_add_bool(cls, "pretty", monitor_qmp_get_pretty, monitor_qmp_set_pretty); + + moncls->emit_event = monitor_qmp_emit_event; } static void handle_qmp_command(void *opaque, QObject *req, Error *err); @@ -117,6 +123,20 @@ static void monitor_qmp_init(Object *obj) json_message_parser_init(&mon->parser, handle_qmp_command, mon, NULL); } +static void monitor_qmp_emit_event(Monitor *mon, QAPIEvent event, QDict *qdict) +{ + MonitorQMP *qmp = MONITOR_QMP(mon); + + WITH_QEMU_LOCK_GUARD(&mon->mon_lock) { + if (qmp->commands == &qmp_cap_negotiation_commands) { + return; + } + } + + qmp_send_response(qmp, qdict); +} + + static bool qmp_oob_enabled(MonitorQMP *mon) { return mon->capab[QMP_CAPABILITY_OOB]; -- 2.54.0