[PATCH 04/17] monitor: minimal conversion of monitors to QOM

Daniel P. Berrangé posted 17 patches 1 day, 1 hour ago
Maintainers: "Marc-André Lureau" <marcandre.lureau@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, "Alex Bennée" <alex.bennee@linaro.org>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>, "Dr. David Alan Gilbert" <dave@treblig.org>, Markus Armbruster <armbru@redhat.com>, "Daniel P. Berrangé" <berrange@redhat.com>, Eric Blake <eblake@redhat.com>, Kevin Wolf <kwolf@redhat.com>
[PATCH 04/17] monitor: minimal conversion of monitors to QOM
Posted by Daniel P. Berrangé 1 day, 1 hour ago
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


Re: [PATCH 04/17] monitor: minimal conversion of monitors to QOM
Posted by Dr. David Alan Gilbert 17 hours ago
* Daniel P. Berrangé (berrange@redhat.com) wrote:
> 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>

Looks OK, but I'm not that familiar with QOM, so just:

Acked-by: Dr. David Alan Gilbert <dave@treblig.org>

> ---
>  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
> 
-- 
 -----Open up your eyes, open up your mind, open up your code -------   
/ Dr. David Alan Gilbert    |       Running GNU/Linux       | Happy  \ 
\        dave @ treblig.org |                               | In Hex /
 \ _________________________|_____ http://www.treblig.org   |_______/