@samitouri / QOSamiQemu / commits / f51c560959

monitor: use class methods for monitor_vprintf

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> Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org> Tested-by: Peter Krempa <pkrempa@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Message-ID: <20260706135824.2623960-13-berrange@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Daniel P. Berrangé committed Jul 6, 2026 at 14:58 UTC f51c56095921bd643e8b9bf21a668df768ef0847
3 files changed +24 -7
monitor/hmp.c
+13
@@ -68,11 +68,18 @@ static void monitor_hmp_set_readline(Object *obj, bool val, Error **errp)
68 mon->use_readline = val;
69 }
70
71 +int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap)
72 + G_GNUC_PRINTF(2, 0);
73 +
74 static void monitor_hmp_class_init(ObjectClass *cls, const void *data)
75 {
76 + MonitorClass *moncls = MONITOR_CLASS(cls);
77 +
78 object_class_property_add_bool(cls, "readline",
79 monitor_hmp_get_readline,
80 monitor_hmp_set_readline);
81 +
82 + moncls->vprintf = monitor_hmp_vprintf;
83 }
84
85 static void monitor_hmp_init(Object *obj)
@@ -87,6 +94,12 @@ static void monitor_hmp_init(Object *obj)
94 hmp->use_readline = true;
95 }
96
97 +int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap)
98 +{
99 + g_autofree char *buf = g_strdup_vprintf(fmt, ap);
100 + return monitor_puts(mon, buf);
101 +}
102 +
103 static void monitor_command_cb(void *opaque, const char *cmdline,
104 void *readline_opaque)
105 {
monitor/monitor-internal.h
+7
@@ -104,6 +104,13 @@ typedef struct HMPCommand {
104
105 struct MonitorClass {
106 ObjectClass parent_class;
107 +
108 + /*
109 + * If non-NULL, the monitor is able to print messages
110 + * for attention of the client user
111 + */
112 + int (*vprintf)(Monitor *mon, const char *fmt, va_list ap)
113 + G_GNUC_PRINTF(2, 0);
114 };
115
116 struct Monitor {
monitor/monitor.c
+4 -7
@@ -264,21 +264,18 @@ int monitor_puts(Monitor *mon, const char *str)
264
265 int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
266 {
267 - char *buf;
268 - int n;
267 + MonitorClass *moncls;
268
269 if (!mon) {
270 return -1;
271 }
272
274 - if (monitor_is_qmp(mon)) {
273 + moncls = MONITOR_GET_CLASS(mon);
274 + if (!moncls->vprintf) {
275 return -1;
276 }
277
278 - buf = g_strdup_vprintf(fmt, ap);
279 - n = monitor_puts(mon, buf);
280 - g_free(buf);
281 - return n;
278 + return moncls->vprintf(mon, fmt, ap);
279 }
280
281 int monitor_printf(Monitor *mon, const char *fmt, ...)