[libvirt] [PATCH 1/4] conf: Introduce virinterfaceobj

John Ferlan jferlan at redhat.com
Sat Mar 4 13:12:32 UTC 2017


Move all the InterfaceObj API's into their own module virinterfaceobj
from the interface_conf

Purely code motion at this point.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 po/POTFILES.in                          |   1 +
 src/Makefile.am                         |   3 +-
 src/conf/interface_conf.c               | 166 --------------------------
 src/conf/interface_conf.h               |  45 -------
 src/conf/virinterfaceobj.c              | 201 ++++++++++++++++++++++++++++++++
 src/conf/virinterfaceobj.h              |  70 +++++++++++
 src/interface/interface_backend_netcf.c |   1 +
 src/interface/interface_backend_udev.c  |   1 +
 src/libvirt_private.syms                |  19 +--
 src/test/test_driver.c                  |   1 +
 10 files changed, 288 insertions(+), 220 deletions(-)
 create mode 100644 src/conf/virinterfaceobj.c
 create mode 100644 src/conf/virinterfaceobj.h

diff --git a/po/POTFILES.in b/po/POTFILES.in
index 7c7f530..50289a5 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -42,6 +42,7 @@ src/conf/snapshot_conf.c
 src/conf/storage_conf.c
 src/conf/virchrdev.c
 src/conf/virdomainobjlist.c
+src/conf/virinterfaceobj.c
 src/conf/virnodedeviceobj.c
 src/conf/virsecretobj.c
 src/cpu/cpu.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 7d42eac..c85927f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -381,7 +381,8 @@ STORAGE_CONF_SOURCES =                                         \
 
 # Interface driver generic impl APIs
 INTERFACE_CONF_SOURCES =                                       \
-		conf/interface_conf.c conf/interface_conf.h
+		conf/interface_conf.c conf/interface_conf.h    \
+		conf/virinterfaceobj.c conf/virinterfaceobj.h
 
 # Secret driver generic impl APIs
 SECRET_CONF_SOURCES =                                          \
diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c
index e1e6a25..dc2ddd4 100644
--- a/src/conf/interface_conf.c
+++ b/src/conf/interface_conf.c
@@ -1114,169 +1114,3 @@ char *virInterfaceDefFormat(const virInterfaceDef *def)
     }
     return virBufferContentAndReset(&buf);
 }
