The function is made a little bit more readable and the code which
refreshes cached capabilities if they are not valid any more was moved
into a separate function (virQEMUCapsCacheValidate) so that it can be
reused in other places.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 59 +++++++++++++++++++++++++++-----------------
1 file changed, 36 insertions(+), 23 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 75d635a..904289b 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -4535,6 +4535,37 @@ virQEMUCapsCacheNew(const char *libDir,
return NULL;
}
+
+static void ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
+virQEMUCapsCacheValidate(virQEMUCapsCachePtr cache,
+ const char *binary,
+ virCapsPtr caps,
+ virQEMUCapsPtr *qemuCaps)
+{
+ if (*qemuCaps &&
+ !virQEMUCapsIsValid(*qemuCaps, 0, cache->runUid, cache->runGid)) {
+ VIR_DEBUG("Cached capabilities %p no longer valid for %s",
+ *qemuCaps, binary);
+ virHashRemoveEntry(cache->binaries, binary);
+ *qemuCaps = NULL;
+ }
+
+ if (!*qemuCaps) {
+ VIR_DEBUG("Creating capabilities for %s", binary);
+ *qemuCaps = virQEMUCapsNewForBinary(caps, binary,
+ cache->libDir, cache->cacheDir,
+ cache->runUid, cache->runGid);
+ if (*qemuCaps) {
+ VIR_DEBUG("Caching capabilities %p for %s", *qemuCaps, binary);
+ if (virHashAddEntry(cache->binaries, binary, *qemuCaps) < 0) {
+ virObjectUnref(*qemuCaps);
+ *qemuCaps = NULL;
+ }
+ }
+ }
+}
+
+
const char *qemuTestCapsName;
virQEMUCapsPtr
@@ -4549,32 +4580,14 @@ virQEMUCapsCacheLookup(virCapsPtr caps,
binary = qemuTestCapsName;
virMutexLock(&cache->lock);
+
ret = virHashLookup(cache->binaries, binary);
- if (ret &&
- !virQEMUCapsIsValid(ret, 0, cache->runUid, cache->runGid)) {
- 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 = virQEMUCapsNewForBinary(caps, binary, cache->libDir,
- cache->cacheDir,
- cache->runUid, cache->runGid);
- 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);
+ virQEMUCapsCacheValidate(cache, binary, caps, &ret);
virObjectRef(ret);
+
virMutexUnlock(&cache->lock);
+
+ VIR_DEBUG("Returning caps %p for %s", ret, binary);
return ret;
}
--
2.10.2