
On 02/20/2012 05:02 PM, Eric Blake wrote:
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 004cba7..12d48fb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1318,6 +1318,12 @@ void virDomainHostdevDefFree(virDomainHostdevDefPtr def) if (!def) return;
+ /* if there is a parent device object, it will handle freeing the + * memory (including the info). + */ + if (def->parent.type != VIR_DOMAIN_DEVICE_NONE) + return; + virDomainDeviceInfoFree(def->info); VIR_FREE(def); } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 25019e7..924c7ec 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -344,6 +344,7 @@ enum virDomainHostdevSubsysType { typedef struct _virDomainHostdevDef virDomainHostdevDef; typedef virDomainHostdevDef *virDomainHostdevDefPtr; struct _virDomainHostdevDef { + virDomainDeviceDef parent; /* higher level Def containing this */ However, that makes virDomainHostdevDef a rather large struct, since it is including an entire virDomainDeviceDef even if it is not otherwise used. Is it any better to keep the back pointer as a pointer, along the lines of:
if (!def->parent) return;
struct _virDomainHostdefDef { virDomainDeviceDefPtr parent;
virDomainDeviceDef *looks* big, but it's really just one int and one pointer (everything after "int type" is a union of several different pointer types). Making parent a virDomainDeviceDefPtr only saves sizeof(int), but introduces an extra level of indirection and the possibility of a memory leak, so I think it's best left as it is.