diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 01fbd6523d..eb2edf50ce 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -42,6 +42,8 @@ #include "virstring.h" #include "qemu_hostdev.h" #include "qemu_domain.h" +#define __QEMU_CAPSRIV_H_ALLOW__ +#include "qemu_capspriv.h" #include #include @@ -331,15 +333,6 @@ struct _virQEMUCaps { unsigned int *machineMaxCpus; }; -struct _virQEMUCapsCache { - virMutex lock; - virHashTablePtr binaries; - char *libDir; - char *cacheDir; - uid_t runUid; - gid_t runGid; -}; - struct virQEMUCapsSearchData { virArch arch; }; @@ -3744,11 +3737,17 @@ virQEMUCapsCacheNew(const char *libDir, return NULL; } +const char *qemuTestCapsName; virQEMUCapsPtr virQEMUCapsCacheLookup(virQEMUCapsCachePtr cache, const char *binary) { virQEMUCapsPtr ret = NULL; + + /* This is used only by test suite!!! */ + if (qemuTestCapsName) + binary = qemuTestCapsName; + virMutexLock(&cache->lock); ret = virHashLookup(cache->binaries, binary); if (ret && diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h new file mode 100644 index 0000000000..e4610bbe61 --- /dev/null +++ b/src/qemu/qemu_capspriv.h @@ -0,0 +1,40 @@ +/* + * qemu_capspriv.h: private declarations for QEMU capabilities generation + * + * Copyright (C) 2015 Samsung Electronics Co. Ltd + * Copyright (C) 2015 Pavel Fedin + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + * + * Author: Pavel Fedin + */ + +#ifndef __QEMU_CAPSRIV_H_ALLOW__ +# error "qemu_capspriv.h may only be included by qemu_capabilities.c or test suites" +#endif + +#ifndef __QEMU_CAPSPRIV_H__ +# define __QEMU_CAPSPRIV_H__ + +struct _virQEMUCapsCache { + virMutex lock; + virHashTablePtr binaries; + char *libDir; + char *cacheDir; + uid_t runUid; + gid_t runGid; +}; + +#endif diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index e357c58069..de67bbe79f 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -8,6 +8,8 @@ # include "cpu_conf.h" # include "qemu/qemu_driver.h" # include "qemu/qemu_domain.h" +# define __QEMU_CAPSRIV_H_ALLOW__ +# include "qemu/qemu_capspriv.h" # include "virstring.h" # define VIR_FROM_THIS VIR_FROM_QEMU @@ -529,11 +531,38 @@ qemuTestParseCapabilities(const char *capsFile) void qemuTestDriverFree(virQEMUDriver *driver) { + virQEMUCapsCacheFree(driver->qemuCapsCache); virObjectUnref(driver->xmlopt); virObjectUnref(driver->caps); virObjectUnref(driver->config); } +int qemuTestCapsCacheInsert(virQEMUCapsCachePtr cache, const char *binary, + virQEMUCapsPtr caps) +{ + int ret; + + if (caps) { + /* Our caps were created artificially, so we don't want + * virQEMUCapsCacheFree() to attempt to deallocate them */ + virObjectRef(caps); + } else { + caps = virQEMUCapsNew(); + if (!caps) + return -ENOMEM; + } + + /* We can have repeating names for our test data sets, + * so make sure there's no old copy */ + virHashRemoveEntry(cache->binaries, binary); + + ret = virHashAddEntry(cache->binaries, binary, caps); + if (ret < 0) + virObjectUnref(caps); + + return ret; +} + int qemuTestDriverInit(virQEMUDriver *driver) { driver->config = virQEMUDriverConfigNew(false); @@ -554,4 +583,5 @@ int qemuTestDriverInit(virQEMUDriver *driver) qemuTestDriverFree(driver); return -1; } + #endif diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h index 6c2d3b5d2f..1d5dfc517f 100644 --- a/tests/testutilsqemu.h +++ b/tests/testutilsqemu.h @@ -18,4 +18,9 @@ void testQemuCapsSetCPU(virCapsPtr caps, int qemuTestDriverInit(virQEMUDriver *driver); void qemuTestDriverFree(virQEMUDriver *driver); +int qemuTestCapsCacheInsert(virQEMUCapsCachePtr cache, const char *binary, + virQEMUCapsPtr caps); + +/* This variable is actually defined in src/qemu/qemu_capabilities.c */ +extern const char *qemuTestCapsName; #endif