Allow for a driver specific private data blob in virDomainObjPtr

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
This commit is contained in:
Daniel P. Berrange 2009-10-06 12:50:58 +01:00
parent 530d4463ba
commit 3505790b85
9 changed files with 54 additions and 15 deletions

View File

@ -115,6 +115,8 @@ struct _virCaps {
virCapsGuestPtr *guests; virCapsGuestPtr *guests;
unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN]; unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
unsigned int emulatorRequired : 1; unsigned int emulatorRequired : 1;
void *(*privateDataAllocFunc)(void);
void (*privateDataFreeFunc)(void *);
}; };

View File

@ -594,12 +594,16 @@ void virDomainObjFree(virDomainObjPtr dom)
VIR_FREE(dom->vcpupids); VIR_FREE(dom->vcpupids);
if (dom->privateDataFreeFunc)
(dom->privateDataFreeFunc)(dom->privateData);
virMutexDestroy(&dom->lock); virMutexDestroy(&dom->lock);
VIR_FREE(dom); VIR_FREE(dom);
} }
static virDomainObjPtr virDomainObjNew(virConnectPtr conn) static virDomainObjPtr virDomainObjNew(virConnectPtr conn,
virCapsPtr caps)
{ {
virDomainObjPtr domain; virDomainObjPtr domain;
@ -608,9 +612,19 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
return NULL; 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) { if (virMutexInit(&domain->lock) < 0) {
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
"%s", _("cannot initialize mutex")); "%s", _("cannot initialize mutex"));
if (domain->privateDataFreeFunc)
(domain->privateDataFreeFunc)(domain->privateData);
VIR_FREE(domain); VIR_FREE(domain);
return NULL; return NULL;
} }
@ -624,6 +638,7 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
} }
virDomainObjPtr virDomainAssignDef(virConnectPtr conn, virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
virCapsPtr caps,
virDomainObjListPtr doms, virDomainObjListPtr doms,
const virDomainDefPtr def) const virDomainDefPtr def)
{ {
@ -643,7 +658,7 @@ virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
return domain; return domain;
} }
if (!(domain = virDomainObjNew(conn))) if (!(domain = virDomainObjNew(conn, caps)))
return NULL; return NULL;
domain->def = def; domain->def = def;
@ -3187,7 +3202,7 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn,
xmlNodePtr *nodes = NULL; xmlNodePtr *nodes = NULL;
int n, i; int n, i;
if (!(obj = virDomainObjNew(conn))) if (!(obj = virDomainObjNew(conn, caps)))
return NULL; return NULL;
if (!(config = virXPathNode(conn, "./domain", ctxt))) { if (!(config = virXPathNode(conn, "./domain", ctxt))) {
@ -4768,7 +4783,7 @@ virDomainObjPtr virDomainLoadConfig(virConnectPtr conn,
newVM = 0; newVM = 0;
} }
if (!(dom = virDomainAssignDef(conn, doms, def))) if (!(dom = virDomainAssignDef(conn, caps, doms, def)))
goto error; goto error;
dom->autostart = autostart; dom->autostart = autostart;

View File

@ -636,6 +636,9 @@ struct _virDomainObj {
virDomainDefPtr def; /* The current definition */ virDomainDefPtr def; /* The current definition */
virDomainDefPtr newDef; /* New definition to activate at shutdown */ virDomainDefPtr newDef; /* New definition to activate at shutdown */
void *privateData;
void (*privateDataFreeFunc)(void *);
}; };
typedef struct _virDomainObjList virDomainObjList; typedef struct _virDomainObjList virDomainObjList;
@ -678,6 +681,7 @@ void virDomainDefFree(virDomainDefPtr vm);
void virDomainObjFree(virDomainObjPtr vm); void virDomainObjFree(virDomainObjPtr vm);
virDomainObjPtr virDomainAssignDef(virConnectPtr conn, virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
virCapsPtr caps,
virDomainObjListPtr doms, virDomainObjListPtr doms,
const virDomainDefPtr def); const virDomainDefPtr def);
void virDomainRemoveInactive(virDomainObjListPtr doms, void virDomainRemoveInactive(virDomainObjListPtr doms,

View File

@ -315,7 +315,8 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
goto cleanup; goto cleanup;
} }
if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) if (!(vm = virDomainAssignDef(conn, driver->caps,
&driver->domains, def)))
goto cleanup; goto cleanup;
def = NULL; def = NULL;
vm->persistent = 1; 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; goto cleanup;
def = NULL; def = NULL;

View File

@ -235,7 +235,8 @@ static virDomainPtr oneDomainDefine(virConnectPtr conn, const char *xml)
VIR_DOMAIN_XML_INACTIVE))) VIR_DOMAIN_XML_INACTIVE)))
goto return_point; goto return_point;
if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) { if (!(vm = virDomainAssignDef(conn, driver->caps,
&driver->domains, def))) {
virDomainDefFree(def); virDomainDefFree(def);
goto return_point; goto return_point;
} }
@ -439,7 +440,8 @@ oneDomainCreateAndStart(virConnectPtr conn,
goto return_point; goto return_point;
} }
if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) { if (!(vm = virDomainAssignDef(conn, driver->caps,
&driver->domains, def))) {
virDomainDefFree(def); virDomainDefFree(def);
goto return_point; goto return_point;
} }

View File

