[libvirt] [PATCH v2 1/7] util: introduce virFileCache
Jiri Denemark
jdenemar at redhat.com
Wed Jul 26 11:46:27 UTC 2017
On Fri, Jul 21, 2017 at 15:30:09 +0200, Pavel Hrdina wrote:
> The new virFileCache will nicely handle the caching logic for any data
> that we would like to cache. For each type of data we will just need
> to implement few handlers that will take care of creating, validating,
> loading and saving the cached data.
>
> The cached data must be an instance of virObject.
>
> Currently we cache QEMU capabilities which will start using
> virFileCache.
>
> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> ---
>
> Notes:
> Changes in v2:
> - added suffix argument into virFileCacheNew()
> - fixed locking for virFileCache APIs
> - moved virObjectUnref() into virFileCacheLoad()
>
> po/POTFILES.in | 1 +
> src/Makefile.am | 1 +
> src/libvirt_private.syms | 9 +
> src/util/virfilecache.c | 439 +++++++++++++++++++++++++++++++++++++++++++++++
> src/util/virfilecache.h | 137 +++++++++++++++
> 5 files changed, 587 insertions(+)
> create mode 100644 src/util/virfilecache.c
> create mode 100644 src/util/virfilecache.h
...
> diff --git a/src/util/virfilecache.c b/src/util/virfilecache.c
> new file mode 100644
> index 0000000000..0401253146
> --- /dev/null
> +++ b/src/util/virfilecache.c
> @@ -0,0 +1,439 @@
...
> +/**
> + * virFileCacheNew:
> + * @dir: the cache directory where all the cache files will be stored
> + * @suffix: the cache file suffix or NULL if no suffix is required
> + * @handlers: filled structure with all required handlers
> + *
> + * Creates a new cache object which handles caching any data to files
> + * stored on a filesystem.
> + *
> + * Returns new cache object or NULL on error.
> + */
> +virFileCachePtr
> +virFileCacheNew(const char *dir,
> + const char *suffix,
> + virFileCacheHandlers handlers)
What about const virFileCacheHandlers *handlers?
> +{
> + virFileCachePtr cache;
> +
> + if (virFileCacheInitialize() < 0)
> + return NULL;
> +
> + if (!(cache = virObjectNew(virFileCacheClass)))
> + return NULL;
> +
> + if (!(cache->table = virHashCreate(10, virObjectFreeHashData)))
> + goto cleanup;
> +
> + if (VIR_STRDUP(cache->dir, dir) < 0)
> + goto cleanup;
> +
> + if (VIR_STRDUP(cache->suffix, suffix) < 0)
> + goto cleanup;
> +
> + cache->handlers = handlers;
And cache->handlers = *handlers;
> +
> + return cache;
> +
> + cleanup:
> + virObjectUnref(cache);
> + return NULL;
> +}
...
> +/**
> + * virFileCacheInsertData:
> + * @cache: existing cache object
> + * @name: name of the new data
> + * @data: the actual data object to store in cache
> + *
> + * Adds a new data into a cache but doesn't store the data into
> + * a file. This function should be used only by testing code.
> + *
> + * Returns 0 on success, -1 on error.
> + */
> +int
> +virFileCacheInsertData(virFileCachePtr cache,
> + const char *name,
> + void *data)
> +{
> + int rc;
> +
> + virObjectLock(cache);
> +
> + rc = virHashUpdateEntry(cache->table, name, data);
> +
> + virObjectUnlock(cache);
> +
> + if (rc < 0)
> + return -1;
> + return 0;
s/rc/ret/ and you can just directly return ret here.
> +}
Reviewed-by: Jiri Denemark <jdenemar at redhat.com>
More information about the libvir-list
mailing list