diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 751c14309aca8bf68e0544557fd6ee40d3eabcef..2f8378a42fb9678922ce7b79bd8a00c80155193e 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -299,6 +299,10 @@ struct _virQEMUCapsCache { gid_t runGid; }; +struct virQEMUCapsSearchData { + virArch arch; +}; + static virClassPtr virQEMUCapsClass; static void virQEMUCapsDispose(void *obj); @@ -3465,6 +3469,35 @@ virQEMUCapsCacheLookupCopy(virQEMUCapsCachePtr cache, const char *binary) } +static int +virQEMUCapsCompareArch(const void *payload, + const void *name ATTRIBUTE_UNUSED, + const void *opaque) +{ + struct virQEMUCapsSearchData *data = (struct virQEMUCapsSearchData *) opaque; + const virQEMUCaps *qemuCaps = payload; + + return qemuCaps->arch == data->arch; +} + + +virQEMUCapsPtr +virQEMUCapsCacheLookupByArch(virQEMUCapsCachePtr cache, + virArch arch) +{ + virQEMUCapsPtr ret = NULL; + struct virQEMUCapsSearchData data = { .arch = arch }; + + virMutexLock(&cache->lock); + ret = virHashSearch(cache->binaries, virQEMUCapsCompareArch, &data); + VIR_DEBUG("Returning caps %p for arch %s", ret, virArchToString(arch)); + virObjectRef(ret); + virMutexUnlock(&cache->lock); + + return ret; +} + + void virQEMUCapsCacheFree(virQEMUCapsCachePtr cache) { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 53ebe9044b27628cc223c69cb0305fbc27208ebf..1eb92b5231a5e2cb8602b3d5d666523271e53f29 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -274,6 +274,8 @@ virQEMUCapsPtr virQEMUCapsCacheLookup(virQEMUCapsCachePtr cache, const char *binary); virQEMUCapsPtr virQEMUCapsCacheLookupCopy(virQEMUCapsCachePtr cache, const char *binary); +virQEMUCapsPtr virQEMUCapsCacheLookupByArch(virQEMUCapsCachePtr cache, + virArch arch); void virQEMUCapsCacheFree(virQEMUCapsCachePtr cache); virCapsPtr virQEMUCapsInit(virQEMUCapsCachePtr cache);