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(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/