mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
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:
parent
e18fff6c85
commit
10c68f5dd4
@ -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;
|
||||
|
@ -59,7 +59,7 @@ virInterfaceObjListClone(virInterfaceObjList *interfaces);
|
||||
|
||||
virInterfaceObj *
|
||||
virInterfaceObjListAssignDef(virInterfaceObjList *interfaces,
|
||||
virInterfaceDef *def);
|
||||
virInterfaceDef **def);
|
||||
|
||||
void
|
||||
virInterfaceObjListRemove(virInterfaceObjList *interfaces,
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user