Add a structure to store the data and use a single array of the structures rather than having 3 separate arrays with shared indexes. --- src/qemu/qemu_capabilities.c | 117 +++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 71 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index f8e2c55..23d4a65 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -342,6 +342,11 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, ); +struct virQEMUCapsMachineType { + char *name; + char *alias; + unsigned int maxCpus; +}; /* * Update the XML parser/formatter when adding more * information to this struct so that it gets cached @@ -369,9 +374,7 @@ struct _virQEMUCaps { char **cpuDefinitions; size_t nmachineTypes; - char **machineTypes; - char **machineAliases; - unsigned int *machineMaxCpus; + struct virQEMUCapsMachineType *machineTypes; size_t ngicCapabilities; virGICCapability *gicCapabilities; @@ -473,22 +476,13 @@ static void virQEMUCapsSetDefaultMachine(virQEMUCapsPtr qemuCaps, size_t defIdx) { - char *name = qemuCaps->machineTypes[defIdx]; - char *alias = qemuCaps->machineAliases[defIdx]; - unsigned int maxCpus = qemuCaps->machineMaxCpus[defIdx]; + struct virQEMUCapsMachineType tmp = qemuCaps->machineTypes[defIdx]; memmove(qemuCaps->machineTypes + 1, qemuCaps->machineTypes, sizeof(qemuCaps->machineTypes[0]) * defIdx); - memmove(qemuCaps->machineAliases + 1, - qemuCaps->machineAliases, - sizeof(qemuCaps->machineAliases[0]) * defIdx); - memmove(qemuCaps->machineMaxCpus + 1, - qemuCaps->machineMaxCpus, - sizeof(qemuCaps->machineMaxCpus[0]) * defIdx); - qemuCaps->machineTypes[0] = name; - qemuCaps->machineAliases[0] = alias; - qemuCaps->machineMaxCpus[0] = maxCpus; + + qemuCaps->machineTypes[0] = tmp; } /* Format is: @@ -536,23 +530,21 @@ virQEMUCapsParseMachineTypesStr(const char *output, } } - if (VIR_REALLOC_N(qemuCaps->machineTypes, qemuCaps->nmachineTypes + 1) < 0 || - VIR_REALLOC_N(qemuCaps->machineAliases, qemuCaps->nmachineTypes + 1) < 0 || - VIR_REALLOC_N(qemuCaps->machineMaxCpus, qemuCaps->nmachineTypes + 1) < 0) { + if (VIR_REALLOC_N(qemuCaps->machineTypes, qemuCaps->nmachineTypes + 1) < 0) { VIR_FREE(name); VIR_FREE(canonical); return -1; } qemuCaps->nmachineTypes++; if (canonical) { - qemuCaps->machineTypes[qemuCaps->nmachineTypes-1] = canonical; - qemuCaps->machineAliases[qemuCaps->nmachineTypes-1] = name; + qemuCaps->machineTypes[qemuCaps->nmachineTypes-1].name = canonical; + qemuCaps->machineTypes[qemuCaps->nmachineTypes-1].alias = name; } else { - qemuCaps->machineTypes[qemuCaps->nmachineTypes-1] = name; - qemuCaps->machineAliases[qemuCaps->nmachineTypes-1] = NULL; + qemuCaps->machineTypes[qemuCaps->nmachineTypes-1].name = name; + qemuCaps->machineTypes[qemuCaps->nmachineTypes-1].alias = NULL; } /* When parsing from command line we don't have information about maxCpus */ - qemuCaps->machineMaxCpus[qemuCaps->nmachineTypes-1] = 0; + qemuCaps->machineTypes[qemuCaps->nmachineTypes-1].maxCpus = 0; } while ((p = next)); @@ -2042,16 +2034,12 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) if (VIR_ALLOC_N(ret->machineTypes, qemuCaps->nmachineTypes) < 0) goto error; - if (VIR_ALLOC_N(ret->machineAliases, qemuCaps->nmachineTypes) < 0) - goto error; - if (VIR_ALLOC_N(ret->machineMaxCpus, qemuCaps->nmachineTypes) < 0) - goto error; ret->nmachineTypes = qemuCaps->nmachineTypes; for (i = 0; i < qemuCaps->nmachineTypes; i++) { - if (VIR_STRDUP(ret->machineTypes[i], qemuCaps->machineTypes[i]) < 0 || - VIR_STRDUP(ret->machineAliases[i], qemuCaps->machineAliases[i]) < 0) + if (VIR_STRDUP(ret->machineTypes[i].name, qemuCaps->machineTypes[i].name) < 0 || + VIR_STRDUP(ret->machineTypes[i].alias, qemuCaps->machineTypes[i].alias) < 0) goto error; - ret->machineMaxCpus[i] = qemuCaps->machineMaxCpus[i]; + ret->machineTypes[i].maxCpus = qemuCaps->machineTypes[i].maxCpus; } return ret; @@ -2068,12 +2056,10 @@ void virQEMUCapsDispose(void *obj) size_t i; for (i = 0; i < qemuCaps->nmachineTypes; i++) { - VIR_FREE(qemuCaps->machineTypes[i]); - VIR_FREE(qemuCaps->machineAliases[i]); + VIR_FREE(qemuCaps->machineTypes[i].name); + VIR_FREE(qemuCaps->machineTypes[i].alias); } VIR_FREE(qemuCaps->machineTypes); - VIR_FREE(qemuCaps->machineAliases); - VIR_FREE(qemuCaps->machineMaxCpus); for (i = 0; i < qemuCaps->ncpuDefinitions; i++) VIR_FREE(qemuCaps->cpuDefinitions[i]); @@ -2258,15 +2244,15 @@ int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps, if (VIR_ALLOC(mach) < 0) goto error; (*machines)[i] = mach; - if (qemuCaps->machineAliases[i]) { - if (VIR_STRDUP(mach->name, qemuCaps->machineAliases[i]) < 0 || - VIR_STRDUP(mach->canonical, qemuCaps->machineTypes[i]) < 0) + if (qemuCaps->machineTypes[i].alias) { + if (VIR_STRDUP(mach->name, qemuCaps->machineTypes[i].alias) < 0 || + VIR_STRDUP(mach->canonical, qemuCaps->machineTypes[i].name) < 0) goto error; } else { - if (VIR_STRDUP(mach->name, qemuCaps->machineTypes[i]) < 0) + if (VIR_STRDUP(mach->name, qemuCaps->machineTypes[i].name) < 0) goto error; } - mach->maxCpus = qemuCaps->machineMaxCpus[i]; + mach->maxCpus = qemuCaps->machineTypes[i].maxCpus; } /* Make sure all canonical machine types also have their own entry so that @@ -2328,10 +2314,10 @@ const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps, return NULL; for (i = 0; i < qemuCaps->nmachineTypes; i++) { - if (!qemuCaps->machineAliases[i]) + if (!qemuCaps->machineTypes[i].alias) continue; - if (STREQ(qemuCaps->machineAliases[i], name)) - return qemuCaps->machineTypes[i]; + if (STREQ(qemuCaps->machineTypes[i].alias, name)) + return qemuCaps->machineTypes[i].name; } return name; @@ -2347,10 +2333,10 @@ int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps, return 0; for (i = 0; i < qemuCaps->nmachineTypes; i++) { - if (!qemuCaps->machineMaxCpus[i]) + if (!qemuCaps->machineTypes[i].maxCpus) continue; - if (STREQ(qemuCaps->machineTypes[i], name)) - return qemuCaps->machineMaxCpus[i]; + if (STREQ(qemuCaps->machineTypes[i].name, name)) + return qemuCaps->machineTypes[i].maxCpus; } return 0; @@ -2498,23 +2484,19 @@ virQEMUCapsProbeQMPMachineTypes(virQEMUCapsPtr qemuCaps, if (VIR_ALLOC_N(qemuCaps->machineTypes, nmachines) < 0) goto cleanup; - if (VIR_ALLOC_N(qemuCaps->machineAliases, nmachines) < 0) - goto cleanup; - if (VIR_ALLOC_N(qemuCaps->machineMaxCpus, nmachines) < 0) - goto cleanup; for (i = 0; i < nmachines; i++) { if (STREQ(machines[i]->name, "none")) continue; qemuCaps->nmachineTypes++; - if (VIR_STRDUP(qemuCaps->machineAliases[qemuCaps->nmachineTypes -1], + if (VIR_STRDUP(qemuCaps->machineTypes[qemuCaps->nmachineTypes -1].alias, machines[i]->alias) < 0 || - VIR_STRDUP(qemuCaps->machineTypes[qemuCaps->nmachineTypes - 1], + VIR_STRDUP(qemuCaps->machineTypes[qemuCaps->nmachineTypes - 1].name, machines[i]->name) < 0) goto cleanup; if (machines[i]->isDefault) defIdx = qemuCaps->nmachineTypes - 1; - qemuCaps->machineMaxCpus[qemuCaps->nmachineTypes - 1] = + qemuCaps->machineTypes[qemuCaps->nmachineTypes - 1].maxCpus = machines[i]->maxCpus; } @@ -2909,25 +2891,20 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename, } if (n > 0) { qemuCaps->nmachineTypes = n; - if (VIR_ALLOC_N(qemuCaps->machineTypes, - qemuCaps->nmachineTypes) < 0 || - VIR_ALLOC_N(qemuCaps->machineAliases, - qemuCaps->nmachineTypes) < 0 || - VIR_ALLOC_N(qemuCaps->machineMaxCpus, - qemuCaps->nmachineTypes) < 0) + if (VIR_ALLOC_N(qemuCaps->machineTypes, qemuCaps->nmachineTypes) < 0) goto cleanup; for (i = 0; i < n; i++) { - if (!(qemuCaps->machineTypes[i] = virXMLPropString(nodes[i], "name"))) { + if (!(qemuCaps->machineTypes[i].name = virXMLPropString(nodes[i], "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing machine name in QEMU capabilities cache")); goto cleanup; } - qemuCaps->machineAliases[i] = virXMLPropString(nodes[i], "alias"); + qemuCaps->machineTypes[i].alias = virXMLPropString(nodes[i], "alias"); str = virXMLPropString(nodes[i], "maxCpus"); if (str && - virStrToLong_ui(str, NULL, 10, &(qemuCaps->machineMaxCpus[i])) < 0) { + virStrToLong_ui(str, NULL, 10, &(qemuCaps->machineTypes[i].maxCpus)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("malformed machine cpu count in QEMU capabilities cache")); goto cleanup; @@ -3062,12 +3039,12 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps, for (i = 0; i < qemuCaps->nmachineTypes; i++) { virBufferEscapeString(&buf, "<machine name='%s'", - qemuCaps->machineTypes[i]); - if (qemuCaps->machineAliases[i]) + qemuCaps->machineTypes[i].name); + if (qemuCaps->machineTypes[i].alias) virBufferEscapeString(&buf, " alias='%s'", - qemuCaps->machineAliases[i]); + qemuCaps->machineTypes[i].alias); virBufferAsprintf(&buf, " maxCpus='%u'/>\n", - qemuCaps->machineMaxCpus[i]); + qemuCaps->machineTypes[i].maxCpus); } for (i = 0; i < qemuCaps->ngicCapabilities; i++) { @@ -3179,12 +3156,10 @@ virQEMUCapsReset(virQEMUCapsPtr qemuCaps) qemuCaps->ncpuDefinitions = 0; for (i = 0; i < qemuCaps->nmachineTypes; i++) { - VIR_FREE(qemuCaps->machineTypes[i]); - VIR_FREE(qemuCaps->machineAliases[i]); + VIR_FREE(qemuCaps->machineTypes[i].name); + VIR_FREE(qemuCaps->machineTypes[i].alias); } VIR_FREE(qemuCaps->machineTypes); - VIR_FREE(qemuCaps->machineAliases); - VIR_FREE(qemuCaps->machineMaxCpus); qemuCaps->nmachineTypes = 0; VIR_FREE(qemuCaps->gicCapabilities); @@ -4050,7 +4025,7 @@ virQEMUCapsIsMachineSupported(virQEMUCapsPtr qemuCaps, size_t i; for (i = 0; i < qemuCaps->nmachineTypes; i++) { - if (STREQ(canonical_machine, qemuCaps->machineTypes[i])) + if (STREQ(canonical_machine, qemuCaps->machineTypes[i].name)) return true; } return false; @@ -4062,7 +4037,7 @@ virQEMUCapsGetDefaultMachine(virQEMUCapsPtr qemuCaps) { if (!qemuCaps->nmachineTypes) return NULL; - return qemuCaps->machineTypes[0]; + return qemuCaps->machineTypes[0].name; } -- 2.9.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list