[PATCH v2 03/15] test: turn 'defaultConn' into a pointer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
 src/test/test_driver.c | 46 ++++++++++++++++++++++++++++------------------
 1 file changed, 28 insertions(+), 18 deletions(-)

diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 8d2bb5b..ff383c6 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -117,7 +117,7 @@ struct _testDriver {
 typedef struct _testDriver testDriver;
 typedef testDriver *testDriverPtr;

-static testDriver defaultConn;
+static testDriverPtr defaultConn;
 static int defaultConnections;
 static virMutex defaultLock = VIR_MUTEX_INITIALIZER;

@@ -691,7 +691,7 @@ static int
 testOpenDefault(virConnectPtr conn)
 {
     int u;
-    testDriverPtr privconn = &defaultConn;
+    testDriverPtr privconn = NULL;
     virDomainDefPtr domdef = NULL;
     virDomainObjPtr domobj = NULL;
     virNetworkDefPtr netdef = NULL;
@@ -705,17 +705,18 @@ testOpenDefault(virConnectPtr conn)

     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;
@@ -822,19 +823,23 @@ testOpenDefault(virConnectPtr conn)
     }
     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--;
@@ -1573,8 +1578,10 @@ static virDrvOpenStatus testConnectOpen(virConnectPtr conn,
 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);
@@ -1596,10 +1603,13 @@ static int testConnectClose(virConnectPtr conn)
     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;
 }
-- 
2.4.1

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]