[PATCH 12/16] qemuMonitorJSONGetCPUModelExpansion: Don't use goto for looping

Peter Krempa pkrempa at redhat.com
Fri Dec 3 14:57:39 UTC 2021


Don't use 'goto' for looping. Extract the monitor interaction code into
a new function and restructure the logic to avoid jumping back in the
code.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_monitor_json.c | 74 +++++++++++++++++++++++-------------
 1 file changed, 47 insertions(+), 27 deletions(-)

diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index c05a2f3cff..ec13f270eb 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -5469,29 +5469,16 @@ qemuMonitorJSONParseCPUModel(const char *cpu_name,
 }


-int
-qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon,
-                                    qemuMonitorCPUModelExpansionType type,
-                                    virCPUDef *cpu,
-                                    bool migratable,
-                                    bool fail_no_props,
-                                    qemuMonitorCPUModelInfo **model_info)
+static int
+qemuMonitorJSONQueryCPUModelExpansionOne(qemuMonitor *mon,
+                                         qemuMonitorCPUModelExpansionType type,
+                                         virJSONValue **model,
+                                         virJSONValue **data)
 {
-    g_autoptr(virJSONValue) model = NULL;
     g_autoptr(virJSONValue) cmd = NULL;
     g_autoptr(virJSONValue) reply = NULL;
-    virJSONValue *data;
-    virJSONValue *cpu_model;
-    virJSONValue *cpu_props = NULL;
-    const char *cpu_name = "";
     const char *typeStr = "";

-    *model_info = NULL;
-
-    if (!(model = qemuMonitorJSONMakeCPUModel(cpu, migratable)))
-        return -1;
-
- retry:
     switch (type) {
     case QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC:
     case QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC_FULL:
@@ -5502,10 +5489,9 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon,
         typeStr = "full";
         break;
     }
-
     if (!(cmd = qemuMonitorJSONMakeCommand("query-cpu-model-expansion",
                                            "s:type", typeStr,
-                                           "a:model", &model,
+                                           "a:model", model,
                                            NULL)))
         return -1;

@@ -5522,7 +5508,35 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon,
     if (qemuMonitorJSONCheckReply(cmd, reply, VIR_JSON_TYPE_OBJECT) < 0)
         return -1;

-    data = virJSONValueObjectGetObject(reply, "return");
+    *data = virJSONValueObjectStealObject(reply, "return");
+
+    return 1;
+}
+
+
+int
+qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon,
+                                    qemuMonitorCPUModelExpansionType type,
+                                    virCPUDef *cpu,
+                                    bool migratable,
+                                    bool fail_no_props,
+                                    qemuMonitorCPUModelInfo **model_info)
+{
+    g_autoptr(virJSONValue) model = NULL;
+    g_autoptr(virJSONValue) data = NULL;
+    g_autoptr(virJSONValue) fullData = NULL;
+    virJSONValue *cpu_model;
+    virJSONValue *cpu_props = NULL;
+    const char *cpu_name = "";
+    int rc;
+
+    *model_info = NULL;
+
+    if (!(model = qemuMonitorJSONMakeCPUModel(cpu, migratable)))
+        return -1;
+
+    if ((rc = qemuMonitorJSONQueryCPUModelExpansionOne(mon, type, &model, &data)) <= 0)
+        return rc;

     if (qemuMonitorJSONParseCPUModelData(data, "query-cpu-model-expansion",
                                          fail_no_props, &cpu_model, &cpu_props,
@@ -5530,16 +5544,22 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon,
         return -1;

     /* QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC_FULL requests "full" expansion
-     * on the result of the initial "static" expansion.
-     */
+     * on the result of the initial "static" expansion. */
     if (type == QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC_FULL) {
-        if (!(model = virJSONValueCopy(cpu_model)))
+        g_autoptr(virJSONValue) fullModel = virJSONValueCopy(cpu_model);
+
+        if (!fullModel)
             return -1;

-        virJSONValueFree(cmd);
-        virJSONValueFree(reply);
         type = QEMU_MONITOR_CPU_MODEL_EXPANSION_FULL;
-        goto retry;
+
+        if ((rc = qemuMonitorJSONQueryCPUModelExpansionOne(mon, type, &fullModel, &fullData)) <= 0)
+            return rc;
+
+        if (qemuMonitorJSONParseCPUModelData(fullData, "query-cpu-model-expansion",
+                                             fail_no_props, &cpu_model, &cpu_props,
+                                             &cpu_name) < 0)
+            return -1;
     }

     return qemuMonitorJSONParseCPUModel(cpu_name, cpu_props, model_info);
-- 
2.31.1




More information about the libvir-list mailing list