-
-/* virInterfaceObj manipulation */
-
-void virInterfaceObjLock(virInterfaceObjPtr obj)
-{
-    virMutexLock(&obj->lock);
-}
-
-void virInterfaceObjUnlock(virInterfaceObjPtr obj)
-{
-    virMutexUnlock(&obj->lock);
-}
-
-void virInterfaceObjFree(virInterfaceObjPtr iface)
-{
-    if (!iface)
-        return;
-
-    virInterfaceDefFree(iface->def);
-    virMutexDestroy(&iface->lock);
-    VIR_FREE(iface);
-}
-
-/* virInterfaceObjList manipulation */
-
-int virInterfaceFindByMACString(virInterfaceObjListPtr interfaces,
-                                const char *mac,
-                                virInterfaceObjPtr *matches, int maxmatches)
-{
-    size_t i;
-    unsigned int matchct = 0;
-
-    for (i = 0; i < interfaces->count; i++) {
-
-        virInterfaceObjLock(interfaces->objs[i]);
-        if (STRCASEEQ(interfaces->objs[i]->def->mac, mac)) {
-            matchct++;
-            if (matchct <= maxmatches) {
-                matches[matchct - 1] = interfaces->objs[i];
-                /* keep the lock if we're returning object to caller */
-                /* it is the caller's responsibility to unlock *all* matches */
-                continue;
-            }
-        }
-        virInterfaceObjUnlock(interfaces->objs[i]);
-
-    }
-    return matchct;
-}
-
-virInterfaceObjPtr virInterfaceFindByName(virInterfaceObjListPtr interfaces,
-                                          const char *name)
-{
-    size_t i;
-
-    for (i = 0; i < interfaces->count; i++) {
-        virInterfaceObjLock(interfaces->objs[i]);
-        if (STREQ(interfaces->objs[i]->def->name, name))
-            return interfaces->objs[i];
-        virInterfaceObjUnlock(interfaces->objs[i]);
-    }
-
-    return NULL;
-}
-
-void virInterfaceObjListFree(virInterfaceObjListPtr interfaces)
-{
-    size_t i;
-
-    for (i = 0; i < interfaces->count; i++)
-        virInterfaceObjFree(interfaces->objs[i]);
-
-    VIR_FREE(interfaces->objs);
-    interfaces->count = 0;
-}
-
-int virInterfaceObjListClone(virInterfaceObjListPtr src,
-                             virInterfaceObjListPtr dest)
-{
-    int ret = -1;
-    size_t i;
-    unsigned int cnt;
-
-    if (!src || !dest)
-        goto cleanup;
-
-    virInterfaceObjListFree(dest); /* start with an empty list */
-    cnt = src->count;
-    for (i = 0; i < cnt; i++) {
-        virInterfaceDefPtr def = src->objs[i]->def;
-        virInterfaceDefPtr backup;
-        virInterfaceObjPtr iface;
-        char *xml = virInterfaceDefFormat(def);
-
-        if (!xml)
-            goto cleanup;
-
-        if ((backup = virInterfaceDefParseString(xml)) == NULL) {
-            VIR_FREE(xml);
-            goto cleanup;
-        }
-
-        VIR_FREE(xml);
-        if ((iface = virInterfaceAssignDef(dest, backup)) == NULL)
-            goto cleanup;
-        virInterfaceObjUnlock(iface); /* was locked by virInterfaceAssignDef */
-    }
-
-    ret = cnt;
- cleanup:
-    if ((ret < 0) && dest)
-       virInterfaceObjListFree(dest);
-    return ret;
-}
-
-virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces,
-                                         virInterfaceDefPtr def)
-{
-    virInterfaceObjPtr iface;
-
-    if ((iface = virInterfaceFindByName(interfaces, def->name))) {
-        virInterfaceDefFree(iface->def);
-        iface->def = def;
-
-        return iface;
-    }
-
-    if (VIR_ALLOC(iface) < 0)
-        return NULL;
-    if (virMutexInit(&iface->lock) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "%s", _("cannot initialize mutex"));
-        VIR_FREE(iface);
-        return NULL;
-    }
-    virInterfaceObjLock(iface);
-
-    if (VIR_APPEND_ELEMENT_COPY(interfaces->objs,
-                                interfaces->count, iface) < 0) {
-        virInterfaceObjFree(iface);
-        return NULL;
-    }
-
-    iface->def = def;
-    return iface;
-
-}
-
-void virInterfaceRemove(virInterfaceObjListPtr interfaces,
-                        virInterfaceObjPtr iface)
-{
-    size_t i;
-
-    virInterfaceObjUnlock(iface);
-    for (i = 0; i < interfaces->count; i++) {
-        virInterfaceObjLock(interfaces->objs[i]);
-        if (interfaces->objs[i] == iface) {
-            virInterfaceObjUnlock(interfaces->objs[i]);
-            virInterfaceObjFree(interfaces->objs[i]);
-
-            VIR_DELETE_ELEMENT(interfaces->objs, i, interfaces->count);
-            break;
-        }
-        virInterfaceObjUnlock(interfaces->objs[i]);
-    }
-}
diff --git a/src/conf/interface_conf.h b/src/conf/interface_conf.h
index 2523207..7325d65 100644
--- a/src/conf/interface_conf.h
+++ b/src/conf/interface_conf.h
@@ -161,46 +161,7 @@ struct _virInterfaceDef {
     virInterfaceProtocolDefPtr *protos; /* ptr to array of protos[nprotos] */
 };
 
