[libvirt] [PATCH v3 01/20] Add a qemu capabilities cache manager
Doug Goldstein
cardoe at gentoo.org
Tue Sep 25 19:50:44 UTC 2012
On Tue, Sep 25, 2012 at 12:59 PM, Daniel P. Berrange
<berrange at redhat.com> wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> Introduce a qemuCapsCachePtr object to provide a global cache
> of capabilities for QEMU binaries. The cache auto-populates
> on first request for capabilities about a binary, and will
> auto-refresh if the binary has changed since a previous cache
> was populated
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> src/qemu/qemu_capabilities.c | 99 ++++++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_capabilities.h | 9 ++++
> 2 files changed, 108 insertions(+)
>
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 3b08ef8..1163dd8 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -206,6 +206,11 @@ struct _qemuCaps {
> char **machineAliases;
> };
>
> +struct _qemuCapsCache {
> + virMutex lock;
> + virHashTablePtr binaries;
> +};
> +
>
> static virClassPtr qemuCapsClass;
> static void qemuCapsDispose(void *obj);
> @@ -1940,6 +1945,10 @@ qemuCapsPtr qemuCapsNewForBinary(const char *binary)
> tmp = strstr(binary, QEMU_SYSTEM_PREFIX);
> if (tmp) {
> tmp += strlen(QEMU_SYSTEM_PREFIX);
> +
> + /* For historical compat we uses 'itanium' as arch name */
s/uses/use/
> + if (STREQ(tmp, "ia64"))
> + tmp = "itanium";
> } else {
> uname_normalize(&ut);
> tmp = ut.machine;
> @@ -2048,3 +2057,93 @@ bool qemuCapsIsValid(qemuCapsPtr caps)
>
> return sb.st_mtime == caps->mtime;
> }
> +
> +
> +static void
> +qemuCapsHashDataFree(void *payload, const void *key ATTRIBUTE_UNUSED)
> +{
> + virObjectUnref(payload);
> +}
> +
> +qemuCapsCachePtr qemuCapsCacheNew(void)
Return type on its own line if I'm recalling the coding std.
> +{
> + qemuCapsCachePtr cache;
> +
> + if (VIR_ALLOC(cache) < 0) {
> + virReportOOMError();
> + return NULL;
> + }
> +
> + if (virMutexInit(&cache->lock) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Unable to initialize mutex"));
> + VIR_FREE(cache);
> + return NULL;
> + }
> +
> + if (!(cache->binaries = virHashCreate(10, qemuCapsHashDataFree)))
> + goto error;
> +
> + return cache;
> +
> +error:
> + qemuCapsCacheFree(cache);
> + return NULL;
> +}
> +
> +
> +qemuCapsPtr qemuCapsCacheLookup(qemuCapsCachePtr cache, const char *binary)
Again.
> +{
> + qemuCapsPtr ret = NULL;
> + virMutexLock(&cache->lock);
> + ret = virHashLookup(cache->binaries, binary);
> + if (ret &&
> + !qemuCapsIsValid(ret)) {
> + VIR_DEBUG("Cached capabilities %p no longer valid for %s",
> + ret, binary);
> + virHashRemoveEntry(cache->binaries, binary);
> + ret = NULL;
> + }
> + if (!ret) {
> + VIR_DEBUG("Creating capabilities for %s",
> + binary);
> + ret = qemuCapsNewForBinary(binary);
> + if (ret) {
> + VIR_DEBUG("Caching capabilities %p for %s",
> + ret, binary);
> + if (virHashAddEntry(cache->binaries, binary, ret) < 0) {
> + virObjectUnref(ret);
> + ret = NULL;
> + }
> + }
> + }
> + VIR_DEBUG("Returning caps %p for %s", ret, binary);
> + virObjectRef(ret);
> + virMutexUnlock(&cache->lock);
> + return ret;
> +}
> +
> +
> +qemuCapsPtr qemuCapsCacheLookupCopy(qemuCapsCachePtr cache, const char *binary)
Again.
> +{
> + qemuCapsPtr caps = qemuCapsCacheLookup(cache, binary);
> + qemuCapsPtr ret;
> +
> + if (!caps)
> + return NULL;
> +
> + ret = qemuCapsNewCopy(caps);
> + virObjectUnref(caps);
> + return ret;
> +}
> +
> +
> +void qemuCapsCacheFree(qemuCapsCachePtr cache)
Again.
> +{
> + if (!cache)
> + return;
> +
> + virHashFree(cache->binaries);
> + virMutexDestroy(&cache->lock);
> + VIR_FREE(cache);
> +}
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index 485c297..27ed378 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -154,6 +154,9 @@ enum qemuCapsFlags {
> typedef struct _qemuCaps qemuCaps;
> typedef qemuCaps *qemuCapsPtr;
>
> +typedef struct _qemuCapsCache qemuCapsCache;
> +typedef qemuCapsCache *qemuCapsCachePtr;
> +
> qemuCapsPtr qemuCapsNew(void);
> qemuCapsPtr qemuCapsNewCopy(qemuCapsPtr caps);
> qemuCapsPtr qemuCapsNewForBinary(const char *binary);
> @@ -183,6 +186,12 @@ const char *qemuCapsGetCanonicalMachine(qemuCapsPtr caps,
>
> bool qemuCapsIsValid(qemuCapsPtr caps);
>
> +
> +qemuCapsCachePtr qemuCapsCacheNew(void);
> +qemuCapsPtr qemuCapsCacheLookup(qemuCapsCachePtr cache, const char *binary);
> +qemuCapsPtr qemuCapsCacheLookupCopy(qemuCapsCachePtr cache, const char *binary);
> +void qemuCapsCacheFree(qemuCapsCachePtr cache);
> +
> virCapsPtr qemuCapsInit(virCapsPtr old_caps);
>
> int qemuCapsProbeMachineTypes(const char *binary,
> --
> 1.7.11.4
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
--
Doug Goldstein
More information about the libvir-list
mailing list