On Fri, Oct 23, 2009 at 02:05:33PM +0100, Daniel P. Berrange wrote: > The virDomainObjPtr object stores state about a running domain. > This object is shared across all drivers so it is not appropriate > to include driver specific state here. This patch adds the ability > to request a blob of private data per domain object instance. The > driver must provide a allocator & deallocator for this purpose > > THis patch abuses the virCapabilitiesPtr structure for storing the > allocator/deallocator callbacks, since it is already being abused > for other internal things relating to parsing. This should be moved > out into a separate object at some point. > > * src/conf/capabilities.h: Add privateDataAllocFunc and > privateDataFreeFunc fields > * src/conf/domain_conf.c: Invoke the driver allocators / deallocators > when creating/freeing virDomainObjPtr instances. > * src/conf/domain_conf.h: Pass virCapsPtr into virDomainAssignDef > to allow access to the driver specific allocator function > * src/lxc/lxc_driver.c, src/opennebula/one_driver.c, > src/openvz/openvz_driver.c, src/qemu/qemu_driver.c, > src/test/test_driver.c, src/uml/uml_driver.c: Update for > change in virDomainAssignDef contract > --- > src/conf/capabilities.h | 2 ++ > src/conf/domain_conf.c | 23 +++++++++++++++++++---- > src/conf/domain_conf.h | 4 ++++ > src/lxc/lxc_driver.c | 6 ++++-- > src/opennebula/one_driver.c | 6 ++++-- > src/openvz/openvz_driver.c | 6 ++++-- > src/qemu/qemu_driver.c | 5 +++++ > src/test/test_driver.c | 15 ++++++++++----- > src/uml/uml_driver.c | 2 ++ > 9 files changed, 54 insertions(+), 15 deletions(-) > > diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h > index 2f24605..7234cf4 100644 > --- a/src/conf/capabilities.h > +++ b/src/conf/capabilities.h > @@ -115,6 +115,8 @@ struct _virCaps { > virCapsGuestPtr *guests; > unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN]; > unsigned int emulatorRequired : 1; > + void *(*privateDataAllocFunc)(void); > + void (*privateDataFreeFunc)(void *); > }; > > > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index de07e13..0dd2b3f 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -594,12 +594,16 @@ void virDomainObjFree(virDomainObjPtr dom) > > VIR_FREE(dom->vcpupids); > > + if (dom->privateDataFreeFunc) > + (dom->privateDataFreeFunc)(dom->privateData); > + > virMutexDestroy(&dom->lock); > > VIR_FREE(dom); > } > > -static virDomainObjPtr virDomainObjNew(virConnectPtr conn) > +static virDomainObjPtr virDomainObjNew(virConnectPtr conn, > + virCapsPtr caps) > { > virDomainObjPtr domain; > > @@ -608,9 +612,19 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn) > return NULL; > } > > + if (caps->privateDataAllocFunc && > + !(domain->privateData = (caps->privateDataAllocFunc)())) { > + virReportOOMError(conn); > + VIR_FREE(domain); > + return NULL; > + } > + domain->privateDataFreeFunc = caps->privateDataFreeFunc; > + > if (virMutexInit(&domain->lock) < 0) { > virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, > "%s", _("cannot initialize mutex")); > + if (domain->privateDataFreeFunc) > + (domain->privateDataFreeFunc)(domain->privateData); > VIR_FREE(domain); > return NULL; > } > @@ -624,6 +638,7 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn) > } > > virDomainObjPtr virDomainAssignDef(virConnectPtr conn, > + virCapsPtr caps, > virDomainObjListPtr doms, > const virDomainDefPtr def) > { > @@ -643,7 +658,7 @@ virDomainObjPtr virDomainAssignDef(virConnectPtr conn, > return domain; > } > > - if (!(domain = virDomainObjNew(conn))) > + if (!(domain = virDomainObjNew(conn, caps))) > return NULL; > domain->def = def; > > @@ -3187,7 +3202,7 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn, > xmlNodePtr *nodes = NULL; > int n, i; > > - if (!(obj = virDomainObjNew(conn))) > + if (!(obj = virDomainObjNew(conn, caps))) > return NULL; > > if (!(config = virXPathNode(conn, "./domain", ctxt))) { > @@ -4768,7 +4783,7 @@ virDomainObjPtr virDomainLoadConfig(virConnectPtr conn, > newVM = 0; > } > > - if (!(dom = virDomainAssignDef(conn, doms, def))) > + if (!(dom = virDomainAssignDef(conn, caps, doms, def))) > goto error; > > dom->autostart = autostart; > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index 389e259..8a8bfb0 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -636,6 +636,9 @@ struct _virDomainObj { > > virDomainDefPtr def; /* The current definition */ > virDomainDefPtr newDef; /* New definition to activate at shutdown */ > + > + void *privateData; > + void (*privateDataFreeFunc)(void *); > }; > > typedef struct _virDomainObjList virDomainObjList; > @@ -678,6 +681,7 @@ void virDomainDefFree(virDomainDefPtr vm); > void virDomainObjFree(virDomainObjPtr vm); > > virDomainObjPtr virDomainAssignDef(virConnectPtr conn, > + virCapsPtr caps, > virDomainObjListPtr doms, > const virDomainDefPtr def); > void virDomainRemoveInactive(virDomainObjListPtr doms, > diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c > index 4f0787b..116f3ae 100644 > --- a/src/lxc/lxc_driver.c > +++ b/src/lxc/lxc_driver.c > @@ -315,7 +315,8 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) > goto cleanup; > } > > - if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) > + if (!(vm = virDomainAssignDef(conn, driver->caps, > + &driver->domains, def))) > goto cleanup; > def = NULL; > vm->persistent = 1; > @@ -1312,7 +1313,8 @@ lxcDomainCreateAndStart(virConnectPtr conn, > } > > > - if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) > + if (!(vm = virDomainAssignDef(conn, driver->caps, > + &driver->domains, def))) > goto cleanup; > def = NULL; > > diff --git a/src/opennebula/one_driver.c b/src/opennebula/one_driver.c > index 0b807ad..beb48ce 100644 > --- a/src/opennebula/one_driver.c > +++ b/src/opennebula/one_driver.c > @@ -235,7 +235,8 @@ static virDomainPtr oneDomainDefine(virConnectPtr conn, const char *xml) > VIR_DOMAIN_XML_INACTIVE))) > goto return_point; > > - if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) { > + if (!(vm = virDomainAssignDef(conn, driver->caps, > + &driver->domains, def))) { > virDomainDefFree(def); > goto return_point; > } > @@ -439,7 +440,8 @@ oneDomainCreateAndStart(virConnectPtr conn, > goto return_point; > } > > - if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) { > + if (!(vm = virDomainAssignDef(conn, driver->caps, > + &driver->domains, def))) { > virDomainDefFree(def); > goto return_point; > } > diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c > index b0092cd..d334235 100644 > --- a/src/openvz/openvz_driver.c > +++ b/src/openvz/openvz_driver.c > @@ -774,7 +774,8 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml) > vmdef->name); > goto cleanup; > } > - if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef))) > + if (!(vm = virDomainAssignDef(conn, driver->caps, > + &driver->domains, vmdef))) > goto cleanup; > vmdef = NULL; > > @@ -841,7 +842,8 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml, > vmdef->name); > goto cleanup; > } > - if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef))) > + if (!(vm = virDomainAssignDef(conn, driver->caps, > + &driver->domains, vmdef))) > goto cleanup; > vmdef = NULL; > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index fc6cc53..1651071 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -2703,6 +2703,7 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml, > } > > if (!(vm = virDomainAssignDef(conn, > + driver->caps, > &driver->domains, > def))) > goto cleanup; > @@ -3766,6 +3767,7 @@ static int qemudDomainRestore(virConnectPtr conn, > } > > if (!(vm = virDomainAssignDef(conn, > + driver->caps, > &driver->domains, > def))) { > qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > @@ -4254,6 +4256,7 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) { > goto cleanup; > > if (!(vm = virDomainAssignDef(conn, > + driver->caps, > &driver->domains, > def))) { > goto cleanup; > @@ -6112,6 +6115,7 @@ qemudDomainMigratePrepareTunnel(virConnectPtr dconn, > } > > if (!(vm = virDomainAssignDef(dconn, > + driver->caps, > &driver->domains, > def))) { > qemudReportError(dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > @@ -6333,6 +6337,7 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn, > } > > if (!(vm = virDomainAssignDef(dconn, > + driver->caps, > &driver->domains, > def))) { > qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > index 919a2f6..f08fe74 100644 > --- a/src/test/test_driver.c > +++ b/src/test/test_driver.c > @@ -364,7 +364,8 @@ static int testOpenDefault(virConnectPtr conn) { > goto error; > if (testDomainGenerateIfnames(conn, domdef) < 0) > goto error; > - if (!(domobj = virDomainAssignDef(conn, &privconn->domains, domdef))) > + if (!(domobj = virDomainAssignDef(conn, privconn->caps, > + &privconn->domains, domdef))) > goto error; > domdef = NULL; > domobj->def->id = privconn->nextDomID++; > @@ -716,7 +717,8 @@ static int testOpenFromFile(virConnectPtr conn, > } > > if (testDomainGenerateIfnames(conn, def) < 0 || > - !(dom = virDomainAssignDef(conn, &privconn->domains, def))) { > + !(dom = virDomainAssignDef(conn, privconn->caps, > + &privconn->domains, def))) { > virDomainDefFree(def); > goto error; > } > @@ -1068,7 +1070,8 @@ testDomainCreateXML(virConnectPtr conn, const char *xml, > > if (testDomainGenerateIfnames(conn, def) < 0) > goto cleanup; > - if (!(dom = virDomainAssignDef(conn, &privconn->domains, def))) > + if (!(dom = virDomainAssignDef(conn, privconn->caps, > + &privconn->domains, def))) > goto cleanup; > def = NULL; > dom->state = VIR_DOMAIN_RUNNING; > @@ -1616,7 +1619,8 @@ static int testDomainRestore(virConnectPtr conn, > > if (testDomainGenerateIfnames(conn, def) < 0) > goto cleanup; > - if (!(dom = virDomainAssignDef(conn, &privconn->domains, def))) > + if (!(dom = virDomainAssignDef(conn, privconn->caps, > + &privconn->domains, def))) > goto cleanup; > def = NULL; > > @@ -1890,7 +1894,8 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn, > > if (testDomainGenerateIfnames(conn, def) < 0) > goto cleanup; > - if (!(dom = virDomainAssignDef(conn, &privconn->domains, def))) > + if (!(dom = virDomainAssignDef(conn, privconn->caps, > + &privconn->domains, def))) > goto cleanup; > def = NULL; > dom->persistent = 1; > diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c > index 80cf477..4fb04d9 100644 > --- a/src/uml/uml_driver.c > +++ b/src/uml/uml_driver.c > @@ -1212,6 +1212,7 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char *xml, > } > > if (!(vm = virDomainAssignDef(conn, > + driver->caps, > &driver->domains, > def))) > goto cleanup; > @@ -1546,6 +1547,7 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char *xml) { > goto cleanup; > > if (!(vm = virDomainAssignDef(conn, > + driver->caps, > &driver->domains, > def))) > goto cleanup; ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list