virInterfaceObjListAssignDef: Transfer definition ownership

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@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Michal Privoznik 2021-11-02 11:02:27 +01:00
parent e18fff6c85
commit 10c68f5dd4
3 changed files with 22 additions and 11 deletions

View File

@ -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;

View File

@ -59,7 +59,7 @@ virInterfaceObjListClone(virInterfaceObjList *interfaces);
virInterfaceObj *
virInterfaceObjListAssignDef(virInterfaceObjList *interfaces,
virInterfaceDef *def);
virInterfaceDef **def);
void
virInterfaceObjListRemove(virInterfaceObjList *interfaces,

View File

@ -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);