static void virDomainObjListDeallocator(void *payload, const char *name ATTRIBUTE_UNUSED)
{
virDomainObjPtr obj = payload;
- virDomainObjFree(obj);
+ virDomainObjLock(obj);
+ if (!virDomainObjUnref(obj))
+ virDomainObjUnlock(obj);
}
void virDomainObjListDeinit(virDomainObjListPtr doms)
#ifndef PROXY
-void virDomainObjFree(virDomainObjPtr dom)
+static void virDomainObjFree(virDomainObjPtr dom)
{
if (!dom)
return;
+ VIR_DEBUG("obj=%p", dom);
virDomainDefFree(dom->def);
virDomainDefFree(dom->newDef);
VIR_FREE(dom);
}
+void virDomainObjRef(virDomainObjPtr dom)
+{
+ dom->refs++;
+ VIR_DEBUG("obj=%p refs=%d", dom, dom->refs);
+}
+
+
+int virDomainObjUnref(virDomainObjPtr dom)
+{
+ dom->refs--;
+ VIR_DEBUG("obj=%p refs=%d", dom, dom->refs);
+ if (dom->refs == 0) {
+ virDomainObjUnlock(dom);
+ virDomainObjFree(dom);
+ return 1;
+ }
+ return 0;
+}
+
static virDomainObjPtr virDomainObjNew(virConnectPtr conn,
virCapsPtr caps)
{
domain->state = VIR_DOMAIN_SHUTOFF;
domain->monitorWatch = -1;
domain->monitor = -1;
+ domain->refs = 1;
+ VIR_DEBUG("obj=%p", domain);
return domain;
}
error:
VIR_FREE(nodes);
virDomainChrDefFree(obj->monitor_chr);
- virDomainObjFree(obj);
+ virDomainObjUnref(obj);
return NULL;
}
return obj;
error:
- virDomainObjFree(obj);
+ virDomainObjUnref(obj);
VIR_FREE(statusFile);
return NULL;
}
typedef virDomainObj *virDomainObjPtr;
struct _virDomainObj {
virMutex lock;
+ int refs;
int monitor;
virDomainChrDefPtr monitor_chr;
void virDomainHostdevDefFree(virDomainHostdevDefPtr def);
void virDomainDeviceDefFree(virDomainDeviceDefPtr def);
void virDomainDefFree(virDomainDefPtr vm);
-void virDomainObjFree(virDomainObjPtr vm);
+void virDomainObjRef(virDomainObjPtr vm);
+/* Returns 1 if the object was freed, 0 if more refs exist */
+int virDomainObjUnref(virDomainObjPtr vm);
virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
virCapsPtr caps,
goto cleanup;
}
+ virDomainObjLock(dom);
+
if (VIR_ALLOC(dom->def) < 0)
goto no_memory;
else
dom->state = VIR_DOMAIN_RUNNING;
+ dom->refs = 1;
dom->pid = veid;
dom->def->id = dom->state == VIR_DOMAIN_SHUTOFF ? -1 : veid;
if (virHashAddEntry(driver->domains.objs, uuidstr, dom) < 0)
goto no_memory;
+ virDomainObjUnlock(dom);
dom = NULL;
}
cleanup:
fclose(fp);
- virDomainObjFree(dom);
+ virDomainObjUnref(dom);
return -1;
}