[{"id":3676091,"web_url":"http://patchwork.ozlabs.org/comment/3676091/","msgid":"<admIo3uTjcH2OOWH@gallifrey>","list_archive_url":null,"date":"2026-04-10T23:32:51","subject":"Re: [PATCH 04/17] monitor: minimal conversion of monitors to QOM","submitter":{"id":86099,"url":"http://patchwork.ozlabs.org/api/people/86099/","name":"Dr. David Alan Gilbert","email":"dave@treblig.org"},"content":"* Daniel P. Berrangé (berrange@redhat.com) wrote:\n> This introduces a Monitor QOM object, with MonitorHMP and\n> MonitorQMP subclasses. This is the bare minimum conversion\n> of just the type declarations and replacing g_new/g_free\n> with object_new/object_unref.\n> \n> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>\n\nLooks OK, but I'm not that familiar with QOM, so just:\n\nAcked-by: Dr. David Alan Gilbert <dave@treblig.org>\n\n> ---\n>  include/monitor/monitor.h  | 11 ++++++++++-\n>  monitor/hmp.c              | 18 ++++++++++++++++--\n>  monitor/monitor-internal.h | 18 ++++++++++++++++--\n>  monitor/monitor.c          | 18 ++++++++++++++++--\n>  monitor/qmp-cmds.c         | 15 ++++++++-------\n>  monitor/qmp.c              | 18 ++++++++++++++++--\n>  6 files changed, 82 insertions(+), 16 deletions(-)\n> \n> diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h\n> index bfbb440550..b349b12c34 100644\n> --- a/include/monitor/monitor.h\n> +++ b/include/monitor/monitor.h\n> @@ -5,8 +5,17 @@\n>  #include \"qapi/qapi-types-misc.h\"\n>  #include \"qemu/readline.h\"\n>  #include \"exec/hwaddr.h\"\n> +#include \"qom/object.h\"\n> +\n> +#define TYPE_MONITOR \"monitor\"\n> +OBJECT_DECLARE_TYPE(Monitor, MonitorClass, MONITOR);\n> +\n> +#define TYPE_MONITOR_HMP \"monitor-hmp\"\n> +OBJECT_DECLARE_TYPE(MonitorHMP, MonitorHMPClass, MONITOR_HMP);\n> +\n> +#define TYPE_MONITOR_QMP \"monitor-qmp\"\n> +OBJECT_DECLARE_TYPE(MonitorQMP, MonitorQMPClass, MONITOR_QMP);\n>  \n> -typedef struct MonitorHMP MonitorHMP;\n>  typedef struct MonitorOptions MonitorOptions;\n>  \n>  #define QMP_REQ_QUEUE_LEN_MAX 8\n> diff --git a/monitor/hmp.c b/monitor/hmp.c\n> index 6dfeca84b5..614d9a3707 100644\n> --- a/monitor/hmp.c\n> +++ b/monitor/hmp.c\n> @@ -42,6 +42,20 @@\n>  #include \"system/block-backend.h\"\n>  #include \"trace.h\"\n>  \n> +OBJECT_DEFINE_TYPE(MonitorHMP, monitor_hmp, MONITOR_HMP, MONITOR);\n> +\n> +static void monitor_hmp_finalize(Object *obj)\n> +{\n> +}\n> +\n> +static void monitor_hmp_class_init(ObjectClass *cls, const void *data)\n> +{\n> +}\n> +\n> +static void monitor_hmp_init(Object *obj)\n> +{\n> +}\n> +\n>  static void monitor_command_cb(void *opaque, const char *cmdline,\n>                                 void *readline_opaque)\n>  {\n> @@ -1518,10 +1532,10 @@ static void monitor_readline_flush(void *opaque)\n>  \n>  void monitor_new_hmp(Chardev *chr, bool use_readline, Error **errp)\n>  {\n> -    MonitorHMP *mon = g_new0(MonitorHMP, 1);\n> +    MonitorHMP *mon = MONITOR_HMP(object_new(TYPE_MONITOR_HMP));\n>  \n>      if (!qemu_chr_fe_init(&mon->parent.chr, chr, errp)) {\n> -        g_free(mon);\n> +        object_unref(mon);\n>          return;\n>      }\n>  \n> diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h\n> index 0922588ad9..25320928a7 100644\n> --- a/monitor/monitor-internal.h\n> +++ b/monitor/monitor-internal.h\n> @@ -92,7 +92,13 @@ typedef struct HMPCommand {\n>      void (*command_completion)(ReadLineState *rs, int nb_args, const char *str);\n>  } HMPCommand;\n>  \n> +\n> +struct MonitorClass {\n> +    ObjectClass parent_class;\n> +};\n> +\n>  struct Monitor {\n> +    Object parent;\n>      CharFrontend chr;\n>      int suspend_cnt;            /* Needs to be accessed atomically */\n>      bool is_qmp;\n> @@ -118,6 +124,10 @@ struct Monitor {\n>      int reset_seen;\n>  };\n>  \n> +struct MonitorHMPClass {\n> +    MonitorClass parent_class;\n> +};\n> +\n>  struct MonitorHMP {\n>      Monitor parent;\n>      bool use_readline;\n> @@ -131,7 +141,11 @@ struct MonitorHMP {\n>      ReadLineState *rs;\n>  };\n>  \n> -typedef struct {\n> +struct MonitorQMPClass {\n> +    MonitorClass parent_class;\n> +};\n> +\n> +struct MonitorQMP {\n>      Monitor parent;\n>      JSONMessageParser parser;\n>      bool pretty;\n> @@ -151,7 +165,7 @@ typedef struct {\n>      QemuMutex qmp_queue_lock;\n>      /* Input queue that holds all the parsed QMP requests */\n>      GQueue *qmp_requests;\n> -} MonitorQMP;\n> +};\n>  \n>  /**\n>   * Is @mon a QMP monitor?\n> diff --git a/monitor/monitor.c b/monitor/monitor.c\n> index 393fb7795e..7936e2ab22 100644\n> --- a/monitor/monitor.c\n> +++ b/monitor/monitor.c\n> @@ -73,6 +73,20 @@ static GHashTable *coroutine_mon; /* Maps Coroutine* to Monitor* */\n>  MonitorList mon_list;\n>  static bool monitor_destroyed;\n>  \n> +OBJECT_DEFINE_TYPE(Monitor, monitor, MONITOR, OBJECT);\n> +\n> +static void monitor_finalize(Object *obj)\n> +{\n> +}\n> +\n> +static void monitor_class_init(ObjectClass *cls, const void *data)\n> +{\n> +}\n> +\n> +static void monitor_init(Object *obj)\n> +{\n> +}\n> +\n>  Monitor *monitor_cur(void)\n>  {\n>      Monitor *mon;\n> @@ -598,7 +612,7 @@ void monitor_list_append(Monitor *mon)\n>  \n>      if (mon) {\n>          monitor_data_destroy(mon);\n> -        g_free(mon);\n> +        object_unref(mon);\n>      }\n>  }\n>  \n> @@ -680,7 +694,7 @@ void monitor_cleanup(void)\n>          monitor_flush(mon);\n>          monitor_data_destroy(mon);\n>          qemu_mutex_lock(&monitor_lock);\n> -        g_free(mon);\n> +        object_unref(mon);\n>      }\n>      qemu_mutex_unlock(&monitor_lock);\n>  \n> diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c\n> index 191eba1b3a..d0ed241d6a 100644\n> --- a/monitor/qmp-cmds.c\n> +++ b/monitor/qmp-cmds.c\n> @@ -166,12 +166,12 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,\n>                                  int64_t cpu_index, Error **errp)\n>  {\n>      char *output = NULL;\n> -    MonitorHMP hmp = {};\n> +    MonitorHMP *hmp = MONITOR_HMP(object_new(TYPE_MONITOR_HMP));\n>  \n> -    monitor_data_init(&hmp.parent, false, true, false);\n> +    monitor_data_init(&hmp->parent, false, true, false);\n>  \n>      if (has_cpu_index) {\n> -        int ret = monitor_set_cpu(&hmp.parent, cpu_index);\n> +        int ret = monitor_set_cpu(&hmp->parent, cpu_index);\n>          if (ret < 0) {\n>              error_setg(errp, QERR_INVALID_PARAMETER_VALUE, \"cpu-index\",\n>                         \"a CPU number\");\n> @@ -179,14 +179,15 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,\n>          }\n>      }\n>  \n> -    handle_hmp_command(&hmp, command_line);\n> +    handle_hmp_command(hmp, command_line);\n>  \n> -    WITH_QEMU_LOCK_GUARD(&hmp.parent.mon_lock) {\n> -        output = g_strdup(hmp.parent.outbuf->str);\n> +    WITH_QEMU_LOCK_GUARD(&hmp->parent.mon_lock) {\n> +        output = g_strdup(hmp->parent.outbuf->str);\n>      }\n>  \n>  out:\n> -    monitor_data_destroy(&hmp.parent);\n> +    monitor_data_destroy(&hmp->parent);\n> +    object_unref(hmp);\n>      return output;\n>  }\n>  \n> diff --git a/monitor/qmp.c b/monitor/qmp.c\n> index 9caee70624..36cb078f30 100644\n> --- a/monitor/qmp.c\n> +++ b/monitor/qmp.c\n> @@ -71,6 +71,20 @@ typedef struct QMPRequest QMPRequest;\n>  \n>  QmpCommandList qmp_commands, qmp_cap_negotiation_commands;\n>  \n> +OBJECT_DEFINE_TYPE(MonitorQMP, monitor_qmp, MONITOR_QMP, MONITOR);\n> +\n> +static void monitor_qmp_finalize(Object *obj)\n> +{\n> +}\n> +\n> +static void monitor_qmp_class_init(ObjectClass *cls, const void *data)\n> +{\n> +}\n> +\n> +static void monitor_qmp_init(Object *obj)\n> +{\n> +}\n> +\n>  static bool qmp_oob_enabled(MonitorQMP *mon)\n>  {\n>      return mon->capab[QMP_CAPABILITY_OOB];\n> @@ -515,10 +529,10 @@ static void monitor_qmp_setup_handlers_bh(void *opaque)\n>  \n>  void monitor_new_qmp(Chardev *chr, bool pretty, Error **errp)\n>  {\n> -    MonitorQMP *mon = g_new0(MonitorQMP, 1);\n> +    MonitorQMP *mon = MONITOR_QMP(object_new(TYPE_MONITOR_QMP));\n>  \n>      if (!qemu_chr_fe_init(&mon->parent.chr, chr, errp)) {\n> -        g_free(mon);\n> +        object_unref(mon);\n>          return;\n>      }\n>      qemu_chr_fe_set_echo(&mon->parent.chr, true);\n> -- \n> 2.53.0\n>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=treblig.org header.i=@treblig.org header.a=rsa-sha256\n header.s=bytemarkmx header.b=FotV5q1i;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fstRT5Rw9z1yCx\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 11 Apr 2026 09:33:56 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wBLLS-0005i0-Jl; Fri, 10 Apr 2026 19:33:02 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <dg@treblig.org>)\n id 1wBLLN-0005hO-33; Fri, 10 Apr 2026 19:32:58 -0400","from mx.treblig.org ([2a00:1098:5b::1])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <dg@treblig.org>)\n id 1wBLLK-0002k1-EH; Fri, 10 Apr 2026 19:32:56 -0400","from dg by mx.treblig.org with local (Exim 4.98.2)\n (envelope-from <dg@treblig.org>) id 1wBLLH-00000007Zo9-1MvW;\n Fri, 10 Apr 2026 23:32:51 +0000"],"DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=treblig.org\n ; s=bytemarkmx;\n h=Content-Type:MIME-Version:Message-ID:Subject:From:Date:From\n :Subject; bh=YuQ4MgQGPWHlp48NbbbjWxCyQP5Q/VUz3jMzeRmXu5o=; b=FotV5q1i+TbpDdmH\n qnGCQFWuwWV9rqg6wVKUtR7J0Nu7TbLxuZfucmrVU/8aNHTXV5v/Wtc5ahoWzjeP2IPoAflesGRNr\n EKTH9ACv4d/5CsqD3sfWY6LNwUDtTcfdC03oPl2W0ysTnZRKcQC+OWsQxhkrzvp93pWAplNpeK/Tc\n mJzuTgDlNpm8kQqyctwiXPhASLx0Sjg+ugfqVqSy8QTOejU4sIQ524R/bqgpisklV3ZTOAjXlG3Wq\n V8mSNPD9wCNJoZNqNFlNmqykvOm1It/zAj/f5di1BZOfzwwQOUmiDrP6ocRe3mQIPW5KEYRBAGSEN\n RU5LC9YSgAuiw6KDTA==;","Date":"Fri, 10 Apr 2026 23:32:51 +0000","From":"\"Dr. David Alan Gilbert\" <dave@treblig.org>","To":"Daniel =?iso-8859-1?q?P=2E_Berrang=E9?= <berrange@redhat.com>","Cc":"qemu-devel@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,\n Markus Armbruster <armbru@redhat.com>,\n Christian Brauner <brauner@kernel.org>,\n Alex =?iso-8859-1?q?Benn=E9e?= <alex.bennee@linaro.org>, Philippe\n\t=?iso-8859-1?q?Mathieu-Daud=E9?= <philmd@linaro.org>,\n Fabiano Rosas <farosas@suse.de>,\n =?iso-8859-1?q?Marc-Andr=E9?= Lureau <marcandre.lureau@redhat.com>,\n Peter Xu <peterx@redhat.com>, Kevin Wolf <kwolf@redhat.com>,\n qemu-block@nongnu.org, Eric Blake <eblake@redhat.com>","Subject":"Re: [PATCH 04/17] monitor: minimal conversion of monitors to QOM","Message-ID":"<admIo3uTjcH2OOWH@gallifrey>","References":"<20260410160458.3778874-1-berrange@redhat.com>\n <20260410160458.3778874-5-berrange@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20260410160458.3778874-5-berrange@redhat.com>","X-Chocolate":"70 percent or better cocoa solids preferably","X-Operating-System":"Linux/6.12.74+deb13+1-amd64 (x86_64)","X-Uptime":"23:32:28 up 29 days, 45 min,  2 users,  load average: 0.00, 0.00,\n 0.00","User-Agent":"Mutt/2.2.13 (2024-03-09)","Received-SPF":"pass client-ip=2a00:1098:5b::1; envelope-from=dg@treblig.org;\n helo=mx.treblig.org","X-Spam_score_int":"-20","X-Spam_score":"-2.1","X-Spam_bar":"--","X-Spam_report":"(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"}}]