[libvirt] [PATCH 05/13] Introduce generic virDomainDeviceInfo iterator function
Daniel Veillard
veillard at redhat.com
Tue Feb 2 14:22:17 UTC 2010
On Mon, Feb 01, 2010 at 06:39:34PM +0000, Daniel P. Berrange wrote:
> The virDomainDeviceInfoIterate() function will provide a
> convenient way to iterate over all devices in a domain.
>
> * src/conf/domain_conf.c, src/conf/domain_conf.h,
> src/libvirt_private.syms: Add virDomainDeviceInfoIterate()
> function.
> ---
> src/conf/domain_conf.c | 67 +++++++++++++++++++++++++++++++---------------
> src/conf/domain_conf.h | 8 +++++
> src/libvirt_private.syms | 1 +
> 3 files changed, 54 insertions(+), 22 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index e548d1d..691fc84 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -824,59 +824,82 @@ void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info)
> }
>
>
> -static void virDomainDeviceInfoClearField(virDomainDeviceInfoPtr info, int alias, int pciaddr)
> +static int virDomainDeviceInfoClearAlias(virDomainDefPtr def ATTRIBUTE_UNUSED,
> + virDomainDeviceInfoPtr info,
> + void *opaque ATTRIBUTE_UNUSED)
> {
> - if (alias)
> - VIR_FREE(info->alias);
> - if (pciaddr &&
> - info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
> + VIR_FREE(info->alias);
> + return 0;
> +}
> +
> +static int virDomainDeviceInfoClearPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
> + virDomainDeviceInfoPtr info,
> + void *opaque ATTRIBUTE_UNUSED)
> +{
> + if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
> memset(&info->addr, 0, sizeof(info->addr));
> info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
> }
> + return 0;
> }
>
> -
> -static void virDomainDefClearDeviceInfo(virDomainDefPtr def, int alias, int pciaddr)
> +int virDomainDeviceInfoIterate(virDomainDefPtr def,
> + virDomainDeviceInfoCallback cb,
> + void *opaque)
> {
> int i;
>
> for (i = 0; i < def->ndisks ; i++)
> - virDomainDeviceInfoClearField(&def->disks[i]->info, alias, pciaddr);
> + if (cb(def, &def->disks[i]->info, opaque) < 0)
> + return -1;
> for (i = 0; i < def->nnets ; i++)
> - virDomainDeviceInfoClearField(&def->nets[i]->info, alias, pciaddr);
> + if (cb(def, &def->nets[i]->info, opaque) < 0)
> + return -1;
> for (i = 0; i < def->nsounds ; i++)
> - virDomainDeviceInfoClearField(&def->sounds[i]->info, alias, pciaddr);
> + if (cb(def, &def->sounds[i]->info, opaque) < 0)
> + return -1;
> for (i = 0; i < def->nhostdevs ; i++)
> - virDomainDeviceInfoClearField(&def->hostdevs[i]->info, alias, pciaddr);
> + if (cb(def, &def->hostdevs[i]->info, opaque) < 0)
> + return -1;
> for (i = 0; i < def->nvideos ; i++)
> - virDomainDeviceInfoClearField(&def->videos[i]->info, alias, pciaddr);
> + if (cb(def, &def->videos[i]->info, opaque) < 0)
> + return -1;
> for (i = 0; i < def->ncontrollers ; i++)
> - virDomainDeviceInfoClearField(&def->controllers[i]->info, alias, pciaddr);
> + if (cb(def, &def->controllers[i]->info, opaque) < 0)
> + return -1;
> for (i = 0; i < def->nserials ; i++)
> - virDomainDeviceInfoClearField(&def->serials[i]->info, alias, pciaddr);
> + if (cb(def, &def->serials[i]->info, opaque) < 0)
> + return -1;
> for (i = 0; i < def->nparallels ; i++)
> - virDomainDeviceInfoClearField(&def->parallels[i]->info, alias, pciaddr);
> + if (cb(def, &def->parallels[i]->info, opaque) < 0)
> + return -1;
> for (i = 0; i < def->nchannels ; i++)
> - virDomainDeviceInfoClearField(&def->channels[i]->info, alias, pciaddr);
> + if (cb(def, &def->channels[i]->info, opaque) < 0)
> + return -1;
> for (i = 0; i < def->ninputs ; i++)
> - virDomainDeviceInfoClearField(&def->inputs[i]->info, alias, pciaddr);
> + if (cb(def, &def->inputs[i]->info, opaque) < 0)
> + return -1;
> for (i = 0; i < def->nfss ; i++)
> - virDomainDeviceInfoClearField(&def->fss[i]->info, alias, pciaddr);
> + if (cb(def, &def->fss[i]->info, opaque) < 0)
> + return -1;
> if (def->watchdog)
> - virDomainDeviceInfoClearField(&def->watchdog->info, alias, pciaddr);
> + if (cb(def, &def->watchdog->info, opaque) < 0)
> + return -1;
> if (def->console)
> - virDomainDeviceInfoClearField(&def->console->info, alias, pciaddr);
> + if (cb(def, &def->console->info, opaque) < 0)
> + return -1;
> + return 0;
> }
>
>
> void virDomainDefClearPCIAddresses(virDomainDefPtr def)
> {
> - virDomainDefClearDeviceInfo(def, 0, 1);
> + virDomainDeviceInfoIterate(def, virDomainDeviceInfoClearPCIAddress, NULL);
> }
>
> void virDomainDefClearDeviceAliases(virDomainDefPtr def)
> {
> - virDomainDefClearDeviceInfo(def, 1, 0);
> + virDomainDeviceInfoIterate(def, virDomainDeviceInfoClearAlias, NULL);
> }
>
>
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 7be090d..be0dc92 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -742,6 +742,14 @@ void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info);
> void virDomainDefClearPCIAddresses(virDomainDefPtr def);
> void virDomainDefClearDeviceAliases(virDomainDefPtr def);
>
> +typedef int (*virDomainDeviceInfoCallback)(virDomainDefPtr def,
> + virDomainDeviceInfoPtr dev,
> + void *opaque);
> +
> +int virDomainDeviceInfoIterate(virDomainDefPtr def,
> + virDomainDeviceInfoCallback cb,
> + void *opaque);
> +
> void virDomainDefFree(virDomainDefPtr vm);
> void virDomainObjRef(virDomainObjPtr vm);
> /* Returns 1 if the object was freed, 0 if more refs exist */
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index d56fb7d..e5e8860 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -187,6 +187,7 @@ virDomainDeviceAddressTypeToString;
> virDomainDefAddDiskControllers;
> virDomainDefClearPCIAddresses;
> virDomainDefClearDeviceAliases;
> +virDomainDeviceInfoIterate;
>
>
> # domain_event.h
Patch really tries hard to reconciliate things it should not, but
looks fine !
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list