The test driver state (@testDriver) uses it's own reference counting and locking implementation. Instead of doing that, convert @testDriver into a virObjectLockable and use the provided functionalities. Signed-off-by: Marc Hartmayer <mhartmay@xxxxxxxxxxxxxxxxxx> Reviewed-by: Boris Fiuczynski <fiuczy@xxxxxxxxxxxxxxxxxx> --- src/test/test_driver.c | 200 ++++++++++++++++++++++--------------------------- 1 file changed, 90 insertions(+), 110 deletions(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 856869c9d3a9..1a219316e7c5 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -94,7 +94,7 @@ typedef struct _testAuth testAuth; typedef struct _testAuth *testAuthPtr; struct _testDriver { - virMutex lock; + virObjectLockable parent; virNodeInfo nodeInfo; virInterfaceObjListPtr ifaces; @@ -126,9 +126,22 @@ typedef struct _testDriver testDriver; typedef testDriver *testDriverPtr; static testDriverPtr defaultPrivconn; -static int defaultConnections; static virMutex defaultLock = VIR_MUTEX_INITIALIZER; +static virClassPtr testDriverClass; +static void testDriverDispose(void *obj); +static int testDriverOnceInit(void) +{ + if (!(testDriverClass = virClassNew(virClassForObjectLockable(), + "testDriver", + sizeof(testDriver), + testDriverDispose))) + return -1; + + return 0; +} +VIR_ONCE_GLOBAL_INIT(testDriver) + #define TEST_MODEL "i686" #define TEST_EMULATOR "/usr/bin/test-hv" @@ -144,10 +157,9 @@ static const virNodeInfo defaultNodeInfo = { }; static void -testDriverFree(testDriverPtr driver) +testDriverDispose(void *obj) { - if (!driver) - return; + testDriverPtr driver = obj; virObjectUnref(driver->caps); virObjectUnref(driver->xmlopt); @@ -157,23 +169,9 @@ testDriverFree(testDriverPtr driver) virObjectUnref(driver->ifaces); virObjectUnref(driver->pools); virObjectUnref(driver->eventState); - virMutexUnlock(&driver->lock); - virMutexDestroy(&driver->lock); - - VIR_FREE(driver); } -static void testDriverLock(testDriverPtr driver) -{ - virMutexLock(&driver->lock); -} - -static void testDriverUnlock(testDriverPtr driver) -{ - virMutexUnlock(&driver->lock); -} - static void testObjectEventQueue(testDriverPtr driver, virObjectEventPtr event) { @@ -405,14 +403,11 @@ testDriverNew(void) }; testDriverPtr ret; - if (VIR_ALLOC(ret) < 0) + if (testDriverInitialize() < 0) return NULL; - if (virMutexInit(&ret->lock) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("cannot initialize mutex")); - goto error; - } + if (!(ret = virObjectLockableNew(testDriverClass))) + return NULL; if (!(ret->xmlopt = virDomainXMLOptionNew(NULL, NULL, &ns, NULL, NULL)) || !(ret->eventState = virObjectEventStateNew()) || @@ -428,7 +423,7 @@ testDriverNew(void) return ret; error: - testDriverFree(ret); + virObjectUnref(ret); return NULL; } @@ -1262,7 +1257,7 @@ testOpenFromFile(virConnectPtr conn, const char *file) if (!(privconn = testDriverNew())) return VIR_DRV_OPEN_ERROR; - testDriverLock(privconn); + virObjectLock(privconn); conn->privateData = privconn; if (!(privconn->caps = testBuildCapabilities(conn))) @@ -1279,14 +1274,14 @@ testOpenFromFile(virConnectPtr conn, const char *file) xmlXPathFreeContext(ctxt); xmlFreeDoc(doc); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return VIR_DRV_OPEN_SUCCESS; error: xmlXPathFreeContext(ctxt); xmlFreeDoc(doc); - testDriverFree(privconn); + virObjectUnref(privconn); conn->privateData = NULL; return VIR_DRV_OPEN_ERROR; } @@ -1304,8 +1299,8 @@ testOpenDefault(virConnectPtr conn) size_t i; virMutexLock(&defaultLock); - if (defaultConnections++) { - conn->privateData = defaultPrivconn; + if (defaultPrivconn) { + conn->privateData = virObjectRef(defaultPrivconn); virMutexUnlock(&defaultLock); return VIR_DRV_OPEN_SUCCESS; } @@ -1354,9 +1349,8 @@ testOpenDefault(virConnectPtr conn) return ret; error: - testDriverFree(privconn); + virObjectUnref(privconn); conn->privateData = NULL; - defaultConnections--; goto cleanup; } @@ -1369,9 +1363,9 @@ testConnectAuthenticate(virConnectPtr conn, ssize_t i; char *username = NULL, *password = NULL; - testDriverLock(privconn); + virObjectLock(privconn); if (privconn->numAuths == 0) { - testDriverUnlock(privconn); + virObjectUnlock(privconn); return 0; } @@ -1413,7 +1407,7 @@ testConnectAuthenticate(virConnectPtr conn, ret = 0; cleanup: - testDriverUnlock(privconn); + virObjectUnlock(privconn); VIR_FREE(username); VIR_FREE(password); return ret; @@ -1423,24 +1417,11 @@ testConnectAuthenticate(virConnectPtr conn, static void testDriverCloseInternal(testDriverPtr driver) { - bool dflt = false; - - if (driver == defaultPrivconn) { - dflt = true; - virMutexLock(&defaultLock); - if (--defaultConnections) { - virMutexUnlock(&defaultLock); - return; - } - } - - testDriverLock(driver); - testDriverFree(driver); - - if (dflt) { + virMutexLock(&defaultLock); + bool disposed = !virObjectUnref(driver); + if (disposed && driver == defaultPrivconn) defaultPrivconn = NULL; - virMutexUnlock(&defaultLock); - } + virMutexUnlock(&defaultLock); } @@ -1571,9 +1552,9 @@ static int testNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info) { testDriverPtr privconn = conn->privateData; - testDriverLock(privconn); + virObjectLock(privconn); memcpy(info, &privconn->nodeInfo, sizeof(virNodeInfo)); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return 0; } @@ -1581,9 +1562,9 @@ static char *testConnectGetCapabilities(virConnectPtr conn) { testDriverPtr privconn = conn->privateData; char *xml; - testDriverLock(privconn); + virObjectLock(privconn); xml = virCapabilitiesFormatXML(privconn->caps); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return xml; } @@ -1618,9 +1599,9 @@ static int testConnectNumOfDomains(virConnectPtr conn) testDriverPtr privconn = conn->privateData; int count; - testDriverLock(privconn); + virObjectLock(privconn); count = virDomainObjListNumOfDomains(privconn->domains, true, NULL, NULL); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return count; } @@ -1673,7 +1654,7 @@ testDomainCreateXML(virConnectPtr conn, const char *xml, if (flags & VIR_DOMAIN_START_VALIDATE) parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; - testDriverLock(privconn); + virObjectLock(privconn); if ((def = virDomainDefParseString(xml, privconn->caps, privconn->xmlopt, NULL, parse_flags)) == NULL) goto cleanup; @@ -1708,7 +1689,7 @@ testDomainCreateXML(virConnectPtr conn, const char *xml, virObjectUnlock(dom); testObjectEventQueue(privconn, event); virDomainDefFree(def); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return ret; } @@ -2891,7 +2872,7 @@ static int testNodeGetCellsFreeMemory(virConnectPtr conn, size_t i; int ret = -1; - testDriverLock(privconn); + virObjectLock(privconn); if (startCell >= privconn->numCells) { virReportError(VIR_ERR_INVALID_ARG, "%s", _("Range exceeds available cells")); @@ -2906,7 +2887,7 @@ static int testNodeGetCellsFreeMemory(virConnectPtr conn, ret = i; cleanup: - testDriverUnlock(privconn); + virObjectUnlock(privconn); return ret; } @@ -2964,12 +2945,12 @@ testNodeGetFreeMemory(virConnectPtr conn) unsigned int freeMem = 0; size_t i; - testDriverLock(privconn); + virObjectLock(privconn); for (i = 0; i < privconn->numCells; i++) freeMem += privconn->cells[i].freeMem; - testDriverUnlock(privconn); + virObjectUnlock(privconn); return freeMem; } @@ -3006,7 +2987,7 @@ static int testDomainCreateWithFlags(virDomainPtr domain, unsigned int flags) virCheckFlags(0, -1); - testDriverLock(privconn); + virObjectLock(privconn); if (!(privdom = testDomObjFromDomain(domain))) goto cleanup; @@ -3030,7 +3011,7 @@ static int testDomainCreateWithFlags(virDomainPtr domain, unsigned int flags) cleanup: virDomainObjEndAPI(&privdom); testObjectEventQueue(privconn, event); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return ret; } @@ -3803,9 +3784,9 @@ testInterfaceObjFindByName(testDriverPtr privconn, { virInterfaceObjPtr obj; - testDriverLock(privconn); + virObjectLock(privconn); obj = virInterfaceObjListFindByName(privconn->ifaces, name); - testDriverUnlock(privconn); + virObjectUnlock(privconn); if (!obj) virReportError(VIR_ERR_NO_INTERFACE, @@ -3822,9 +3803,9 @@ testConnectNumOfInterfaces(virConnectPtr conn) testDriverPtr privconn = conn->privateData; int ninterfaces; - testDriverLock(privconn); + virObjectLock(privconn); ninterfaces = virInterfaceObjListNumOfInterfaces(privconn->ifaces, true); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return ninterfaces; } @@ -3837,10 +3818,10 @@ testConnectListInterfaces(virConnectPtr conn, testDriverPtr privconn = conn->privateData; int nnames; - testDriverLock(privconn); + virObjectLock(privconn); nnames = virInterfaceObjListGetNames(privconn->ifaces, true, names, maxnames); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return nnames; } @@ -3852,9 +3833,9 @@ testConnectNumOfDefinedInterfaces(virConnectPtr conn) testDriverPtr privconn = conn->privateData; int ninterfaces; - testDriverLock(privconn); + virObjectLock(privconn); ninterfaces = virInterfaceObjListNumOfInterfaces(privconn->ifaces, false); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return ninterfaces; } @@ -3867,10 +3848,10 @@ testConnectListDefinedInterfaces(virConnectPtr conn, testDriverPtr privconn = conn->privateData; int nnames; - testDriverLock(privconn); + virObjectLock(privconn); nnames = virInterfaceObjListGetNames(privconn->ifaces, false, names, maxnames); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return nnames; } @@ -3905,10 +3886,10 @@ testInterfaceLookupByMACString(virConnectPtr conn, char *ifacenames[] = { NULL, NULL }; virInterfacePtr ret = NULL; - testDriverLock(privconn); + virObjectLock(privconn); ifacect = virInterfaceObjListFindByMACString(privconn->ifaces, mac, ifacenames, 2); - testDriverUnlock(privconn); + virObjectUnlock(privconn); if (ifacect == 0) { virReportError(VIR_ERR_NO_INTERFACE, @@ -3956,7 +3937,7 @@ testInterfaceChangeBegin(virConnectPtr conn, virCheckFlags(0, -1); - testDriverLock(privconn); + virObjectLock(privconn); if (privconn->transaction_running) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("there is another transaction running.")); @@ -3970,7 +3951,7 @@ testInterfaceChangeBegin(virConnectPtr conn, ret = 0; cleanup: - testDriverUnlock(privconn); + virObjectUnlock(privconn); return ret; } @@ -3984,7 +3965,7 @@ testInterfaceChangeCommit(virConnectPtr conn, virCheckFlags(0, -1); - testDriverLock(privconn); + virObjectLock(privconn); if (!privconn->transaction_running) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", @@ -3999,7 +3980,7 @@ testInterfaceChangeCommit(virConnectPtr conn, ret = 0; cleanup: - testDriverUnlock(privconn); + virObjectUnlock(privconn); return ret; } @@ -4014,7 +3995,7 @@ testInterfaceChangeRollback(virConnectPtr conn, virCheckFlags(0, -1); - testDriverLock(privconn); + virObjectLock(privconn); if (!privconn->transaction_running) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", @@ -4032,7 +4013,7 @@ testInterfaceChangeRollback(virConnectPtr conn, ret = 0; cleanup: - testDriverUnlock(privconn); + virObjectUnlock(privconn); return ret; } @@ -4072,7 +4053,7 @@ testInterfaceDefineXML(virConnectPtr conn, virCheckFlags(0, NULL); - testDriverLock(privconn); + virObjectLock(privconn); if ((def = virInterfaceDefParseString(xmlStr)) == NULL) goto cleanup; @@ -4086,7 +4067,7 @@ testInterfaceDefineXML(virConnectPtr conn, cleanup: virInterfaceDefFree(def); virInterfaceObjEndAPI(&obj); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return ret; } @@ -4190,9 +4171,9 @@ testStoragePoolObjFindByName(testDriverPtr privconn, { virStoragePoolObjPtr obj; - testDriverLock(privconn); + virObjectLock(privconn); obj = virStoragePoolObjFindByName(privconn->pools, name); - testDriverUnlock(privconn); + virObjectUnlock(privconn); if (!obj) virReportError(VIR_ERR_NO_STORAGE_POOL, @@ -4250,9 +4231,9 @@ testStoragePoolObjFindByUUID(testDriverPtr privconn, virStoragePoolObjPtr obj; char uuidstr[VIR_UUID_STRING_BUFLEN]; - testDriverLock(privconn); + virObjectLock(privconn); obj = virStoragePoolObjFindByUUID(privconn->pools, uuid); - testDriverUnlock(privconn); + virObjectUnlock(privconn); if (!obj) { virUUIDFormat(uuid, uuidstr); @@ -4318,10 +4299,10 @@ testConnectNumOfStoragePools(virConnectPtr conn) testDriverPtr privconn = conn->privateData; int numActive = 0; - testDriverLock(privconn); + virObjectLock(privconn); numActive = virStoragePoolObjNumOfStoragePools(privconn->pools, conn, true, NULL); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return numActive; } @@ -4335,10 +4316,10 @@ testConnectListStoragePools(virConnectPtr conn, testDriverPtr privconn = conn->privateData; int n = 0; - testDriverLock(privconn); + virObjectLock(privconn); n = virStoragePoolObjGetNames(privconn->pools, conn, true, NULL, names, maxnames); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return n; } @@ -4350,10 +4331,10 @@ testConnectNumOfDefinedStoragePools(virConnectPtr conn) testDriverPtr privconn = conn->privateData; int numInactive = 0; - testDriverLock(privconn); + virObjectLock(privconn); numInactive = virStoragePoolObjNumOfStoragePools(privconn->pools, conn, false, NULL); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return numInactive; } @@ -4367,10 +4348,10 @@ testConnectListDefinedStoragePools(virConnectPtr conn, testDriverPtr privconn = conn->privateData; int n = 0; - testDriverLock(privconn); + virObjectLock(privconn); n = virStoragePoolObjGetNames(privconn->pools, conn, false, NULL, names, maxnames); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return n; } @@ -4386,10 +4367,10 @@ testConnectListAllStoragePools(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ALL, -1); - testDriverLock(privconn); + virObjectLock(privconn); ret = virStoragePoolObjListExport(conn, privconn->pools, pools, NULL, flags); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return ret; } @@ -4551,7 +4532,7 @@ testStoragePoolCreateXML(virConnectPtr conn, virCheckFlags(0, NULL); - testDriverLock(privconn); + virObjectLock(privconn); if (!(newDef = virStoragePoolDefParseString(xml))) goto cleanup; @@ -4602,7 +4583,7 @@ testStoragePoolCreateXML(virConnectPtr conn, virStoragePoolDefFree(newDef); testObjectEventQueue(privconn, event); virStoragePoolObjEndAPI(&obj); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return pool; } @@ -4621,7 +4602,7 @@ testStoragePoolDefineXML(virConnectPtr conn, virCheckFlags(0, NULL); - testDriverLock(privconn); + virObjectLock(privconn); if (!(newDef = virStoragePoolDefParseString(xml))) goto cleanup; @@ -4654,7 +4635,7 @@ testStoragePoolDefineXML(virConnectPtr conn, virStoragePoolDefFree(newDef); testObjectEventQueue(privconn, event); virStoragePoolObjEndAPI(&obj); - testDriverUnlock(privconn); + virObjectUnlock(privconn); return pool; } @@ -5055,7 +5036,7 @@ testStorageVolLookupByKey(virConnectPtr conn, .key = key, .voldef = NULL }; virStorageVolPtr vol = NULL; - testDriverLock(privconn); + virObjectLock(privconn); if ((obj = virStoragePoolObjListSearch(privconn->pools, testStorageVolLookupByKeyCallback, &data)) && data.voldef) { @@ -5065,7 +5046,7 @@ testStorageVolLookupByKey(virConnectPtr conn, NULL, NULL); virStoragePoolObjEndAPI(&obj); } - testDriverUnlock(privconn); + virObjectUnlock(privconn); if (!vol) virReportError(VIR_ERR_NO_STORAGE_VOL, @@ -5099,7 +5080,7 @@ testStorageVolLookupByPath(virConnectPtr conn, .path = path, .voldef = NULL }; virStorageVolPtr vol = NULL; - testDriverLock(privconn); + virObjectLock(privconn); if ((obj = virStoragePoolObjListSearch(privconn->pools, testStorageVolLookupByPathCallback, &data)) && data.voldef) { @@ -5109,7 +5090,7 @@ testStorageVolLookupByPath(virConnectPtr conn, NULL, NULL); virStoragePoolObjEndAPI(&obj); } - testDriverUnlock(privconn); + virObjectUnlock(privconn); if (!vol) virReportError(VIR_ERR_NO_STORAGE_VOL, @@ -6859,7 +6840,6 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, } - static virHypervisorDriver testHypervisorDriver = { .name = "Test", .connectOpen = testConnectOpen, /* 0.1.1 */ -- 2.13.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list