From: "Daniel P. Berrangé" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Christian Brauner" <brauner@kernel.org>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Fabiano Rosas" <farosas@suse.de>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Peter Xu" <peterx@redhat.com>, "Kevin Wolf" <kwolf@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
qemu-block@nongnu.org,
"Dr. David Alan Gilbert" <dave@treblig.org>,
"Eric Blake" <eblake@redhat.com>
Subject: [PATCH 04/17] monitor: minimal conversion of monitors to QOM
Date: Fri, 10 Apr 2026 17:04:45 +0100 [thread overview]
Message-ID: <20260410160458.3778874-5-berrange@redhat.com> (raw)
In-Reply-To: <20260410160458.3778874-1-berrange@redhat.com>
This introduces a Monitor QOM object, with MonitorHMP and
MonitorQMP subclasses. This is the bare minimum conversion
of just the type declarations and replacing g_new/g_free
with object_new/object_unref.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
include/monitor/monitor.h | 11 ++++++++++-
monitor/hmp.c | 18 ++++++++++++++++--
monitor/monitor-internal.h | 18 ++++++++++++++++--
monitor/monitor.c | 18 ++++++++++++++++--
monitor/qmp-cmds.c | 15 ++++++++-------
monitor/qmp.c | 18 ++++++++++++++++--
6 files changed, 82 insertions(+), 16 deletions(-)
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index bfbb440550..b349b12c34 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -5,8 +5,17 @@
#include "qapi/qapi-types-misc.h"
#include "qemu/readline.h"
#include "exec/hwaddr.h"
+#include "qom/object.h"
+
+#define TYPE_MONITOR "monitor"
+OBJECT_DECLARE_TYPE(Monitor, MonitorClass, MONITOR);
+
+#define TYPE_MONITOR_HMP "monitor-hmp"
+OBJECT_DECLARE_TYPE(MonitorHMP, MonitorHMPClass, MONITOR_HMP);
+
+#define TYPE_MONITOR_QMP "monitor-qmp"
+OBJECT_DECLARE_TYPE(MonitorQMP, MonitorQMPClass, MONITOR_QMP);
-typedef struct MonitorHMP MonitorHMP;
typedef struct MonitorOptions MonitorOptions;
#define QMP_REQ_QUEUE_LEN_MAX 8
diff --git a/monitor/hmp.c b/monitor/hmp.c
index 6dfeca84b5..614d9a3707 100644
--- a/monitor/hmp.c
+++ b/monitor/hmp.c
@@ -42,6 +42,20 @@
#include "system/block-backend.h"
#include "trace.h"
+OBJECT_DEFINE_TYPE(MonitorHMP, monitor_hmp, MONITOR_HMP, MONITOR);
+
+static void monitor_hmp_finalize(Object *obj)
+{
+}
+
+static void monitor_hmp_class_init(ObjectClass *cls, const void *data)
+{
+}
+
+static void monitor_hmp_init(Object *obj)
+{
+}
+
static void monitor_command_cb(void *opaque, const char *cmdline,
void *readline_opaque)
{
@@ -1518,10 +1532,10 @@ static void monitor_readline_flush(void *opaque)
void monitor_new_hmp(Chardev *chr, bool use_readline, Error **errp)
{
- MonitorHMP *mon = g_new0(MonitorHMP, 1);
+ MonitorHMP *mon = MONITOR_HMP(object_new(TYPE_MONITOR_HMP));
if (!qemu_chr_fe_init(&mon->parent.chr, chr, errp)) {
- g_free(mon);
+ object_unref(mon);
return;
}
diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h
index 0922588ad9..25320928a7 100644
--- a/monitor/monitor-internal.h
+++ b/monitor/monitor-internal.h
@@ -92,7 +92,13 @@ typedef struct HMPCommand {
void (*command_completion)(ReadLineState *rs, int nb_args, const char *str);
} HMPCommand;
+
+struct MonitorClass {
+ ObjectClass parent_class;
+};
+
struct Monitor {
+ Object parent;
CharFrontend chr;
int suspend_cnt; /* Needs to be accessed atomically */
bool is_qmp;
@@ -118,6 +124,10 @@ struct Monitor {
int reset_seen;
};
+struct MonitorHMPClass {
+ MonitorClass parent_class;
+};
+
struct MonitorHMP {
Monitor parent;
bool use_readline;
@@ -131,7 +141,11 @@ struct MonitorHMP {
ReadLineState *rs;
};
-typedef struct {
+struct MonitorQMPClass {
+ MonitorClass parent_class;
+};
+
+struct MonitorQMP {
Monitor parent;
JSONMessageParser parser;
bool pretty;
@@ -151,7 +165,7 @@ typedef struct {
QemuMutex qmp_queue_lock;
/* Input queue that holds all the parsed QMP requests */
GQueue *qmp_requests;
-} MonitorQMP;
+};
/**
* Is @mon a QMP monitor?
diff --git a/monitor/monitor.c b/monitor/monitor.c
index 393fb7795e..7936e2ab22 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -73,6 +73,20 @@ static GHashTable *coroutine_mon; /* Maps Coroutine* to Monitor* */
MonitorList mon_list;
static bool monitor_destroyed;
+OBJECT_DEFINE_TYPE(Monitor, monitor, MONITOR, OBJECT);
+
+static void monitor_finalize(Object *obj)
+{
+}
+
+static void monitor_class_init(ObjectClass *cls, const void *data)
+{
+}
+
+static void monitor_init(Object *obj)
+{
+}
+
Monitor *monitor_cur(void)
{
Monitor *mon;
@@ -598,7 +612,7 @@ void monitor_list_append(Monitor *mon)
if (mon) {
monitor_data_destroy(mon);
- g_free(mon);
+ object_unref(mon);
}
}
@@ -680,7 +694,7 @@ void monitor_cleanup(void)
monitor_flush(mon);
monitor_data_destroy(mon);
qemu_mutex_lock(&monitor_lock);
- g_free(mon);
+ object_unref(mon);
}
qemu_mutex_unlock(&monitor_lock);
diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
index 191eba1b3a..d0ed241d6a 100644
--- a/monitor/qmp-cmds.c
+++ b/monitor/qmp-cmds.c
@@ -166,12 +166,12 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
int64_t cpu_index, Error **errp)
{
char *output = NULL;
- MonitorHMP hmp = {};
+ MonitorHMP *hmp = MONITOR_HMP(object_new(TYPE_MONITOR_HMP));
- monitor_data_init(&hmp.parent, false, true, false);
+ monitor_data_init(&hmp->parent, false, true, false);
if (has_cpu_index) {
- int ret = monitor_set_cpu(&hmp.parent, cpu_index);
+ int ret = monitor_set_cpu(&hmp->parent, cpu_index);
if (ret < 0) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
"a CPU number");
@@ -179,14 +179,15 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
}
}
- handle_hmp_command(&hmp, command_line);
+ handle_hmp_command(hmp, command_line);
- WITH_QEMU_LOCK_GUARD(&hmp.parent.mon_lock) {
- output = g_strdup(hmp.parent.outbuf->str);
+ WITH_QEMU_LOCK_GUARD(&hmp->parent.mon_lock) {
+ output = g_strdup(hmp->parent.outbuf->str);
}
out:
- monitor_data_destroy(&hmp.parent);
+ monitor_data_destroy(&hmp->parent);
+ object_unref(hmp);
return output;
}
diff --git a/monitor/qmp.c b/monitor/qmp.c
index 9caee70624..36cb078f30 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -71,6 +71,20 @@ typedef struct QMPRequest QMPRequest;
QmpCommandList qmp_commands, qmp_cap_negotiation_commands;
+OBJECT_DEFINE_TYPE(MonitorQMP, monitor_qmp, MONITOR_QMP, MONITOR);
+
+static void monitor_qmp_finalize(Object *obj)
+{
+}
+
+static void monitor_qmp_class_init(ObjectClass *cls, const void *data)
+{
+}
+
+static void monitor_qmp_init(Object *obj)
+{
+}
+
static bool qmp_oob_enabled(MonitorQMP *mon)
{
return mon->capab[QMP_CAPABILITY_OOB];
@@ -515,10 +529,10 @@ static void monitor_qmp_setup_handlers_bh(void *opaque)
void monitor_new_qmp(Chardev *chr, bool pretty, Error **errp)
{
- MonitorQMP *mon = g_new0(MonitorQMP, 1);
+ MonitorQMP *mon = MONITOR_QMP(object_new(TYPE_MONITOR_QMP));
if (!qemu_chr_fe_init(&mon->parent.chr, chr, errp)) {
- g_free(mon);
+ object_unref(mon);
return;
}
qemu_chr_fe_set_echo(&mon->parent.chr, true);
--
2.53.0
next prev parent reply other threads:[~2026-04-10 16:06 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-10 16:04 [PATCH RFC 00/17] monitor: turn QMP and HMP into QOM objects Daniel P. Berrangé
2026-04-10 16:04 ` [PATCH 01/17] monitor: replace 'common' with 'parent' in MonitorHMP Daniel P. Berrangé
2026-04-10 21:05 ` Dr. David Alan Gilbert
2026-04-10 16:04 ` [PATCH 02/17] monitor: replace 'common' with 'parent' in MonitorQMP Daniel P. Berrangé
2026-04-14 15:15 ` Mark Cave-Ayland
2026-04-14 15:25 ` Daniel P. Berrangé
2026-04-14 17:54 ` Dr. David Alan Gilbert
2026-04-10 16:04 ` [PATCH 03/17] monitor: rename monitor_init* to monitor_new* Daniel P. Berrangé
2026-04-10 22:57 ` Dr. David Alan Gilbert
2026-04-10 16:04 ` Daniel P. Berrangé [this message]
2026-04-10 23:32 ` [PATCH 04/17] monitor: minimal conversion of monitors to QOM Dr. David Alan Gilbert
2026-04-10 16:04 ` [PATCH 05/17] monitor: remove 'skip_flush' field Daniel P. Berrangé
2026-04-13 1:28 ` Dr. David Alan Gilbert
2026-04-13 10:00 ` Daniel P. Berrangé
2026-04-13 15:22 ` Dr. David Alan Gilbert
2026-04-10 16:04 ` [PATCH 06/17] monitor: move monitor_data_(init|destroy) into QOM init/finalize Daniel P. Berrangé
2026-04-10 16:04 ` [PATCH 07/17] monitor: use class methods for monitor_vprintf Daniel P. Berrangé
2026-04-13 1:32 ` Dr. David Alan Gilbert
2026-04-10 16:04 ` [PATCH 08/17] monitor: use class methods for monitor_qapi_event_emit Daniel P. Berrangé
2026-04-10 16:04 ` [PATCH 09/17] monitor: use class methods for monitor_accept_input Daniel P. Berrangé
2026-04-13 17:43 ` Dr. David Alan Gilbert
2026-04-10 16:04 ` [PATCH 10/17] monitor: use dynamic cast in monitor_qmp_requests_pop_any_with_lock Daniel P. Berrangé
2026-04-10 16:04 ` [PATCH 11/17] util: use dynamic cast in error vreport Daniel P. Berrangé
2026-04-10 16:04 ` [PATCH 12/17] monitor: drop unused monitor_cur_is_qmp Daniel P. Berrangé
2026-04-10 16:04 ` [PATCH 13/17] monitor: use dynamic cast in QMP commands Daniel P. Berrangé
2026-04-10 16:04 ` [PATCH 14/17] monitor: use dynamic cast in monitor_is_hmp_non_interactive Daniel P. Berrangé
2026-04-10 16:04 ` [PATCH 15/17] monitor: drop unused monitor_is_qmp method Daniel P. Berrangé
2026-04-10 16:04 ` [PATCH 16/17] monitor: eliminate monitor_is_hmp_non_interactive method Daniel P. Berrangé
2026-04-13 22:47 ` Dr. David Alan Gilbert
2026-04-10 16:04 ` [PATCH 17/17] FIXME: monitor: implement "user creatable" interface Daniel P. Berrangé
2026-04-27 6:35 ` [PATCH RFC 00/17] monitor: turn QMP and HMP into QOM objects Markus Armbruster
2026-04-27 7:04 ` Daniel P. Berrangé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260410160458.3778874-5-berrange@redhat.com \
--to=berrange@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=armbru@redhat.com \
--cc=brauner@kernel.org \
--cc=dave@treblig.org \
--cc=eblake@redhat.com \
--cc=farosas@suse.de \
--cc=kwolf@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.