[libvirt] [PATCHv2 01/21] virCaps: conf: start splitting out irrelevat data
Laine Stump
laine at laine.org
Thu Mar 7 17:42:30 UTC 2013
On 03/07/2013 11:50 AM, Daniel P. Berrange wrote:
> 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));
Or use struct assignment:
xmlconf->privDataCallbacks = *priv;
(I have an innate dislike of memcpy when it can be avoided, since it
eliminates type checking).
>
>> + }
>> +
>> + if (xmlns)
>> + xmlconf->ns = *xmlns;
Yeah, like you did there.
>> +
>> + return xmlconf;
>> +}
>> +
>> +virDomainXMLNamespace
>> +virDomainXMLConfGetNamespace(virDomainXMLConfPtr xmlconf)
>> +{
>> + return xmlconf->ns;
>> +}
You're returning a struct there, rather than a pointer to a struct. Do
you really want to restrict yourself that way?
More information about the libvir-list
mailing list