-typedef struct _virInterfaceObj virInterfaceObj;
-typedef virInterfaceObj *virInterfaceObjPtr;
-struct _virInterfaceObj {
-    virMutex lock;
-
-    bool active;           /* true if interface is active (up) */
-    virInterfaceDefPtr def; /* The interface definition */
-};
-
-typedef struct _virInterfaceObjList virInterfaceObjList;
-typedef virInterfaceObjList *virInterfaceObjListPtr;
-struct _virInterfaceObjList {
-    size_t count;
-    virInterfaceObjPtr *objs;
-};
-
-static inline bool
-virInterfaceObjIsActive(const virInterfaceObj *iface)
-{
-    return iface->active;
-}
-
-int virInterfaceFindByMACString(virInterfaceObjListPtr interfaces,
-                                const char *mac,
-                                virInterfaceObjPtr *matches, int maxmatches);
-virInterfaceObjPtr virInterfaceFindByName(virInterfaceObjListPtr interfaces,
-                                          const char *name);
-
-
 void virInterfaceDefFree(virInterfaceDefPtr def);
-void virInterfaceObjFree(virInterfaceObjPtr iface);
-void virInterfaceObjListFree(virInterfaceObjListPtr vms);
-int virInterfaceObjListClone(virInterfaceObjListPtr src,
-                             virInterfaceObjListPtr dest);
-
-
-virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces,
-                                         virInterfaceDefPtr def);
-void virInterfaceRemove(virInterfaceObjListPtr interfaces,
-                        virInterfaceObjPtr iface);
 
 virInterfaceDefPtr virInterfaceDefParseString(const char *xmlStr);
 virInterfaceDefPtr virInterfaceDefParseFile(const char *filename);
