Upon successful return from virInterfaceObjListAssignDef() the
virInterfaceObj is the owner of secret definition. To make this
ownership transfer even more visible, lets pass the definition as
a double pointer and use g_steal_pointer().
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/conf/virinterfaceobj.c | 25 +++++++++++++++++++------
src/conf/virinterfaceobj.h | 2 +-
src/test/test_driver.c | 6 ++----
3 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c
index c5dfa6c7f5..daac74e88c 100644
--- a/src/conf/virinterfaceobj.c
+++ b/src/conf/virinterfaceobj.c
@@ -377,9 +377,8 @@ virInterfaceObjListCloneCb(void *payload,
goto error;
VIR_FREE(xml);
- if (!(obj = virInterfaceObjListAssignDef(data->dest, backup)))
+ if (!(obj = virInterfaceObjListAssignDef(data->dest, &backup)))
goto error;
- backup = NULL;
virInterfaceObjEndAPI(&obj);
virObjectUnlock(srcObj);
@@ -420,25 +419,39 @@ virInterfaceObjListClone(virInterfaceObjList *interfaces)
}
+/**
+ * virInterfaceObjListAssignDef:
+ * @interfaces: virInterface object list
+ * @def: new definition
+ *
+ * Assigns new definition to either an existing or newly created
+ * virInterface object. Upon successful return the virInterface
+ * object is the owner of @def and callers should use
+ * virInterfaceObjGetDef() if they need to access the definition
+ * as @def is set to NULL.
+ *
+ * Returns: a virInterface object instance on success, or
+ * NULL on error.
+ */
virInterfaceObj *
virInterfaceObjListAssignDef(virInterfaceObjList *interfaces,
- virInterfaceDef *def)
+ virInterfaceDef **def)
{
virInterfaceObj *obj;
virObjectRWLockWrite(interfaces);
- if ((obj = virInterfaceObjListFindByNameLocked(interfaces, def->name))) {
+ if ((obj = virInterfaceObjListFindByNameLocked(interfaces, (*def)->name))) {
virInterfaceDefFree(obj->def);
} else {
if (!(obj = virInterfaceObjNew()))
goto error;
- if (virHashAddEntry(interfaces->objsName, def->name, obj) < 0)
+ if (virHashAddEntry(interfaces->objsName, (*def)->name, obj) < 0)
goto error;
virObjectRef(obj);
}
- obj->def = def;
+ obj->def = g_steal_pointer(def);
virObjectRWUnlock(interfaces);
return obj;
diff --git a/src/conf/virinterfaceobj.h b/src/conf/virinterfaceobj.h
index d60faa95f2..5927484167 100644
--- a/src/conf/virinterfaceobj.h
+++ b/src/conf/virinterfaceobj.h
@@ -59,7 +59,7 @@ virInterfaceObjListClone(virInterfaceObjList *interfaces);
virInterfaceObj *
virInterfaceObjListAssignDef(virInterfaceObjList *interfaces,
- virInterfaceDef *def);
+ virInterfaceDef **def);
void
virInterfaceObjListRemove(virInterfaceObjList *interfaces,
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index e45748c5fc..92c0462170 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -1141,9 +1141,8 @@ testParseInterfaces(testDriver *privconn,
if (!def)
return -1;
- if (!(obj = virInterfaceObjListAssignDef(privconn->ifaces, def)))
+ if (!(obj = virInterfaceObjListAssignDef(privconn->ifaces, &def)))
return -1;
- def = NULL;
virInterfaceObjSetActive(obj, true);
virInterfaceObjEndAPI(&obj);
@@ -6203,9 +6202,8 @@ testInterfaceDefineXML(virConnectPtr conn,
if ((def = virInterfaceDefParseString(xmlStr, flags)) == NULL)
goto cleanup;
- if ((obj = virInterfaceObjListAssignDef(privconn->ifaces, def)) == NULL)
+ if ((obj = virInterfaceObjListAssignDef(privconn->ifaces, &def)) == NULL)
goto cleanup;
- def = NULL;
objdef = virInterfaceObjGetDef(obj);
ret = virGetInterface(conn, objdef->name, objdef->mac);
--
2.32.0