From: John Ferlan Date: Fri, 9 Mar 2018 19:12:55 +0000 (-0500) Subject: conf: Move and use virDomainObjListRemoveLocked X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=2d2ed7b6f60effc25c89d689476d5f5772e0e086;p=libvirt.git conf: Move and use virDomainObjListRemoveLocked Rather than open code within virDomainObjListRemove, just call the *Locked function. Additionally, add comments to virDomainObjListRemove to describe the usage model. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c index 6711d67954..d1eb87e5cf 100644 --- a/src/conf/virdomainobjlist.c +++ b/src/conf/virdomainobjlist.c @@ -355,26 +355,50 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, } -/* - * The caller must hold a lock on the driver owning 'doms', - * and must also have locked 'dom', to ensure no one else - * is either waiting for 'dom' or still using it +/* The caller must hold lock on 'doms' in addition to 'virDomainObjListRemove' + * requirements + * + * Can be used to remove current element while iterating with + * virDomainObjListForEach */ -void virDomainObjListRemove(virDomainObjListPtr doms, - virDomainObjPtr dom) +void +virDomainObjListRemoveLocked(virDomainObjListPtr doms, + virDomainObjPtr dom) { char uuidstr[VIR_UUID_STRING_BUFLEN]; - dom->removing = true; virUUIDFormat(dom->def->uuid, uuidstr); - virObjectRef(dom); - virObjectUnlock(dom); - virObjectRWLockWrite(doms); - virObjectLock(dom); virHashRemoveEntry(doms->objs, uuidstr); virHashRemoveEntry(doms->objsName, dom->def->name); virObjectUnlock(dom); +} + + +/** + * @doms: Pointer to the domain object list + * @dom: Domain pointer from either after Add or FindBy* API where the + * @dom was successfully added to both the doms->objs and ->objsName + * hash tables that now would need to be removed. + * + * The caller must hold a lock on the driver owning 'doms', + * and must also have locked and ref counted 'dom', to ensure + * no one else is either waiting for 'dom' or still using it. + * + * When this function returns, @dom will be removed from the hash + * tables, unlocked, and returned with the refcnt that was present + * upon entry. + */ +void +virDomainObjListRemove(virDomainObjListPtr doms, + virDomainObjPtr dom) +{ + dom->removing = true; + virObjectRef(dom); + virObjectUnlock(dom); + virObjectRWLockWrite(doms); + virObjectLock(dom); + virDomainObjListRemoveLocked(doms, dom); virObjectUnref(dom); virObjectRWUnlock(doms); } @@ -446,24 +470,6 @@ virDomainObjListRename(virDomainObjListPtr doms, return ret; } -/* The caller must hold lock on 'doms' in addition to 'virDomainObjListRemove' - * requirements - * - * Can be used to remove current element while iterating with - * virDomainObjListForEach - */ -void virDomainObjListRemoveLocked(virDomainObjListPtr doms, - virDomainObjPtr dom) -{ - char uuidstr[VIR_UUID_STRING_BUFLEN]; - - virUUIDFormat(dom->def->uuid, uuidstr); - - virHashRemoveEntry(doms->objs, uuidstr); - virHashRemoveEntry(doms->objsName, dom->def->name); - virObjectUnlock(dom); -} - static virDomainObjPtr virDomainObjListLoadConfig(virDomainObjListPtr doms,