@@ -209,12 +170,6 @@ virInterfaceDefPtr virInterfaceDefParseNode(xmlDocPtr xml,
 
 char *virInterfaceDefFormat(const virInterfaceDef *def);
 
-void virInterfaceObjLock(virInterfaceObjPtr obj);
-void virInterfaceObjUnlock(virInterfaceObjPtr obj);
-
-typedef bool (*virInterfaceObjListFilter)(virConnectPtr conn,
-                                          virInterfaceDefPtr def);
-
 # define VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE   \
                 (VIR_CONNECT_LIST_INTERFACES_ACTIVE | \
                  VIR_CONNECT_LIST_INTERFACES_INACTIVE)
diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c
new file mode 100644
index 0000000..6c18911
--- /dev/null
+++ b/src/conf/virinterfaceobj.c
@@ -0,0 +1,201 @@
+/*
+ * virinterfaceobj.c: interface object handling
+ *                    (derived from interface_conf.c)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include "datatypes.h"
+#include "interface_conf.h"
+
+#include "viralloc.h"
+#include "virerror.h"
+#include "virinterfaceobj.h"
+#include "virlog.h"
+#include "virstring.h"
+
+#define VIR_FROM_THIS VIR_FROM_INTERFACE
+
+VIR_LOG_INIT("conf.virinterfaceobj");
+
+
+
+/* virInterfaceObj manipulation */
+
+void virInterfaceObjLock(virInterfaceObjPtr obj)
+{
+    virMutexLock(&obj->lock);
+}
+
+void virInterfaceObjUnlock(virInterfaceObjPtr obj)
+{
+    virMutexUnlock(&obj->lock);
+}
+
+void virInterfaceObjFree(virInterfaceObjPtr iface)
+{
+    if (!iface)
+        return;
+
+    virInterfaceDefFree(iface->def);
+    virMutexDestroy(&iface->lock);
+    VIR_FREE(iface);
+}
+
+/* virInterfaceObjList manipulation */
+
+int virInterfaceFindByMACString(virInterfaceObjListPtr interfaces,
+                                const char *mac,
+                                virInterfaceObjPtr *matches, int maxmatches)
+{
+    size_t i;
+    unsigned int matchct = 0;
+
+    for (i = 0; i < interfaces->count; i++) {
+
+        virInterfaceObjLock(interfaces->objs[i]);
+        if (STRCASEEQ(interfaces->objs[i]->def->mac, mac)) {
+            matchct++;
+            if (matchct <= maxmatches) {
+                matches[matchct - 1] = interfaces->objs[i];
+                /* keep the lock if we're returning object to caller */
+                /* it is the caller's responsibility to unlock *all* matches */
+                continue;
+            }
+        }
+        virInterfaceObjUnlock(interfaces->objs[i]);
+
+    }
+    return matchct;
+}
+
+virInterfaceObjPtr virInterfaceFindByName(virInterfaceObjListPtr interfaces,
+                                          const char *name)
+{
+    size_t i;
+
+    for (i = 0; i < interfaces->count; i++) {
+        virInterfaceObjLock(interfaces->objs[i]);
+        if (STREQ(interfaces->objs[i]->def->name, name))
+            return interfaces->objs[i];
+        virInterfaceObjUnlock(interfaces->objs[i]);
+    }
+
+    return NULL;
+}
+
+void virInterfaceObjListFree(virInterfaceObjListPtr interfaces)
+{
+    size_t i;
+
+    for (i = 0; i < interfaces->count; i++)
+        virInterfaceObjFree(interfaces->objs[i]);
+
+    VIR_FREE(interfaces->objs);
+    interfaces->count = 0;
+}
+
+int virInterfaceObjListClone(virInterfaceObjListPtr src,
+                             virInterfaceObjListPtr dest)
+{
+    int ret = -1;
+    size_t i;
+    unsigned int cnt;
+
+    if (!src || !dest)
+        goto cleanup;
+
+    virInterfaceObjListFree(dest); /* start with an empty list */
+    cnt = src->count;
+    for (i = 0; i < cnt; i++) {
+        virInterfaceDefPtr def = src->objs[i]->def;
+        virInterfaceDefPtr backup;
+        virInterfaceObjPtr iface;
+        char *xml = virInterfaceDefFormat(def);
+
+        if (!xml)
+            goto cleanup;
+
+        if ((backup = virInterfaceDefParseString(xml)) == NULL) {
+            VIR_FREE(xml);
+            goto cleanup;
+        }
+
+        VIR_FREE(xml);
+        if ((iface = virInterfaceAssignDef(dest, backup)) == NULL)
+            goto cleanup;
+        virInterfaceObjUnlock(iface); /* was locked by virInterfaceAssignDef */
+    }
+
+    ret = cnt;
+ cleanup:
+    if ((ret < 0) && dest)
+       virInterfaceObjListFree(dest);
+    return ret;
+}
+
+virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces,
+                                         virInterfaceDefPtr def)
+{
+    virInterfaceObjPtr iface;
+
+    if ((iface = virInterfaceFindByName(interfaces, def->name))) {
+        virInterfaceDefFree(iface->def);
+        iface->def = def;
+
+        return iface;
+    }
+
+    if (VIR_ALLOC(iface) < 0)
+        return NULL;
+    if (virMutexInit(&iface->lock) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       "%s", _("cannot initialize mutex"));
+        VIR_FREE(iface);
+        return NULL;
+    }
+    virInterfaceObjLock(iface);
+
+    if (VIR_APPEND_ELEMENT_COPY(interfaces->objs,
+                                interfaces->count, iface) < 0) {
+        virInterfaceObjFree(iface);
+        return NULL;
+    }
+
+    iface->def = def;
+    return iface;
+
+}
+
+void virInterfaceRemove(virInterfaceObjListPtr interfaces,
+                        virInterfaceObjPtr iface)
+{
+    size_t i;
+
+    virInterfaceObjUnlock(iface);
+    for (i = 0; i < interfaces->count; i++) {
+        virInterfaceObjLock(interfaces->objs[i]);
+        if (interfaces->objs[i] == iface) {
+            virInterfaceObjUnlock(interfaces->objs[i]);
+            virInterfaceObjFree(interfaces->objs[i]);
+
+            VIR_DELETE_ELEMENT(interfaces->objs, i, interfaces->count);
+            break;
+        }
+        virInterfaceObjUnlock(interfaces->objs[i]);
+    }
+}
diff --git a/src/conf/virinterfaceobj.h b/src/conf/virinterfaceobj.h
new file mode 100644
index 0000000..51d7c75
--- /dev/null
+++ b/src/conf/virinterfaceobj.h
@@ -0,0 +1,70 @@
+/*
+ * virinterfaceobj.h: interface object handling entry points
+ *                    (derived from interface_conf.h)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __VIRINTERFACEOBJ_H__
+# define __VIRINTERFACEOBJ_H__
+
+# include "internal.h"
+
+typedef struct _virInterfaceObj virInterfaceObj;
+typedef virInterfaceObj *virInterfaceObjPtr;
+struct _virInterfaceObj {
+    virMutex lock;
+
+    bool active;           /* true if interface is active (up) */
+    virInterfaceDefPtr def; /* The interface definition */
+};
+
+typedef struct _virInterfaceObjList virInterfaceObjList;
+typedef virInterfaceObjList *virInterfaceObjListPtr;
+struct _virInterfaceObjList {
+    size_t count;
+    virInterfaceObjPtr *objs;
+};
+
+static inline bool
+virInterfaceObjIsActive(const virInterfaceObj *iface)
+{
+    return iface->active;
+}
+
+int virInterfaceFindByMACString(virInterfaceObjListPtr interfaces,
+                                const char *mac,
+                                virInterfaceObjPtr *matches, int maxmatches);
+virInterfaceObjPtr virInterfaceFindByName(virInterfaceObjListPtr interfaces,
+                                          const char *name);
+
+
+void virInterfaceObjFree(virInterfaceObjPtr iface);
+void virInterfaceObjListFree(virInterfaceObjListPtr vms);
+int virInterfaceObjListClone(virInterfaceObjListPtr src,
+                             virInterfaceObjListPtr dest);
+
+
+virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces,
+                                         virInterfaceDefPtr def);
+void virInterfaceRemove(virInterfaceObjListPtr interfaces,
+                        virInterfaceObjPtr iface);
+
+void virInterfaceObjLock(virInterfaceObjPtr obj);
+void virInterfaceObjUnlock(virInterfaceObjPtr obj);
+
+typedef bool (*virInterfaceObjListFilter)(virConnectPtr conn,
+                                          virInterfaceDefPtr def);
+#endif /* __VIRINTERFACEOBJ_H__ */
diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
index 0181635..700a8a0 100644
--- a/src/interface/interface_backend_netcf.c
+++ b/src/interface/interface_backend_netcf.c
@@ -33,6 +33,7 @@
 #include "virlog.h"
 #include "virstring.h"
 #include "viraccessapicheck.h"
