[libvirt] [PATCH v3 10/15] virNetworkObjFindBy*: Return an reference to found object

Michal Privoznik mprivozn at redhat.com
Tue Mar 10 16:45:16 UTC 2015


This patch turns both virNetworkObjFindByUUID() and
virNetworkObjFindByName() to return an referenced object so that
even if caller unlocks it, it's for sure that object won't
disappear meanwhile. Especially if the object (in general) is
locked and unlocked during the caller run.
Moreover, this commit is nicely small, since the object unrefing
can be done in virNetworkObjEndAPI().

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/conf/network_conf.c     | 15 ++++++++++-----
 src/network/bridge_driver.c | 18 +++++-------------
 src/test/test_driver.c      | 10 ++++------
 3 files changed, 19 insertions(+), 24 deletions(-)

diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 98342f9..a2aa4dc 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -143,6 +143,7 @@ virNetworkObjEndAPI(virNetworkObjPtr *net)
         return;
 
     virObjectUnlock(*net);
+    virObjectUnref(*net);
     *net = NULL;
 }
 
@@ -175,7 +176,7 @@ virNetworkObjFindByUUIDLocked(virNetworkObjListPtr nets,
 
     ret = virHashLookup(nets->objs, uuidstr);
     if (ret)
-        virObjectLock(ret);
+        virObjectRef(ret);
     return ret;
 }
 
@@ -188,6 +189,8 @@ virNetworkObjFindByUUID(virNetworkObjListPtr nets,
     virObjectLock(nets);
     ret = virNetworkObjFindByUUIDLocked(nets, uuid);
     virObjectUnlock(nets);
+    if (ret)
+        virObjectLock(ret);
     return ret;
 }
 
@@ -214,7 +217,7 @@ virNetworkObjFindByNameLocked(virNetworkObjListPtr nets,
 
     ret = virHashSearch(nets->objs, virNetworkObjSearchName, name);
     if (ret)
-        virObjectLock(ret);
+        virObjectRef(ret);
     return ret;
 }
 
@@ -227,6 +230,8 @@ virNetworkObjFindByName(virNetworkObjListPtr nets,
     virObjectLock(nets);
     ret = virNetworkObjFindByNameLocked(nets, name);
     virObjectUnlock(nets);
+    if (ret)
+        virObjectLock(ret);
     return ret;
 }
 
@@ -491,6 +496,7 @@ virNetworkAssignDef(virNetworkObjListPtr nets,
     virObjectLock(nets);
     if ((network = virNetworkObjFindByNameLocked(nets, def->name))) {
         virObjectUnlock(nets);
+        virObjectLock(network);
         virNetworkObjAssignDef(network, def, live);
         return network;
     }
@@ -507,13 +513,13 @@ virNetworkAssignDef(virNetworkObjListPtr nets,
 
     network->def = def;
     network->persistent = !live;
+    virObjectRef(network);
     virObjectUnlock(nets);
     return network;
 
  error:
     virObjectUnlock(nets);
-    virObjectUnlock(network);
-    virObjectUnref(network);
+    virNetworkObjEndAPI(&network);
     return NULL;
 
 }
@@ -687,7 +693,6 @@ void virNetworkRemoveInactive(virNetworkObjListPtr nets,
     virObjectLock(nets);
     virObjectLock(net);
     virHashRemoveEntry(nets->objs, uuidstr);
-    virObjectUnlock(net);
     virObjectUnlock(nets);
     virObjectUnref(net);
 }
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 97fda3f..5ef9910 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -2939,7 +2939,6 @@ static virNetworkPtr networkCreateXML(virConnectPtr conn, const char *xml)
     if (networkStartNetwork(network) < 0) {
         virNetworkRemoveInactive(driver->networks,
                                  network);
-        network = NULL;
         goto cleanup;
     }
 
@@ -2988,7 +2987,6 @@ static virNetworkPtr networkDefineXML(virConnectPtr conn, const char *xml)
     if (virNetworkSaveConfig(driver->networkConfigDir, def) < 0) {
         if (!virNetworkObjIsActive(network)) {
             virNetworkRemoveInactive(driver->networks, network);
-            network = NULL;
             goto cleanup;
         }
         /* if network was active already, just undo new persistent
@@ -3053,11 +3051,8 @@ networkUndefine(virNetworkPtr net)
 
     VIR_INFO("Undefining network '%s'", network->def->name);
     if (!active) {
-        if (networkRemoveInactive(network) < 0) {
-            network = NULL;
+        if (networkRemoveInactive(network) < 0)
             goto cleanup;
-        }
-        network = NULL;
     } else {
 
         /* if the network still exists, it was active, and we need to make
@@ -3314,13 +3309,10 @@ static int networkDestroy(virNetworkPtr net)
                                         VIR_NETWORK_EVENT_STOPPED,
                                         0);
 
-    if (!network->persistent) {
-        if (networkRemoveInactive(network) < 0) {
-            network = NULL;
-            ret = -1;
-            goto cleanup;
-        }
-        network = NULL;
+    if (!network->persistent &&
+        networkRemoveInactive(network) < 0) {
+        ret = -1;
+        goto cleanup;
     }
 
  cleanup:
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 72f40ed..90af80a 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -787,7 +787,7 @@ testOpenDefault(virConnectPtr conn)
         goto error;
     }
     netobj->active = 1;
-    virObjectUnlock(netobj);
+    virNetworkObjEndAPI(&netobj);
 
     if (!(interfacedef = virInterfaceDefParseString(defaultInterfaceXML)))
         goto error;
@@ -1155,7 +1155,7 @@ testParseNetworks(testConnPtr privconn,
         }
 
         obj->active = 1;
-        virObjectUnlock(obj);
+        virNetworkObjEndAPI(&obj);
     }
 
     ret = 0;
@@ -3733,7 +3733,6 @@ static int testNetworkUndefine(virNetworkPtr network)
                                         0);
 
     virNetworkRemoveInactive(privconn->networks, privnet);
-    privnet = NULL;
     ret = 0;
 
  cleanup:
@@ -3847,10 +3846,9 @@ static int testNetworkDestroy(virNetworkPtr network)
     event = virNetworkEventLifecycleNew(privnet->def->name, privnet->def->uuid,
                                         VIR_NETWORK_EVENT_STOPPED,
                                         0);
-    if (!privnet->persistent) {
+    if (!privnet->persistent)
         virNetworkRemoveInactive(privconn->networks, privnet);
-        privnet = NULL;
-    }
+
     ret = 0;
 
  cleanup:
-- 
2.0.5




More information about the libvir-list mailing list