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
virCapsGuestPtr *guests;
unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
unsigned int emulatorRequired : 1;
+ void *(*privateDataAllocFunc)(void);
+ void (*privateDataFreeFunc)(void *);
};
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;
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;
}
}
virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
+ virCapsPtr caps,
virDomainObjListPtr doms,
const virDomainDefPtr def)
{
return domain;
}
- if (!(domain = virDomainObjNew(conn)))
+ if (!(domain = virDomainObjNew(conn, caps)))
return NULL;
domain->def = def;
xmlNodePtr *nodes = NULL;
int n, i;
- if (!(obj = virDomainObjNew(conn)))
+ if (!(obj = virDomainObjNew(conn, caps)))
return NULL;
if (!(config = virXPathNode(conn, "./domain", ctxt))) {
newVM = 0;
}
- if (!(dom = virDomainAssignDef(conn, doms, def)))
+ if (!(dom = virDomainAssignDef(conn, caps, doms, def)))
goto error;
dom->autostart = autostart;
virDomainDefPtr def; /* The current definition */
virDomainDefPtr newDef; /* New definition to activate at shutdown */
+
+ void *privateData;
+ void (*privateDataFreeFunc)(void *);
};
typedef struct _virDomainObjList virDomainObjList;
void virDomainObjFree(virDomainObjPtr vm);
virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
+ virCapsPtr caps,
virDomainObjListPtr doms,
const virDomainDefPtr def);
void virDomainRemoveInactive(virDomainObjListPtr doms,
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;
}
- if (!(vm = virDomainAssignDef(conn, &driver->domains, def)))
+ if (!(vm = virDomainAssignDef(conn, driver->caps,
+ &driver->domains, def)))
goto cleanup;
def = NULL;
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;
}
goto return_point;
}
- if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) {
+ if (!(vm = virDomainAssignDef(conn, driver->caps,
+ &driver->domains, def))) {
virDomainDefFree(def);
goto return_point;
}
vmdef->name);
goto cleanup;
}
- if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
+ if (!(vm = virDomainAssignDef(conn, driver->caps,
+ &driver->domains, vmdef)))
goto cleanup;
vmdef = NULL;
vmdef->name);
goto cleanup;
}
- if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
+ if (!(vm = virDomainAssignDef(conn, driver->caps,
+ &driver->domains, vmdef)))
goto cleanup;
vmdef = NULL;
}
if (!(vm = virDomainAssignDef(conn,
+ driver->caps,
&driver->domains,
def)))
goto cleanup;
}
if (!(vm = virDomainAssignDef(conn,
+ driver->caps,
&driver->domains,
def))) {
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
goto cleanup;
if (!(vm = virDomainAssignDef(conn,
+ driver->caps,
&driver->domains,
def))) {
goto cleanup;
}
if (!(vm = virDomainAssignDef(dconn,
+ driver->caps,
&driver->domains,
def))) {
qemudReportError(dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
}
if (!(vm = virDomainAssignDef(dconn,
+ driver->caps,
&driver->domains,
def))) {
qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
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++;
}
if (testDomainGenerateIfnames(conn, def) < 0 ||
- !(dom = virDomainAssignDef(conn, &privconn->domains, def))) {
+ !(dom = virDomainAssignDef(conn, privconn->caps,
+ &privconn->domains, def))) {
virDomainDefFree(def);
goto error;
}
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;
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;
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;
}
if (!(vm = virDomainAssignDef(conn,
+ driver->caps,
&driver->domains,
def)))
goto cleanup;
goto cleanup;
if (!(vm = virDomainAssignDef(conn,
+ driver->caps,
&driver->domains,
def)))
goto cleanup;