+#include "virinterfaceobj.h"
 
 #define VIR_FROM_THIS VIR_FROM_INTERFACE
 
diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c
index 5d0fc64..18a45fa 100644
--- a/src/interface/interface_backend_udev.c
+++ b/src/interface/interface_backend_udev.c
@@ -34,6 +34,7 @@
 #include "viralloc.h"
 #include "virstring.h"
 #include "viraccessapicheck.h"
+#include "virinterfaceobj.h"
 #include "virnetdev.h"
 
 #define VIR_FROM_THIS VIR_FROM_INTERFACE
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index aed1d3d..b39e17d 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -594,19 +594,11 @@ virDomainConfVMNWFilterTeardown;
 
 
 # conf/interface_conf.h
-virInterfaceAssignDef;
 virInterfaceDefFormat;
 virInterfaceDefFree;
 virInterfaceDefParseFile;
 virInterfaceDefParseNode;
 virInterfaceDefParseString;
-virInterfaceFindByMACString;
-virInterfaceFindByName;
-virInterfaceObjListClone;
-virInterfaceObjListFree;
-virInterfaceObjLock;
-virInterfaceObjUnlock;
-virInterfaceRemove;
 
 
 # conf/netdev_bandwidth_conf.h
@@ -948,6 +940,17 @@ virDomainObjListRemoveLocked;
 virDomainObjListRename;
 
 
+# conf/virinterfaceobj.h
+virInterfaceAssignDef;
+virInterfaceFindByMACString;
+virInterfaceFindByName;
+virInterfaceObjListClone;
+virInterfaceObjListFree;
+virInterfaceObjLock;
+virInterfaceObjUnlock;
+virInterfaceRemove;
+
+
 # conf/virnodedeviceobj.h
 virNodeDeviceObjAssignDef;
 virNodeDeviceObjFindByName;
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 61c82b9..e72a91f 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -64,6 +64,7 @@
 #include "virauth.h"
 #include "viratomic.h"
 #include "virdomainobjlist.h"
+#include "virinterfaceobj.h"
 #include "virhostcpu.h"
 
 #define VIR_FROM_THIS VIR_FROM_TEST
-- 
2.9.3




More information about the libvir-list mailing list