Hook up qemuCapsProbeMachineTypes capabilities api to the emulator cache framework: - qemuCapsProbeMachineTypes() looks up emulator in cache and returns the version and flags. - wrap the part of the original qemuCapsProbeMachineTypes() with qemuCapsCacheMachineTypes() to run the specified binary and update the cached machine types supported by this binary. --- src/qemu/qemu_capabilities.c | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) Index: libvirt-0.9.10/src/qemu/qemu_capabilities.c =================================================================== --- libvirt-0.9.10.orig/src/qemu/qemu_capabilities.c +++ libvirt-0.9.10/src/qemu/qemu_capabilities.c @@ -307,6 +307,11 @@ qemuCapsParseMachineTypesStr(const char } } while ((p = next)); + /* + * Free in case of possible cache refresh + */ + virCapabilitiesFreeMachines(*machines, *nmachines); + *machines = list; *nmachines = nitems; @@ -323,10 +328,36 @@ qemuCapsProbeMachineTypes(const char *bi virCapsGuestMachinePtr **machines, int *nmachines) { + qemuEmulatorCachePtr emulator; + int ret = -1; + + emulator = qemuEmulatorCachedInfoGet(QEMU_PROBE_MACHINE_TYPES, binary, NULL); + if (emulator) { + ret = 0; + if (machines) + *machines = virCapabilitiesDupMachines(emulator->machines, emulator->nmachines); + if (nmachines) + *nmachines = emulator->nmachines; + } else { + if (machines) + *machines = NULL; + if (nmachines) + *nmachines = 0; + } + + qemuEmulatorCachedInfoRelease(emulator); + return ret; +} + +static int +qemuCapsCacheMachineTypes(qemuEmulatorCachePtr emulator) +{ + char *binary = emulator->path; char *output; int ret = -1; virCommandPtr cmd; int status; + VIR_DEBUG("Caching Machine Types for %s", binary); /* Make sure the binary we are about to try exec'ing exists. * Technically we could catch the exec() failure, but that's @@ -346,7 +377,7 @@ qemuCapsProbeMachineTypes(const char *bi if (virCommandRun(cmd, &status) < 0) goto cleanup; - if (qemuCapsParseMachineTypesStr(output, machines, nmachines) < 0) + if (qemuCapsParseMachineTypesStr(output, &emulator->machines, &emulator->nmachines) < 0) goto cleanup; ret = 0; @@ -359,12 +390,6 @@ cleanup: } static int -qemuCapsCacheMachineTypes(qemuEmulatorCachePtr emulator) -{ - return emulator ? 0 : 1; -} - -static int qemuCapsGetOldMachinesFromInfo(virCapsGuestDomainInfoPtr info, const char *emulator, time_t emulator_mtime, -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list