typedef struct _testDriver testDriver;
typedef testDriver *testDriverPtr;
-static testDriver defaultConn;
+static testDriverPtr defaultConn;
static int defaultConnections;
static virMutex defaultLock = VIR_MUTEX_INITIALIZER;
testOpenDefault(virConnectPtr conn)
{
int u;
- testDriverPtr privconn = &defaultConn;
+ testDriverPtr privconn = NULL;
virDomainDefPtr domdef = NULL;
virDomainObjPtr domobj = NULL;
virNetworkDefPtr netdef = NULL;
virMutexLock(&defaultLock);
if (defaultConnections++) {
- conn->privateData = &defaultConn;
+ conn->privateData = defaultConn;
virMutexUnlock(&defaultLock);
return VIR_DRV_OPEN_SUCCESS;
}
+ if (VIR_ALLOC(privconn) < 0)
+ goto error;
+
if (virMutexInit(&privconn->lock) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("cannot initialize mutex"));
- defaultConnections--;
- virMutexUnlock(&defaultLock);
- return VIR_DRV_OPEN_ERROR;
+ goto error;
}
conn->privateData = privconn;
}
virNodeDeviceObjUnlock(nodeobj);
+ defaultConn = privconn;
+
virMutexUnlock(&defaultLock);
return VIR_DRV_OPEN_SUCCESS;
error:
- virObjectUnref(privconn->domains);
- virObjectUnref(privconn->networks);
- virInterfaceObjListFree(&privconn->ifaces);
- virStoragePoolObjListFree(&privconn->pools);
- virNodeDeviceObjListFree(&privconn->devs);
- virObjectUnref(privconn->caps);
- virObjectEventStateFree(privconn->eventState);
- virMutexDestroy(&privconn->lock);
+ if (privconn) {
+ virObjectUnref(privconn->domains);
+ virObjectUnref(privconn->networks);
+ virInterfaceObjListFree(&privconn->ifaces);
+ virStoragePoolObjListFree(&privconn->pools);
+ virNodeDeviceObjListFree(&privconn->devs);
+ virObjectUnref(privconn->caps);
+ virObjectEventStateFree(privconn->eventState);
+ virMutexDestroy(&privconn->lock);
+ }
conn->privateData = NULL;
virDomainDefFree(domdef);
defaultConnections--;
static int testConnectClose(virConnectPtr conn)
{
testDriverPtr privconn = conn->privateData;
+ bool dflt = false;
- if (privconn == &defaultConn) {
+ if (privconn == defaultConn) {
+ dflt = true;
virMutexLock(&defaultLock);
if (--defaultConnections) {
virMutexUnlock(&defaultLock);
testDriverUnlock(privconn);
virMutexDestroy(&privconn->lock);
- if (privconn == &defaultConn)
+ VIR_FREE(privconn);
+
+ if (dflt) {
+ defaultConn = NULL;
virMutexUnlock(&defaultLock);
- else
- VIR_FREE(privconn);
+ }
+
conn->privateData = NULL;
return 0;
}