[libvirt] [PATCH 4/5] qemu: implement virConnectListAllDomains() for qemu driver
Eric Blake
eblake at redhat.com
Tue May 22 02:28:27 UTC 2012
On 05/20/2012 09:56 AM, Peter Krempa wrote:
> This patch adds a basic implementation of the listing code for
> virConnectListAllDomains() to qemu driver. The listing code does
> not support any filtering flags yet, but they may be easily added
> later.
We need to also cover all the other drivers; I'm wondering how many
drivers will share common implementations, where we could factor things
into src/conf/domain_conf.c.
>
> +struct virDomainListData {
> + virConnectPtr conn;
> + virDomainPtr *domains;
> + int ndomains;
> + int size;
> + int limit;
s/int/size_t/ for these three lines.
> + bool error;
> + bool populate;
> +};
> +
> +#define VIR_DOMAIN_LIST_POPULATION_INCREMENT 10
You don't need this. Instead, you can use VIR_RESIZE_N(domains, size,
ndomains, 1) to guarantee at least ndomains+1 slots, but only allocating
on geometric boundaries.
> +
> +static void
> +qemuPopulateDomainList(void *payload,
> + const void *name ATTRIBUTE_UNUSED,
> + void *opaque)
> +{
> + struct virDomainListData *data = opaque;
> + virDomainObjPtr vm = payload;
> +
> + if (data->error ||
> + (data->limit >= 0 &&
> + data->ndomains >= data->limit))
> + return;
I don't think you need data->limit at all.
Here is where you would do any filtering based on flags.
> +
> + if (!data->populate) {
> + data->ndomains++;
> + return;
> + }
> +
> + virDomainObjLock(vm);
> +
> + if (data->size == data->ndomains) {
> + if (VIR_REALLOC_N(data->domains,
> + data->size + VIR_DOMAIN_LIST_POPULATION_INCREMENT) < 0)
See above about using VIR_EXPAND_N instead of VIR_REALLOC_N.
> +static int
> +qemuListAllDomains(virConnectPtr conn,
> + virDomainPtr **domains,
> + int ndomains,
> + unsigned int flags)
> +{
> + struct qemud_driver *driver = conn->privateData;
> + int ret = -1;
> + int i;
> +
> + struct virDomainListData data = { conn, NULL, 0, 0, ndomains,
Why the double space?
> + false, !!domains};
> +
> + virCheckFlags(0, -1);
> +
> + qemuDriverLock(driver);
> +
> + virHashForEach(driver->domains.objs, qemuPopulateDomainList,
> + (void *) &data);
No need to cast to (void*) in C.
--
Eric Blake eblake at redhat.com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120521/dd83fab9/attachment-0001.sig>
More information about the libvir-list
mailing list