@ -774,7 +774,8 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
vmdef->name); vmdef->name);
goto cleanup; goto cleanup;
} }
if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef))) if (!(vm = virDomainAssignDef(conn, driver->caps,
&driver->domains, vmdef)))
goto cleanup; goto cleanup;
vmdef = NULL; vmdef = NULL;
@ -841,7 +842,8 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
vmdef->name); vmdef->name);
goto cleanup; goto cleanup;
} }
if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef))) if (!(vm = virDomainAssignDef(conn, driver->caps,
&driver->domains, vmdef)))
goto cleanup; goto cleanup;
vmdef = NULL; vmdef = NULL;

View File

@ -2697,6 +2697,7 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
} }
if (!(vm = virDomainAssignDef(conn, if (!(vm = virDomainAssignDef(conn,
driver->caps,
&driver->domains, &driver->domains,
def))) def)))
goto cleanup; goto cleanup;
@ -3757,6 +3758,7 @@ static int qemudDomainRestore(virConnectPtr conn,
} }
if (!(vm = virDomainAssignDef(conn, if (!(vm = virDomainAssignDef(conn,
driver->caps,
&driver->domains, &driver->domains,
def))) { def))) {
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
@ -4243,6 +4245,7 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) {
goto cleanup; goto cleanup;
if (!(vm = virDomainAssignDef(conn, if (!(vm = virDomainAssignDef(conn,
driver->caps,
&driver->domains, &driver->domains,
def))) { def))) {
goto cleanup; goto cleanup;
@ -6101,6 +6104,7 @@ qemudDomainMigratePrepareTunnel(virConnectPtr dconn,
} }
if (!(vm = virDomainAssignDef(dconn, if (!(vm = virDomainAssignDef(dconn,
driver->caps,
&driver->domains, &driver->domains,
def))) { def))) {
qemudReportError(dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED, qemudReportError(dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
@ -6339,6 +6343,7 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn,
} }
if (!(vm = virDomainAssignDef(dconn, if (!(vm = virDomainAssignDef(dconn,
driver->caps,
&driver->domains, &driver->domains,
def))) { def))) {
qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED, qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,

View File

@ -387,7 +387,8 @@ static int testOpenDefault(virConnectPtr conn) {
goto error; goto error;
if (testDomainGenerateIfnames(conn, domdef) < 0) if (testDomainGenerateIfnames(conn, domdef) < 0)
goto error; goto error;
if (!(domobj = virDomainAssignDef(conn, &privconn->domains, domdef))) if (!(domobj = virDomainAssignDef(conn, privconn->caps,
&privconn->domains, domdef)))
goto error; goto error;
domdef = NULL; domdef = NULL;
domobj->def->id = privconn->nextDomID++; domobj->def->id = privconn->nextDomID++;
@ -739,7 +740,8 @@ static int testOpenFromFile(virConnectPtr conn,
} }
if (testDomainGenerateIfnames(conn, def) < 0 || if (testDomainGenerateIfnames(conn, def) < 0 ||
!(dom = virDomainAssignDef(conn, &privconn->domains, def))) { !(dom = virDomainAssignDef(conn, privconn->caps,
&privconn->domains, def))) {
virDomainDefFree(def); virDomainDefFree(def);
goto error; goto error;
} }
@ -1091,7 +1093,8 @@ testDomainCreateXML(virConnectPtr conn, const char *xml,
if (testDomainGenerateIfnames(conn, def) < 0) if (testDomainGenerateIfnames(conn, def) < 0)
goto cleanup; goto cleanup;
if (!(dom = virDomainAssignDef(conn, &privconn->domains, def))) if (!(dom = virDomainAssignDef(conn, privconn->caps,
&privconn->domains, def)))
goto cleanup; goto cleanup;
def = NULL; def = NULL;
dom->state = VIR_DOMAIN_RUNNING; dom->state = VIR_DOMAIN_RUNNING;
@ -1639,7 +1642,8 @@ static int testDomainRestore(virConnectPtr conn,
if (testDomainGenerateIfnames(conn, def) < 0) if (testDomainGenerateIfnames(conn, def) < 0)
goto cleanup; goto cleanup;
if (!(dom = virDomainAssignDef(conn, &privconn->domains, def))) if (!(dom = virDomainAssignDef(conn, privconn->caps,
&privconn->domains, def)))
goto cleanup; goto cleanup;
def = NULL; def = NULL;
@ -1913,7 +1917,8 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
if (testDomainGenerateIfnames(conn, def) < 0) if (testDomainGenerateIfnames(conn, def) < 0)
goto cleanup; goto cleanup;
if (!(dom = virDomainAssignDef(conn, &privconn->domains, def))) if (!(dom = virDomainAssignDef(conn, privconn->caps,
&privconn->domains, def)))
goto cleanup; goto cleanup;
def = NULL; def = NULL;
dom->persistent = 1; dom->persistent = 1;

View File

@ -1212,6 +1212,7 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char *xml,
} }
if (!(vm = virDomainAssignDef(conn, if (!(vm = virDomainAssignDef(conn,
driver->caps,
&driver->domains, &driver->domains,
def))) def)))
goto cleanup; goto cleanup;
@ -1546,6 +1547,7 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char *xml) {
goto cleanup; goto cleanup;
if (!(vm = virDomainAssignDef(conn, if (!(vm = virDomainAssignDef(conn,
driver->caps,
&driver->domains, &driver->domains,
def))) def)))
goto cleanup; goto cleanup;