]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
interface: Convert virInterfaceObj to use virObjectLockable
authorJohn Ferlan <jferlan@redhat.com>
Mon, 15 May 2017 18:31:44 +0000 (14:31 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Tue, 6 Jun 2017 16:05:00 +0000 (12:05 -0400)
Now that we have a bit more control, let's convert our object into
a lockable object and let that magic handle the create and lock/unlock.

This commit also introduces virInterfaceObjEndAPI in order to handle the
lock unlock and object unref in one call for consumers returning a NULL
obj upon return. This removes the need for virInterfaceObj{Lock|Unlock}
external API's.

Signed-off-by: John Ferlan <jferlan@redhat.com>
po/POTFILES.in
src/conf/virinterfaceobj.c
src/conf/virinterfaceobj.h
src/libvirt_private.syms
src/test/test_driver.c

index 142b4d3373b78dc6ad22273f9b50a482151cf012..923d64727b6036508e285a9b004a4f1c0ada834b 100644 (file)
@@ -44,7 +44,6 @@ src/conf/storage_adapter_conf.c
 src/conf/storage_conf.c
 src/conf/virchrdev.c
 src/conf/virdomainobjlist.c
-src/conf/virinterfaceobj.c
 src/conf/virnetworkobj.c
 src/conf/virnodedeviceobj.c
 src/conf/virnwfilterobj.c
index 159fcb292cd477888739168579bec6980ab81706..106f2321595d73a465cb9ba622aeede6cf22c72f 100644 (file)
@@ -33,7 +33,7 @@
 VIR_LOG_INIT("conf.virinterfaceobj");
 
 struct _virInterfaceObj {
-    virMutex lock;
+    virObjectLockable parent;
 
     bool active;           /* true if interface is active (up) */
     virInterfaceDefPtr def; /* The interface definition */
@@ -46,22 +46,45 @@ struct _virInterfaceObjList {
 
 /* virInterfaceObj manipulation */
 
+static virClassPtr virInterfaceObjClass;
+static void virInterfaceObjDispose(void *obj);
+
+static int
+virInterfaceObjOnceInit(void)
+{
+    if (!(virInterfaceObjClass = virClassNew(virClassForObjectLockable(),
+                                             "virInterfaceObj",
+                                             sizeof(virInterfaceObj),
+                                             virInterfaceObjDispose)))
+        return -1;
+
+    return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virInterfaceObj)
+
+
+static void
+virInterfaceObjDispose(void *opaque)
+{
+    virInterfaceObjPtr obj = opaque;
+
+    virInterfaceDefFree(obj->def);
+}
+
+
 static virInterfaceObjPtr
 virInterfaceObjNew(virInterfaceDefPtr def)
 {
     virInterfaceObjPtr obj;
 
-    if (VIR_ALLOC(obj) < 0)
+    if (virInterfaceObjInitialize() < 0)
         return NULL;
 
-    if (virMutexInit(&obj->lock) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "%s", _("cannot initialize mutex"));
-        VIR_FREE(obj);
+    if (!(obj = virObjectLockableNew(virInterfaceObjClass)))
         return NULL;
-    }
 
-    virInterfaceObjLock(obj);
+    virObjectLock(obj);
     obj->def = def;
 
     return obj;
@@ -69,28 +92,14 @@ virInterfaceObjNew(virInterfaceDefPtr def)
 
 
 void
-virInterfaceObjLock(virInterfaceObjPtr obj)
+virInterfaceObjEndAPI(virInterfaceObjPtr *obj)
 {
-    virMutexLock(&obj->lock);
-}
-
-
-void
-virInterfaceObjUnlock(virInterfaceObjPtr obj)
-{
-    virMutexUnlock(&obj->lock);
-}
-
-
-void
-virInterfaceObjFree(virInterfaceObjPtr obj)
-{
-    if (!obj)
+    if (!*obj)
         return;
 
-    virInterfaceDefFree(obj->def);
-    virMutexDestroy(&obj->lock);
-    VIR_FREE(obj);
+    virObjectUnlock(*obj);
+    virObjectUnref(*obj);
+    *obj = NULL;
 }
 
 
@@ -141,18 +150,18 @@ virInterfaceObjListFindByMACString(virInterfaceObjListPtr interfaces,
         virInterfaceObjPtr obj = interfaces->objs[i];
         virInterfaceDefPtr def;
 
-        virInterfaceObjLock(obj);
+        virObjectLock(obj);
         def = obj->def;
         if (STRCASEEQ(def->mac, mac)) {
             if (matchct < maxmatches) {
                 if (VIR_STRDUP(matches[matchct], def->name) < 0) {
-                    virInterfaceObjUnlock(obj);
+                    virObjectUnlock(obj);
                     goto error;
                 }
                 matchct++;
             }
         }
-        virInterfaceObjUnlock(obj);
+        virObjectUnlock(obj);
     }
     return matchct;
 
@@ -174,11 +183,11 @@ virInterfaceObjListFindByName(virInterfaceObjListPtr interfaces,
         virInterfaceObjPtr obj = interfaces->objs[i];
         virInterfaceDefPtr def;
 
-        virInterfaceObjLock(obj);
+        virObjectLock(obj);
         def = obj->def;
         if (STREQ(def->name, name))
-            return obj;
-        virInterfaceObjUnlock(obj);
+            return virObjectRef(obj);
+        virObjectUnlock(obj);
     }
 
     return NULL;
@@ -191,7 +200,7 @@ virInterfaceObjListFree(virInterfaceObjListPtr interfaces)
     size_t i;
 
     for (i = 0; i < interfaces->count; i++)
-        virInterfaceObjFree(interfaces->objs[i]);
+        virObjectUnref(interfaces->objs[i]);
     VIR_FREE(interfaces->objs);
     VIR_FREE(interfaces);
 }
@@ -228,7 +237,7 @@ virInterfaceObjListClone(virInterfaceObjListPtr interfaces)
         VIR_FREE(xml);
         if (!(obj = virInterfaceObjListAssignDef(dest, backup)))
             goto error;
-        virInterfaceObjUnlock(obj); /* locked by virInterfaceObjListAssignDef */
+        virInterfaceObjEndAPI(&obj);
     }
 
     return dest;
@@ -258,13 +267,10 @@ virInterfaceObjListAssignDef(virInterfaceObjListPtr interfaces,
     if (VIR_APPEND_ELEMENT_COPY(interfaces->objs,
                                 interfaces->count, obj) < 0) {
         obj->def = NULL;
-        virInterfaceObjUnlock(obj);
-        virInterfaceObjFree(obj);
+        virInterfaceObjEndAPI(&obj);
         return NULL;
     }
-
-    return obj;
-
+    return virObjectRef(obj);
 }
 
 
@@ -274,17 +280,17 @@ virInterfaceObjListRemove(virInterfaceObjListPtr interfaces,
 {
     size_t i;
 
-    virInterfaceObjUnlock(obj);
+    virObjectUnlock(obj);
     for (i = 0; i < interfaces->count; i++) {
-        virInterfaceObjLock(interfaces->objs[i]);
+        virObjectLock(interfaces->objs[i]);
         if (interfaces->objs[i] == obj) {
-            virInterfaceObjUnlock(interfaces->objs[i]);
-            virInterfaceObjFree(interfaces->objs[i]);
+            virObjectUnlock(interfaces->objs[i]);
+            virObjectUnref(interfaces->objs[i]);
 
             VIR_DELETE_ELEMENT(interfaces->objs, i, interfaces->count);
             break;
         }
-        virInterfaceObjUnlock(interfaces->objs[i]);
+        virObjectUnlock(interfaces->objs[i]);
     }
 }
 
@@ -298,10 +304,10 @@ virInterfaceObjListNumOfInterfaces(virInterfaceObjListPtr interfaces,
 
     for (i = 0; (i < interfaces->count); i++) {
         virInterfaceObjPtr obj = interfaces->objs[i];
-        virInterfaceObjLock(obj);
+        virObjectLock(obj);
         if (wantActive == virInterfaceObjIsActive(obj))
             ninterfaces++;
-        virInterfaceObjUnlock(obj);
+        virObjectUnlock(obj);
     }
 
     return ninterfaces;
@@ -321,16 +327,16 @@ virInterfaceObjListGetNames(virInterfaceObjListPtr interfaces,
         virInterfaceObjPtr obj = interfaces->objs[i];
         virInterfaceDefPtr def;
 
-        virInterfaceObjLock(obj);
+        virObjectLock(obj);
         def = obj->def;
         if (wantActive == virInterfaceObjIsActive(obj)) {
             if (VIR_STRDUP(names[nnames], def->name) < 0) {
-                virInterfaceObjUnlock(obj);
+                virObjectUnlock(obj);
                 goto failure;
             }
             nnames++;
         }
-        virInterfaceObjUnlock(obj);
+        virObjectUnlock(obj);
     }
 
     return nnames;
index 3934e6395e8cdee67ed7c7d5365a3b8277acf76e..2b9e1b2325b9ba2a5b871d454df743623cd6c479 100644 (file)
@@ -28,6 +28,9 @@ typedef virInterfaceObj *virInterfaceObjPtr;
 typedef struct _virInterfaceObjList virInterfaceObjList;
 typedef virInterfaceObjList *virInterfaceObjListPtr;
 
+void
+virInterfaceObjEndAPI(virInterfaceObjPtr *obj);
+
 virInterfaceDefPtr
 virInterfaceObjGetDef(virInterfaceObjPtr obj);
 
@@ -68,12 +71,6 @@ void
 virInterfaceObjListRemove(virInterfaceObjListPtr interfaces,
                           virInterfaceObjPtr obj);
 
-void
-virInterfaceObjLock(virInterfaceObjPtr obj);
-
-void
-virInterfaceObjUnlock(virInterfaceObjPtr obj);
-
 typedef bool
 (*virInterfaceObjListFilter)(virConnectPtr conn,
                              virInterfaceDefPtr def);
index 886245c244fcade1e73ae9f38d98749221765649..bde01a3fa545e91fb3f5046e0ce4eeaf71f52519 100644 (file)
@@ -912,6 +912,7 @@ virDomainObjListRename;
 
 
 # conf/virinterfaceobj.h
+virInterfaceObjEndAPI;
 virInterfaceObjGetDef;
 virInterfaceObjIsActive;
 virInterfaceObjListAssignDef;
@@ -923,9 +924,7 @@ virInterfaceObjListGetNames;
 virInterfaceObjListNew;
 virInterfaceObjListNumOfInterfaces;
 virInterfaceObjListRemove;
-virInterfaceObjLock;
 virInterfaceObjSetActive;
-virInterfaceObjUnlock;
 
 
 # conf/virnetworkobj.h
index 604f09b195cd4846bb7c5db5ba1f99cdbb0dc300..338b7d35dd8f56dc03f2e972aa04cc950d4af3e1 100644 (file)
@@ -1027,7 +1027,7 @@ testParseInterfaces(testDriverPtr privconn,
         }
 
         virInterfaceObjSetActive(obj, true);
-        virInterfaceObjUnlock(obj);
+        virInterfaceObjEndAPI(&obj);
     }
 
     ret = 0;
@@ -3718,7 +3718,7 @@ testInterfaceLookupByName(virConnectPtr conn,
 
     ret = virGetInterface(conn, def->name, def->mac);
 
-    virInterfaceObjUnlock(obj);
+    virInterfaceObjEndAPI(&obj);
     return ret;
 }
 
@@ -3769,7 +3769,7 @@ testInterfaceIsActive(virInterfacePtr iface)
 
     ret = virInterfaceObjIsActive(obj);
 
-    virInterfaceObjUnlock(obj);
+    virInterfaceObjEndAPI(&obj);
     return ret;
 }
 
@@ -3881,7 +3881,7 @@ testInterfaceGetXMLDesc(virInterfacePtr iface,
 
     ret = virInterfaceDefFormat(def);
 
-    virInterfaceObjUnlock(obj);
+    virInterfaceObjEndAPI(&obj);
     return ret;
 }
 
@@ -3912,8 +3912,7 @@ testInterfaceDefineXML(virConnectPtr conn,
 
  cleanup:
     virInterfaceDefFree(def);
-    if (obj)
-        virInterfaceObjUnlock(obj);
+    virInterfaceObjEndAPI(&obj);
     testDriverUnlock(privconn);
     return ret;
 }
@@ -3929,6 +3928,7 @@ testInterfaceUndefine(virInterfacePtr iface)
         return -1;
 
     virInterfaceObjListRemove(privconn->ifaces, obj);
+    virObjectUnref(obj);
 
     return 0;
 }
@@ -3956,7 +3956,7 @@ testInterfaceCreate(virInterfacePtr iface,
     ret = 0;
 
  cleanup:
-    virInterfaceObjUnlock(obj);
+    virInterfaceObjEndAPI(&obj);
     return ret;
 }
 
@@ -3983,7 +3983,7 @@ testInterfaceDestroy(virInterfacePtr iface,
     ret = 0;
 
  cleanup:
-    virInterfaceObjUnlock(obj);
+    virInterfaceObjEndAPI(&obj);
     return ret;
 }