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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list