]> xenbits.xensource.com Git - libvirt.git/commitdiff
interface: Make _virInterfaceObjList virObjectRWLockable
authorJohn Ferlan <jferlan@redhat.com>
Thu, 19 Oct 2017 15:51:22 +0000 (11:51 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Thu, 19 Oct 2017 19:39:44 +0000 (15:39 -0400)
Modify the allocation to be a real RWLockable object and add the
various RWLock{Read|Write} and RWUnlock calls to process the list
of interfaces.

src/conf/virinterfaceobj.c
src/conf/virinterfaceobj.h
src/libvirt_private.syms
src/test/test_driver.c

index e993b929d70418ae708d261d939c929b13dbf1d2..e15e46583c37ccf4d889a524a533facf823824f1 100644 (file)
@@ -40,6 +40,8 @@ struct _virInterfaceObj {
 };
 
 struct _virInterfaceObjList {
+    virObjectRWLockable parent;
+
     size_t count;
     virInterfaceObjPtr *objs;
 };
@@ -47,7 +49,9 @@ struct _virInterfaceObjList {
 /* virInterfaceObj manipulation */
 
 static virClassPtr virInterfaceObjClass;
+static virClassPtr virInterfaceObjListClass;
 static void virInterfaceObjDispose(void *obj);
+static void virInterfaceObjListDispose(void *obj);
 
 static int
 virInterfaceObjOnceInit(void)
@@ -58,6 +62,12 @@ virInterfaceObjOnceInit(void)
                                              virInterfaceObjDispose)))
         return -1;
 
+    if (!(virInterfaceObjListClass = virClassNew(virClassForObjectRWLockable(),
+                                                 "virInterfaceObjList",
+                                                 sizeof(virInterfaceObjList),
+                                                 virInterfaceObjListDispose)))
+        return -1;
+
     return 0;
 }
 
@@ -130,8 +140,12 @@ virInterfaceObjListNew(void)
 {
     virInterfaceObjListPtr interfaces;
 
-    if (VIR_ALLOC(interfaces) < 0)
+    if (virInterfaceObjInitialize() < 0)
+        return NULL;
+
+    if (!(interfaces = virObjectRWLockableNew(virInterfaceObjListClass)))
         return NULL;
+
     return interfaces;
 }
 
@@ -145,6 +159,7 @@ virInterfaceObjListFindByMACString(virInterfaceObjListPtr interfaces,
     size_t i;
     int matchct = 0;
 
+    virObjectRWLockRead(interfaces);
     for (i = 0; i < interfaces->count; i++) {
         virInterfaceObjPtr obj = interfaces->objs[i];
         virInterfaceDefPtr def;
@@ -162,11 +177,13 @@ virInterfaceObjListFindByMACString(virInterfaceObjListPtr interfaces,
         }
         virObjectUnlock(obj);
     }
+    virObjectRWUnlock(interfaces);
     return matchct;
 
  error:
     while (--matchct >= 0)
         VIR_FREE(matches[matchct]);
+    virObjectRWUnlock(interfaces);
 
     return -1;
 }
@@ -178,30 +195,34 @@ virInterfaceObjListFindByName(virInterfaceObjListPtr interfaces,
 {
     size_t i;
 
+    virObjectRWLockRead(interfaces);
     for (i = 0; i < interfaces->count; i++) {
         virInterfaceObjPtr obj = interfaces->objs[i];
         virInterfaceDefPtr def;
 
         virObjectLock(obj);
         def = obj->def;
-        if (STREQ(def->name, name))
+        if (STREQ(def->name, name)) {
+            virObjectRWUnlock(interfaces);
             return virObjectRef(obj);
+        }
         virObjectUnlock(obj);
     }
+    virObjectRWUnlock(interfaces);
 
     return NULL;
 }
 
 
 void
-virInterfaceObjListFree(virInterfaceObjListPtr interfaces)
+virInterfaceObjListDispose(void *obj)
 {
     size_t i;
+    virInterfaceObjListPtr interfaces = obj;
 
     for (i = 0; i < interfaces->count; i++)
         virObjectUnref(interfaces->objs[i]);
     VIR_FREE(interfaces->objs);
-    VIR_FREE(interfaces);
 }
 
 
@@ -218,6 +239,7 @@ virInterfaceObjListClone(virInterfaceObjListPtr interfaces)
     if (!(dest = virInterfaceObjListNew()))
         return NULL;
 
+    virObjectRWLockRead(interfaces);
     cnt = interfaces->count;
     for (i = 0; i < cnt; i++) {
         virInterfaceObjPtr srcobj = interfaces->objs[i];
@@ -238,11 +260,13 @@ virInterfaceObjListClone(virInterfaceObjListPtr interfaces)
             goto error;
         virInterfaceObjEndAPI(&obj);
     }
+    virObjectRWUnlock(interfaces);
 
     return dest;
 
  error:
-    virInterfaceObjListFree(dest);
+    virObjectUnref(dest);
+    virObjectRWUnlock(interfaces);
     return NULL;
 }
 
