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 | 1 +
monitor/monitor.c | 15 +++------------
monitor/qmp.c | 19 +++++++++++++++++++
4 files changed, 24 insertions(+), 12 deletions(-)
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index b349b12c34..7b0bda42c4 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 3f05c46e88..4b5e708f14 100644
--- a/monitor/monitor-internal.h
+++ b/monitor/monitor-internal.h
@@ -98,6 +98,7 @@ struct MonitorClass {
int (*vprintf)(Monitor *mon, const char *fmt, va_list ap)
G_GNUC_PRINTF(2, 0);
+ void (*emit_event)(Monitor *mon, QAPIEvent event, QDict *qdict);
};
struct Monitor {
diff --git a/monitor/monitor.c b/monitor/monitor.c
index b51046c0c9..5f55d33476 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -327,22 +327,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);
- {
- 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 0de98b33fe..9c3e8e2678 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -85,14 +85,33 @@ static void monitor_qmp_finalize(Object *obj)
g_queue_free(mon->qmp_requests);
}
+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);
+
+ moncls->emit_event = monitor_qmp_emit_event;
}
static void monitor_qmp_init(Object *obj)
{
}
+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.53.0