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(a)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