@@ -263,12 +287,15 @@ virInterfaceObjListAssignDef(virInterfaceObjListPtr interfaces,
     if (!(obj = virInterfaceObjNew()))
         return NULL;
 
+    virObjectRWLockWrite(interfaces);
     if (VIR_APPEND_ELEMENT_COPY(interfaces->objs,
                                 interfaces->count, obj) < 0) {
         virInterfaceObjEndAPI(&obj);
+        virObjectRWUnlock(interfaces);
         return NULL;
     }
     obj->def = def;
+    virObjectRWUnlock(interfaces);
     return virObjectRef(obj);
 }
 
@@ -280,6 +307,7 @@ virInterfaceObjListRemove(virInterfaceObjListPtr interfaces,
     size_t i;
 
     virObjectUnlock(obj);
+    virObjectRWLockWrite(interfaces);
     for (i = 0; i < interfaces->count; i++) {
         virObjectLock(interfaces->objs[i]);
         if (interfaces->objs[i] == obj) {
@@ -291,6 +319,7 @@ virInterfaceObjListRemove(virInterfaceObjListPtr interfaces,
         }
         virObjectUnlock(interfaces->objs[i]);
     }
+    virObjectRWUnlock(interfaces);
 }
 
 
@@ -301,6 +330,7 @@ virInterfaceObjListNumOfInterfaces(virInterfaceObjListPtr interfaces,
     size_t i;
     int ninterfaces = 0;
 
+    virObjectRWLockRead(interfaces);
     for (i = 0; (i < interfaces->count); i++) {
         virInterfaceObjPtr obj = interfaces->objs[i];
         virObjectLock(obj);
@@ -308,6 +338,7 @@ virInterfaceObjListNumOfInterfaces(virInterfaceObjListPtr interfaces,
             ninterfaces++;
         virObjectUnlock(obj);
     }
+    virObjectRWUnlock(interfaces);
 
     return ninterfaces;
 }
@@ -322,6 +353,7 @@ virInterfaceObjListGetNames(virInterfaceObjListPtr interfaces,
     int nnames = 0;
     size_t i;
 
+    virObjectRWLockRead(interfaces);
     for (i = 0; i < interfaces->count && nnames < maxnames; i++) {
         virInterfaceObjPtr obj = interfaces->objs[i];
         virInterfaceDefPtr def;
@@ -337,6 +369,7 @@ virInterfaceObjListGetNames(virInterfaceObjListPtr interfaces,
         }
         virObjectUnlock(obj);
     }
+    virObjectRWUnlock(interfaces);
 
     return nnames;
 
index 2b9e1b2325b9ba2a5b871d454df743623cd6c479..799d38038f381af34689447541f42898ec80e111 100644 (file)
@@ -57,9 +57,6 @@ virInterfaceObjListFindByName(virInterfaceObjListPtr interfaces,
 void
 virInterfaceObjFree(virInterfaceObjPtr obj);
 
-void
-virInterfaceObjListFree(virInterfaceObjListPtr vms);
-
 virInterfaceObjListPtr
 virInterfaceObjListClone(virInterfaceObjListPtr interfaces);
 
index 345643915916e3d0893d6f62ad2baec1091c8b19..4f076827b3a46947071258cfa699ad7145f81c70 100644 (file)
@@ -936,7 +936,6 @@ virInterfaceObjListAssignDef;
 virInterfaceObjListClone;
 virInterfaceObjListFindByMACString;
 virInterfaceObjListFindByName;
-virInterfaceObjListFree;
 virInterfaceObjListGetNames;
 virInterfaceObjListNew;
 virInterfaceObjListNumOfInterfaces;
index 8e9e31145f9190bcae8bf0b1c7d5b7c42c38b1d5..dbde37cf39afcd5d58bb46faef1909e14b8f51de 100644 (file)
@@ -154,7 +154,7 @@ testDriverFree(testDriverPtr driver)
     virObjectUnref(driver->domains);
     virNodeDeviceObjListFree(driver->devs);
     virObjectUnref(driver->networks);
-    virInterfaceObjListFree(driver->ifaces);
+    virObjectUnref(driver->ifaces);
     virStoragePoolObjListFree(&driver->pools);
     virObjectUnref(driver->eventState);
     virMutexUnlock(&driver->lock);
@@ -3878,7 +3878,7 @@ testInterfaceChangeCommit(virConnectPtr conn,
         goto cleanup;
     }
 
-    virInterfaceObjListFree(privconn->backupIfaces);
+    virObjectUnref(privconn->backupIfaces);
     privconn->transaction_running = false;
 
     ret = 0;
@@ -3908,7 +3908,7 @@ testInterfaceChangeRollback(virConnectPtr conn,
         goto cleanup;
     }
 
-    virInterfaceObjListFree(privconn->ifaces);
+    virObjectUnref(privconn->ifaces);
     privconn->ifaces = privconn->backupIfaces;
     privconn->backupIfaces = NULL;