[libvirt] [PATCHv2 01/21] virCaps: conf: start splitting out irrelevat data
Daniel P. Berrange
berrange at redhat.com
Thu Mar 7 16:50:14 UTC 2013
On Wed, Mar 06, 2013 at 04:37:45PM +0100, Peter Krempa wrote:
> The virCaps structure gathered a ton of irrelevant data over time that.
> The original reason is that it was propagated to the XML parser
> functions.
>
> This patch aims to create a new data structure virDomainXMLConf that
> will contain immutable data that are used by the XML parser. This will
> allow two things we need:
>
> 1) Get rid of the stuff from virCaps
>
> 2) Allow us to add callbacks to check and add driver specific stuff
> after domain XML is parsed.
>
> This first attempt removes pointers to private data allocation functions
> to this new structure and update all callers and function that require
> them.
> ---
> src/conf/capabilities.h | 8 ++----
> src/conf/domain_conf.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++
> src/conf/domain_conf.h | 27 +++++++++++++++++++
> 3 files changed, 99 insertions(+), 6 deletions(-)
>
> diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
> index cc01765..bf64296 100644
> --- a/src/conf/capabilities.h
> +++ b/src/conf/capabilities.h
> @@ -159,19 +159,15 @@ struct _virCaps {
> size_t nguests;
> size_t nguests_max;
> virCapsGuestPtr *guests;
> +
> + /* deal with these later */
Better written as /* Move to virDomainXMLConf later */
> unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
> unsigned int emulatorRequired : 1;
> const char *defaultDiskDriverName;
> int defaultDiskDriverType; /* enum virStorageFileFormat */
> int (*defaultConsoleTargetType)(const char *ostype, virArch guestarch);
> - void *(*privateDataAllocFunc)(void);
> - void (*privateDataFreeFunc)(void *);
> - int (*privateDataXMLFormat)(virBufferPtr, void *);
> - int (*privateDataXMLParse)(xmlXPathContextPtr, void *);
> bool hasWideScsiBus;
> const char *defaultInitPath;
> -
> - virDomainXMLNamespace ns;
> };
>
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index f7c8af1..2b54aec 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -736,6 +736,76 @@ static int virDomainObjOnceInit(void)
>
> VIR_ONCE_GLOBAL_INIT(virDomainObj)
>
> +
> +/* This structure holds various callbacks and data needed
> + * while parsing and creating domain XMLs */
> +struct _virDomainXMLConf {
> + virObject parent;
> +
> + /* domain private data management callbacks */
> + virDomainXMLPrivateDataAllocFunc privateDataAllocFunc;
> + virDomainXMLPrivateDataFreeFunc privateDataFreeFunc;
> + virDomainXMLPrivateDataFormatFunc privateDataXMLFormat;
> + virDomainXMLPrivateDataParseFunc privateDataXMLParse;
Why not just use 'virDomainXMLPrivateDataCallbacks' here
instead of duplicating its contents ?
> +
> + /* XML namespace callbacks */
> + virDomainXMLNamespace ns;
> + };
Good, I like that this struct is only in the .c file and not
exposed in .h
> +virDomainXMLConfPtr
> +virDomainXMLConfNew(virDomainXMLPrivateDataCallbacksPtr priv,
> + virDomainXMLNamespacePtr xmlns)
> +{
> + virDomainXMLConfPtr xmlconf;
> +
> + if (virDomainXMLConfInitialize() < 0)
> + return NULL;
> +
> + if (!(xmlconf = virObjectNew(virDomainXMLConfClass)))
> + return NULL;
> +
> + if (priv) {
> + xmlconf->privateDataAllocFunc = priv->alloc;
> + xmlconf->privateDataFreeFunc = priv->free;
> + xmlconf->privateDataXMLFormat = priv->format;
> + xmlconf->privateDataXMLParse = priv->parse;
Then you could just do
if (priv)
memcpy(xmlconf->privDataCallbacks, priv, sizeof(*priv));
> + }
> +
> + if (xmlns)
> + xmlconf->ns = *xmlns;
> +
> + return xmlconf;
> +}
> +
> +virDomainXMLNamespace
> +virDomainXMLConfGetNamespace(virDomainXMLConfPtr xmlconf)
> +{
> + return xmlconf->ns;
> +}
> +
> +
> void
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list