It is a container for a CPU models list (qemuMonitorCPUDefInfo) and a number of elements in this list.
Signed-off-by: Jiri Denemark <jdene...@redhat.com> Reviewed-by: Ján Tomko <jto...@redhat.com> --- Notes: Version 2: - v1 reviewed by Ján Tomko, but the patch had to be changed because of the previous patch Version 3: - new functions use glib src/qemu/qemu_capabilities.c | 30 +++++++++------------ src/qemu/qemu_monitor.c | 36 +++++++++++++++++++------ src/qemu/qemu_monitor.h | 14 ++++++++-- src/qemu/qemu_monitor_json.c | 52 ++++++++++++++---------------------- src/qemu/qemu_monitor_json.h | 2 +- tests/qemumonitorjsontest.c | 38 ++++++++++---------------- 6 files changed, 88 insertions(+), 84 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index c88cf2f3b0..e8b857b8cf 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2447,18 +2447,17 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, virArch arch, virDomainCapsCPUModelsPtr *cpuModels) { + g_autoptr(qemuMonitorCPUDefs) defs = NULL; virDomainCapsCPUModelsPtr models = NULL; - qemuMonitorCPUDefInfoPtr *cpus = NULL; - int ncpus = 0; size_t i; int ret = -1; *cpuModels = NULL; - if ((ncpus = qemuMonitorGetCPUDefinitions(mon, &cpus)) < 0) + if (qemuMonitorGetCPUDefinitions(mon, &defs) < 0) return -1; - if (ncpus == 0) { + if (!defs) { ret = 0; goto cleanup; } @@ -2473,29 +2472,29 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, goto cleanup; for (name = libvirtModels; name && *name; name++) { - for (i = 0; i < ncpus; i++) { - if (STRCASENEQ(cpus[i]->name, *name)) + for (i = 0; i < defs->ncpus; i++) { + if (STRCASENEQ(defs->cpus[i]->name, *name)) continue; - VIR_FREE(cpus[i]->name); - cpus[i]->name = g_strdup(*name); + VIR_FREE(defs->cpus[i]->name); + defs->cpus[i]->name = g_strdup(*name); } } } - if (!(models = virDomainCapsCPUModelsNew(ncpus))) + if (!(models = virDomainCapsCPUModelsNew(defs->ncpus))) goto cleanup; - for (i = 0; i < ncpus; i++) { + for (i = 0; i < defs->ncpus; i++) { virDomainCapsCPUUsable usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; - if (cpus[i]->usable == VIR_TRISTATE_BOOL_YES) + if (defs->cpus[i]->usable == VIR_TRISTATE_BOOL_YES) usable = VIR_DOMCAPS_CPU_USABLE_YES; - else if (cpus[i]->usable == VIR_TRISTATE_BOOL_NO) + else if (defs->cpus[i]->usable == VIR_TRISTATE_BOOL_NO) usable = VIR_DOMCAPS_CPU_USABLE_NO; - if (virDomainCapsCPUModelsAddSteal(models, &cpus[i]->name, usable, - &cpus[i]->blockers) < 0) + if (virDomainCapsCPUModelsAddSteal(models, &defs->cpus[i]->name, usable, + &defs->cpus[i]->blockers) < 0) goto cleanup; } @@ -2503,9 +2502,6 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, ret = 0; cleanup: - for (i = 0; i < ncpus; i++) - qemuMonitorCPUDefInfoFree(cpus[i]); - VIR_FREE(cpus); virObjectUnref(models); return ret; } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 224d6a76c9..44c8ba2adb 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3553,25 +3553,45 @@ qemuMonitorMachineInfoFree(qemuMonitorMachineInfoPtr machine) int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus) + qemuMonitorCPUDefsPtr *cpuDefs) { - VIR_DEBUG("cpus=%p", cpus); + VIR_DEBUG("cpuDefs=%p", cpuDefs); QEMU_CHECK_MONITOR(mon); - return qemuMonitorJSONGetCPUDefinitions(mon, cpus); + return qemuMonitorJSONGetCPUDefinitions(mon, cpuDefs); } void -qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu) +qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs) { - if (!cpu) + size_t i; + + if (!defs) return; - virStringListFree(cpu->blockers); - VIR_FREE(cpu->name); - VIR_FREE(cpu); + for (i = 0; i < defs->ncpus; i++) { + g_strfreev(defs->cpus[i]->blockers); + g_free(defs->cpus[i]->name); + g_free(defs->cpus[i]); + } + + g_free(defs->cpus); + g_free(defs); +} + + +qemuMonitorCPUDefsPtr +qemuMonitorCPUDefsNew(size_t count) +{ + g_autoptr(qemuMonitorCPUDefs) defs = NULL; + + defs = g_new0(qemuMonitorCPUDefs, 1); + defs->cpus = g_new0(qemuMonitorCPUDefInfoPtr, count); + defs->ncpus = count; + + return g_steal_pointer(&defs); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index c4b7196794..00f4dd437f 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1112,9 +1112,19 @@ struct _qemuMonitorCPUDefInfo { char **blockers; /* NULL-terminated string list */ }; +typedef struct _qemuMonitorCPUDefs qemuMonitorCPUDefs; +typedef qemuMonitorCPUDefs *qemuMonitorCPUDefsPtr; +struct _qemuMonitorCPUDefs { + size_t ncpus; + qemuMonitorCPUDefInfoPtr *cpus; +}; + int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus); -void qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu); + qemuMonitorCPUDefsPtr *cpuDefs); +qemuMonitorCPUDefsPtr qemuMonitorCPUDefsNew(size_t count); +void qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuMonitorCPUDefs, qemuMonitorCPUDefsFree); + typedef enum { QEMU_MONITOR_CPU_PROPERTY_BOOLEAN, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index c330026692..8f04be79c1 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5575,56 +5575,53 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon, int qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus) + qemuMonitorCPUDefsPtr *cpuDefs) { - int ret = -1; + g_autoptr(qemuMonitorCPUDefs) defs = NULL; g_autoptr(virJSONValue) cmd = NULL; g_autoptr(virJSONValue) reply = NULL; virJSONValuePtr data; - qemuMonitorCPUDefInfoPtr *cpulist = NULL; - size_t n = 0; + size_t ncpus; size_t i; - *cpus = NULL; + *cpuDefs = NULL; if (!(cmd = qemuMonitorJSONMakeCommand("query-cpu-definitions", NULL))) return -1; if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) - goto cleanup; + return -1; /* Urgh, some QEMU architectures have the query-cpu-definitions * command, but return 'GenericError' with string "Not supported", * instead of simply omitting the command entirely :-( */ - if (qemuMonitorJSONHasError(reply, "GenericError")) { - ret = 0; - goto cleanup; - } + if (qemuMonitorJSONHasError(reply, "GenericError")) + return 0; if (qemuMonitorJSONCheckReply(cmd, reply, VIR_JSON_TYPE_ARRAY) < 0) - goto cleanup; + return -1; data = virJSONValueObjectGetArray(reply, "return"); - n = virJSONValueArraySize(data); + ncpus = virJSONValueArraySize(data); - if (VIR_ALLOC_N(cpulist, n) < 0) - goto cleanup; + if (!(defs = qemuMonitorCPUDefsNew(ncpus))) + return -1; - for (i = 0; i < n; i++) { + for (i = 0; i < defs->ncpus; i++) { virJSONValuePtr child = virJSONValueArrayGet(data, i); const char *tmp; qemuMonitorCPUDefInfoPtr cpu; if (VIR_ALLOC(cpu) < 0) - goto cleanup; + return -1; - cpulist[i] = cpu; + defs->cpus[i] = cpu; if (!(tmp = virJSONValueObjectGetString(child, "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("query-cpu-definitions reply data was missing 'name'")); - goto cleanup; + return -1; } cpu->name = g_strdup(tmp); @@ -5640,7 +5637,7 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("unavailable-features in query-cpu-definitions " "reply data was not an array")); - goto cleanup; + return -1; } len = virJSONValueArraySize(blockers); @@ -5652,7 +5649,7 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, cpu->usable = VIR_TRISTATE_BOOL_NO; if (VIR_ALLOC_N(cpu->blockers, len + 1) < 0) - goto cleanup; + return -1; for (j = 0; j < len; j++) { virJSONValuePtr blocker = virJSONValueArrayGet(blockers, j); @@ -5661,7 +5658,7 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("unexpected value in unavailable-features " "array")); - goto cleanup; + return -1; } cpu->blockers[j] = g_strdup(virJSONValueGetString(blocker)); @@ -5669,17 +5666,8 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, } } - ret = n; - *cpus = cpulist; - cpulist = NULL; - - cleanup: - if (cpulist) { - for (i = 0; i < n; i++) - qemuMonitorCPUDefInfoFree(cpulist[i]); - VIR_FREE(cpulist); - } - return ret; + *cpuDefs = g_steal_pointer(&defs); + return 0; } diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index e85a606792..7e6d1b9919 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -379,7 +379,7 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon, ATTRIBUTE_NONNULL(2); int qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus) + qemuMonitorCPUDefsPtr *cpuDefs) ATTRIBUTE_NONNULL(2); int qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon, diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 963b54d27f..c84ff0d6b4 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -428,10 +428,7 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaque) { const testGenericData *data = opaque; virDomainXMLOptionPtr xmlopt = data->xmlopt; - int ret = -1; - qemuMonitorCPUDefInfoPtr *cpus = NULL; - int ncpus = 0; - size_t i; + g_autoptr(qemuMonitorCPUDefs) defs = NULL; g_autoptr(qemuMonitorTest) test = NULL; if (!(test = qemuMonitorTestNewSchema(xmlopt, data->schema))) @@ -453,31 +450,30 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaque) " } " " ]" "}") < 0) - goto cleanup; + return -1; - if ((ncpus = qemuMonitorGetCPUDefinitions(qemuMonitorTestGetMonitor(test), - &cpus)) < 0) - goto cleanup; + if (qemuMonitorGetCPUDefinitions(qemuMonitorTestGetMonitor(test), &defs) < 0) + return -1; - if (ncpus != 3) { + if (defs->ncpus != 3) { virReportError(VIR_ERR_INTERNAL_ERROR, - "ncpus %d is not 3", ncpus); - goto cleanup; + "ncpus %zu is not 3", defs->ncpus); + return -1; } #define CHECK_FULL(i, wantname, Usable) \ do { \ - if (STRNEQ(cpus[i]->name, (wantname))) { \ + if (STRNEQ(defs->cpus[i]->name, (wantname))) { \ virReportError(VIR_ERR_INTERNAL_ERROR, \ "name %s is not %s", \ - cpus[i]->name, (wantname)); \ - goto cleanup; \ + defs->cpus[i]->name, (wantname)); \ + return -1; \ } \ - if (cpus[i]->usable != (Usable)) { \ + if (defs->cpus[i]->usable != (Usable)) { \ virReportError(VIR_ERR_INTERNAL_ERROR, \ "%s: expecting usable flag %d, got %d", \ - cpus[i]->name, Usable, cpus[i]->usable); \ - goto cleanup; \ + defs->cpus[i]->name, Usable, defs->cpus[i]->usable); \ + return -1; \ } \ } while (0) @@ -496,13 +492,7 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaque) #undef CHECK_USABLE #undef CHECK_FULL - ret = 0; - - cleanup: - for (i = 0; i < ncpus; i++) - qemuMonitorCPUDefInfoFree(cpus[i]); - VIR_FREE(cpus); - return ret; + return 0; } -- 2.23.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list