diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ba33e62b1b..aafc05e506 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1074,8 +1074,10 @@ virDomainObjPtr virDomainObjListFindByID(virDomainObjListPtr doms, } -virDomainObjPtr virDomainObjListFindByUUID(virDomainObjListPtr doms, - const unsigned char *uuid) +static virDomainObjPtr +virDomainObjListFindByUUIDInternal(virDomainObjListPtr doms, + const unsigned char *uuid, + bool ref) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virDomainObjPtr obj; @@ -1084,17 +1086,38 @@ virDomainObjPtr virDomainObjListFindByUUID(virDomainObjListPtr doms, virUUIDFormat(uuid, uuidstr); obj = virHashLookup(doms->objs, uuidstr); + if (ref) { + virObjectRef(obj); + virObjectUnlock(doms); + } if (obj) { virObjectLock(obj); if (obj->removing) { + if (ref) + virObjectUnref(obj); virObjectUnlock(obj); obj = NULL; } } - virObjectUnlock(doms); + if (!ref) + virObjectUnlock(doms); return obj; } +virDomainObjPtr +virDomainObjListFindByUUID(virDomainObjListPtr doms, + const unsigned char *uuid) +{ + return virDomainObjListFindByUUIDInternal(doms, uuid, false); +} + +virDomainObjPtr +virDomainObjListFindByUUIDRef(virDomainObjListPtr doms, + const unsigned char *uuid) +{ + return virDomainObjListFindByUUIDInternal(doms, uuid, true); +} + static int virDomainObjListSearchName(const void *payload, const void *name ATTRIBUTE_UNUSED, const void *data) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 75e3d2a283..57297cdbab 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2287,6 +2287,8 @@ virDomainObjPtr virDomainObjListFindByID(virDomainObjListPtr doms, int id); virDomainObjPtr virDomainObjListFindByUUID(virDomainObjListPtr doms, const unsigned char *uuid); +virDomainObjPtr virDomainObjListFindByUUIDRef(virDomainObjListPtr doms, + const unsigned char *uuid); virDomainObjPtr virDomainObjListFindByName(virDomainObjListPtr doms, const char *name); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 363d847c7d..46d9495452 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -353,6 +353,7 @@ virDomainObjListExport; virDomainObjListFindByID; virDomainObjListFindByName; virDomainObjListFindByUUID; +virDomainObjListFindByUUIDRef; virDomainObjListForEach; virDomainObjListGetActiveIDs; virDomainObjListGetInactiveNames;