[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