This removes the need for using monitor_is_qmp() to check the
subclass type, which is an anti-pattern.
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Peter Krempa <pkrempa@redhat.com>
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 bfbeedec9b..821465f17e 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 0cb0930bf4..90cfb59c66 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -348,22 +348,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 3574b9a339..d732fff9a3 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.55.0