On Mon, May 04, 2015 at 13:22:17 +0200, Michal Privoznik wrote: > On 30.04.2015 14:44, Peter Krempa wrote: > > Add virDomainObjListConvert that will take a list of virDomains, apply > > filters and return a list of virDomainObjs. > > --- > > src/conf/domain_conf.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ > > src/conf/domain_conf.h | 9 ++++++++ > > src/libvirt_private.syms | 1 + > > 3 files changed, 64 insertions(+) > > > > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > > index 66fe470..73dc33f 100644 > > --- a/src/conf/domain_conf.c > > +++ b/src/conf/domain_conf.c > > @@ -23072,6 +23072,60 @@ virDomainObjListCollect(virDomainObjListPtr domlist, > > > > > > int > > +virDomainObjListConvert(virDomainObjListPtr domlist, > > + virConnectPtr conn, > > + virDomainPtr *doms, > > + size_t ndoms, > > + virDomainObjPtr **vms, > > + size_t *nvms, > > + virDomainObjListACLFilter filter, > > + unsigned int flags, > > + bool skip_missing) > > +{ > > + char uuidstr[VIR_UUID_STRING_BUFLEN]; > > + virDomainObjPtr vm; > > + size_t i; > > + > > + *nvms = 0; > > + *vms = NULL; > > + > > + virObjectLock(domlist); > > + for (i = 0; i < ndoms; i++) { > > + virDomainPtr dom = doms[i]; > > + > > + virUUIDFormat(dom->uuid, uuidstr); > > + > > + if (!(vm = virHashLookup(domlist->objs, uuidstr))) { > > + if (!skip_missing) { > > + virReportError(VIR_ERR_NO_DOMAIN, > > + _("no domain with matching uuid '%s' (%s)"), > > + uuidstr, dom->name); > > + virObjectUnlock(domlist); > > Move Unlock() before the virReportError(). Not that it would matter, > but: a) it keeps list locked for shorter time b) I always felt like > ReportError() and goto error should be joined together. Okay. > > > + goto error; > > + } > > + } else { > > + virObjectRef(vm); > > + > > + if (VIR_APPEND_ELEMENT(*vms, *nvms, vm) < 0) > > Please unlock the @domlist before jumping anywhere. Uhh, right. Also @vm needs to be unref'd before jumping to error. > > > + goto error; > > + } > > + } > > + virObjectUnlock(domlist); > > + > > + virDomainObjListFilter(vms, nvms, conn, filter, flags); > > + > > + return 0; > > + > > + error: > > + virObjectListFreeCount(*vms, *nvms); > > + *vms = NULL; > > + *nvms = 0; > > + > > + return -1; > > +} > > + > > + I've also found the function hard to read after a week of hollidays so I've changed the control flow a bit so that the else section is not necessary and I've inverted the (!skip_missing) check to 'continue' the for loop. Thanks for the review I'll push this shortly. Peter
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list