#define VIR_DOMAIN_XML_WRITE_FLAGS VIR_DOMAIN_XML_SECURE
#define VIR_DOMAIN_XML_READ_FLAGS VIR_DOMAIN_XML_INACTIVE
+static virClassPtr virDomainObjClass;
+static void virDomainObjDispose(void *obj);
+
+static int virDomainObjOnceInit(void)
+{
+ if (!(virDomainObjClass = virClassNew("virDomainObj",
+ sizeof(virDomainObj),
+ virDomainObjDispose)))
+ return -1;
+
+ return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virDomainObj)
+
void
virBlkioDeviceWeightArrayClear(virBlkioDeviceWeightPtr deviceWeights,
int ndevices)
{
virDomainObjPtr obj = payload;
virDomainObjLock(obj);
- if (virDomainObjUnref(obj) > 0)
+ if (virObjectUnref(obj))
virDomainObjUnlock(obj);
}
}
static void virDomainSnapshotObjListDeinit(virDomainSnapshotObjListPtr snapshots);
-static void virDomainObjFree(virDomainObjPtr dom)
+
+static void virDomainObjDispose(void *obj)
{
- if (!dom)
- return;
+ virDomainObjPtr dom = obj;
VIR_DEBUG("obj=%p", dom);
virDomainDefFree(dom->def);
virMutexDestroy(&dom->lock);
virDomainSnapshotObjListDeinit(&dom->snapshots);
-
- 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 0;
- }
- return dom->refs;
-}
-
-static virDomainObjPtr virDomainObjNew(virCapsPtr caps)
+virDomainObjPtr virDomainObjNew(virCapsPtr caps)
{
virDomainObjPtr domain;
- if (VIR_ALLOC(domain) < 0) {
- virReportOOMError();
+ if (virDomainObjInitialize() < 0)
+ return NULL;
+
+ if (!(domain = virObjectNew(virDomainObjClass)))
return NULL;
- }
if (caps->privateDataAllocFunc &&
!(domain->privateData = (caps->privateDataAllocFunc)())) {
virDomainObjLock(domain);
virDomainObjSetState(domain, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_UNKNOWN);
- domain->refs = 1;
virDomainSnapshotObjListInit(&domain->snapshots);
return obj;
error:
- /* obj was never shared, so unref should return 0 */
- ignore_value(virDomainObjUnref(obj));
+ virObjectUnref(obj);
VIR_FREE(nodes);
return NULL;
}
return obj;
error:
- /* obj was never shared, so unref should return 0 */
- if (obj)
- ignore_value(virDomainObjUnref(obj));
+ virObjectUnref(obj);
VIR_FREE(statusFile);
return NULL;
}
# include "virnetdevvportprofile.h"
# include "virnetdevopenvswitch.h"
# include "virnetdevbandwidth.h"
+# include "virobject.h"
/* forward declarations of all device types, required by
* virDomainDeviceDef
typedef struct _virDomainObj virDomainObj;
typedef virDomainObj *virDomainObjPtr;
struct _virDomainObj {
+ virObject object;
+
virMutex lock;
- int refs;
pid_t pid;
virDomainStateReason state;
return dom->def->id != -1;
}
+virDomainObjPtr virDomainObjNew(virCapsPtr caps);
int virDomainObjListInit(virDomainObjListPtr objs);
void virDomainObjListDeinit(virDomainObjListPtr objs);
void *opaque);
void virDomainDefFree(virDomainDefPtr vm);
-void virDomainObjRef(virDomainObjPtr vm);
-/* Returns 1 if the object was freed, 0 if more refs exist */
-int virDomainObjUnref(virDomainObjPtr vm) ATTRIBUTE_RETURN_CHECK;
virDomainChrDefPtr virDomainChrDefNew(void);
virDomainObjListInit;
virDomainObjListNumOfDomains;
virDomainObjLock;
-virDomainObjRef;
+virDomainObjNew;
virDomainObjSetDefTransient;
virDomainObjSetState;
virDomainObjTaint;
virDomainObjUnlock;
-virDomainObjUnref;
virDomainPausedReasonTypeFromString;
virDomainPausedReasonTypeToString;
virDomainPciRombarModeTypeFromString;
{
virDomainObjPtr vm = data;
- ignore_value(virDomainObjUnref(vm));
+ virObjectUnref(vm);
}
static void
/* Add a reference to the domain object while it is injected in
* the event loop.
*/
- virDomainObjRef(vm);
+ virObjectRef(vm);
if ((priv->eventHdl = virEventAddHandle(
fd,
VIR_EVENT_HANDLE_READABLE | VIR_EVENT_HANDLE_ERROR,
libxlEventHandler,
vm, libxlDomainObjUnref)) < 0) {
- ignore_value(virDomainObjUnref(vm));
+ virObjectUnref(vm);
goto error;
}
priv = vm->privateData;
if (priv->monitor == mon)
priv->monitor = NULL;
- if (virDomainObjUnref(vm) > 0)
+ if (virObjectUnref(vm))
virDomainObjUnlock(vm);
}
/* Hold an extra reference because we can't allow 'vm' to be
* deleted while the monitor is active */
- virDomainObjRef(vm);
+ virObjectRef(vm);
monitor = virLXCMonitorNew(vm, driver->stateDir, &monitorCallbacks);
if (monitor == NULL)
- ignore_value(virDomainObjUnref(vm));
+ virObjectUnref(vm);
if (virSecurityManagerClearSocketLabel(driver->securityManager, vm->def) < 0) {
if (monitor) {
}
*line++ = '\0';
- if (VIR_ALLOC(dom) < 0)
- goto no_memory;
-
- if (virMutexInit(&dom->lock) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("cannot initialize mutex"));
- VIR_FREE(dom);
- goto cleanup;
- }
-
- virDomainObjLock(dom);
+ if (!(dom = virDomainObjNew(driver->caps)))
+ goto cleanup;
if (VIR_ALLOC(dom->def) < 0)
goto no_memory;
VIR_DOMAIN_RUNNING_UNKNOWN);
}
- dom->refs = 1;
dom->pid = veid;
if (virDomainObjGetState(dom, NULL) == VIR_DOMAIN_SHUTOFF)
dom->def->id = -1;
goto cleanup;
}
- virDomainObjUnlock(dom);
dom = NULL;
}
virCommandFree(cmd);
VIR_FREE(temp);
VIR_FREE(outbuf);
- /* dom hasn't been shared yet, so unref should return 0 */
- if (dom)
- ignore_value(virDomainObjUnref(dom));
+ virObjectUnref(dom);
return -1;
}
return -1;
then = now + QEMU_JOB_WAIT_TIME;
- virDomainObjRef(obj);
+ virObjectRef(obj);
if (driver_locked)
qemuDriverUnlock(driver);
qemuDriverLock(driver);
virDomainObjLock(obj);
}
- /* Safe to ignore value since ref count was incremented above */
- ignore_value(virDomainObjUnref(obj));
+ virObjectUnref(obj);
return -1;
}
* To be called after completing the work associated with the
* earlier qemuDomainBeginJob() call
*
- * Returns remaining refcount on 'obj', maybe 0 to indicated it
- * was deleted
+ * Returns true if @obj was still referenced, false if it was
+ * disposed of.
*/
-int qemuDomainObjEndJob(struct qemud_driver *driver, virDomainObjPtr obj)
+bool qemuDomainObjEndJob(struct qemud_driver *driver, virDomainObjPtr obj)
{
qemuDomainObjPrivatePtr priv = obj->privateData;
enum qemuDomainJob job = priv->job.active;
qemuDomainObjSaveJob(driver, obj);
virCondSignal(&priv->job.cond);
- return virDomainObjUnref(obj);
+ return virObjectUnref(obj);
}
-int
+bool
qemuDomainObjEndAsyncJob(struct qemud_driver *driver, virDomainObjPtr obj)
{
qemuDomainObjPrivatePtr priv = obj->privateData;
qemuDomainObjSaveJob(driver, obj);
virCondBroadcast(&priv->job.asyncCond);
- return virDomainObjUnref(obj);
+ return virObjectUnref(obj);
}
static int
qemuDomainObjSaveJob(driver, obj);
virCondSignal(&priv->job.cond);
- /* safe to ignore since the surrounding async job increased
- * the reference counter as well */
- ignore_value(virDomainObjUnref(obj));
+ virObjectUnref(obj);
}
}
void qemuDomainObjEnterRemoteWithDriver(struct qemud_driver *driver,
virDomainObjPtr obj)
{
- virDomainObjRef(obj);
+ virObjectRef(obj);
virDomainObjUnlock(obj);
qemuDriverUnlock(driver);
}
{
qemuDriverLock(driver);
virDomainObjLock(obj);
- /* Safe to ignore value, since we incremented ref in
- * qemuDomainObjEnterRemoteWithDriver */
- ignore_value(virDomainObjUnref(obj));
+ virObjectUnref(obj);
}
enum qemuDomainAsyncJob asyncJob)
ATTRIBUTE_RETURN_CHECK;
-int qemuDomainObjEndJob(struct qemud_driver *driver,
- virDomainObjPtr obj)
+bool qemuDomainObjEndJob(struct qemud_driver *driver,
+ virDomainObjPtr obj)
ATTRIBUTE_RETURN_CHECK;
-int qemuDomainObjEndAsyncJob(struct qemud_driver *driver,
- virDomainObjPtr obj)
+bool qemuDomainObjEndAsyncJob(struct qemud_driver *driver,
+ virDomainObjPtr obj)
ATTRIBUTE_RETURN_CHECK;
void qemuDomainObjSetJobPhase(struct qemud_driver *driver,
virDomainObjPtr obj,
ignore_value(qemuDomainObjEndAsyncJob(driver, wdEvent->vm));
unlock:
- if (virDomainObjUnref(wdEvent->vm) > 0)
+ if (virObjectUnref(wdEvent->vm))
virDomainObjUnlock(wdEvent->vm);
qemuDriverUnlock(driver);
VIR_FREE(wdEvent);
* This prevents any other APIs being invoked while incoming
* migration is taking place.
*/
- if (qemuMigrationJobContinue(vm) == 0) {
+ if (!qemuMigrationJobContinue(vm)) {
vm = NULL;
virReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("domain disappeared"));
return ret;
endjob:
- if (qemuMigrationJobFinish(driver, vm) == 0) {
+ if (!qemuMigrationJobFinish(driver, vm)) {
vm = NULL;
}
goto cleanup;
VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
}
- if (qemuMigrationJobFinish(driver, vm) == 0) {
+ if (!qemuMigrationJobFinish(driver, vm)) {
vm = NULL;
} else if (!virDomainObjIsActive(vm) &&
(!vm->persistent ||
virDomainEventPtr event = NULL;
int ret = -1;
bool resume;
- int refs;
+ bool hasrefs;
/* If we didn't start the job in the begin phase, start it now. */
if (!(flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
endjob:
if (ret < 0)
- refs = qemuMigrationJobFinish(driver, vm);
+ hasrefs = qemuMigrationJobFinish(driver, vm);
else
- refs = qemuMigrationJobContinue(vm);
- if (refs == 0) {
+ hasrefs = qemuMigrationJobContinue(vm);
+ if (!hasrefs) {
vm = NULL;
} else if (!virDomainObjIsActive(vm) && !vm->persistent) {
qemuDomainRemoveInactive(driver, vm);
virDomainObjPtr vm,
enum qemuMigrationJobPhase phase)
{
- virDomainObjRef(vm);
+ virObjectRef(vm);
qemuMigrationJobSetPhase(driver, vm, phase);
}
-int
+bool
qemuMigrationJobContinue(virDomainObjPtr vm)
{
qemuDomainObjReleaseAsyncJob(vm);
- return virDomainObjUnref(vm);
+ return virObjectUnref(vm);
}
bool
return true;
}
-int
+bool
qemuMigrationJobFinish(struct qemud_driver *driver, virDomainObjPtr vm)
{
return qemuDomainObjEndAsyncJob(driver, vm);
virDomainObjPtr vm,
enum qemuMigrationJobPhase phase)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-int qemuMigrationJobContinue(virDomainObjPtr obj)
+bool qemuMigrationJobContinue(virDomainObjPtr obj)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
bool qemuMigrationJobIsActive(virDomainObjPtr vm,
enum qemuDomainAsyncJob job)
ATTRIBUTE_NONNULL(1);
-int qemuMigrationJobFinish(struct qemud_driver *driver, virDomainObjPtr obj)
+bool qemuMigrationJobFinish(struct qemud_driver *driver, virDomainObjPtr obj)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
int qemuMigrationSetOffline(struct qemud_driver *driver,
priv = vm->privateData;
if (priv->agent == agent)
priv->agent = NULL;
- if (virDomainObjUnref(vm) > 0)
+ if (virObjectUnref(vm))
virDomainObjUnlock(vm);
}
/* Hold an extra reference because we can't allow 'vm' to be
* deleted while the agent is active */
- virDomainObjRef(vm);
+ virObjectRef(vm);
ignore_value(virTimeMillisNow(&priv->agentStart));
virDomainObjUnlock(vm);
goto cleanup;
}
- /* Safe to ignore value since ref count was incremented above */
if (agent == NULL)
- ignore_value(virDomainObjUnref(vm));
+ virObjectUnref(vm);
if (!virDomainObjIsActive(vm)) {
qemuAgentClose(agent);
ret = 0;
endjob:
- if (qemuDomainObjEndJob(driver, vm) == 0)
+ if (!qemuDomainObjEndJob(driver, vm))
vm = NULL;
cleanup:
ignore_value(qemuProcessKill(driver, vm,
VIR_QEMU_PROCESS_KILL_FORCE));
}
- if (virDomainObjUnref(vm) > 0)
+ if (virObjectUnref(vm))
virDomainObjUnlock(vm);
}
if (event)
if (priv->fakeReboot) {
qemuDomainSetFakeReboot(driver, vm, false);
- virDomainObjRef(vm);
+ virObjectRef(vm);
virThread th;
if (virThreadCreate(&th,
false,
VIR_ERROR(_("Failed to create reboot thread, killing domain"));
ignore_value(qemuProcessKill(driver, vm,
VIR_QEMU_PROCESS_KILL_NOWAIT));
- /* Safe to ignore value since ref count was incremented above */
- ignore_value(virDomainObjUnref(vm));
+ virObjectUnref(vm);
}
} else {
ignore_value(qemuProcessKill(driver, vm, VIR_QEMU_PROCESS_KILL_NOWAIT));
/* Hold an extra reference because we can't allow 'vm' to be
* deleted before handling watchdog event is finished.
*/
- virDomainObjRef(vm);
+ virObjectRef(vm);
if (virThreadPoolSendJob(driver->workerPool, 0, wdEvent) < 0) {
- if (virDomainObjUnref(vm) == 0)
+ if (!virObjectUnref(vm))
vm = NULL;
VIR_FREE(wdEvent);
}
priv = vm->privateData;
if (priv->mon == mon)
priv->mon = NULL;
- if (virDomainObjUnref(vm) > 0)
+ if (virObjectUnref(vm))
virDomainObjUnlock(vm);
}
/* Hold an extra reference because we can't allow 'vm' to be
* deleted while the monitor is active */
- virDomainObjRef(vm);
+ virObjectRef(vm);
ignore_value(virTimeMillisNow(&priv->monStart));
virDomainObjUnlock(vm);
virDomainObjLock(vm);
priv->monStart = 0;
- /* Safe to ignore value since ref count was incremented above */
if (mon == NULL)
- ignore_value(virDomainObjUnref(vm));
+ virObjectUnref(vm);
if (!virDomainObjIsActive(vm)) {
qemuMonitorClose(mon);
/* Hold an extra reference because we can't allow 'vm' to be
* deleted if qemuConnectMonitor() failed */
- virDomainObjRef(obj);
+ virObjectRef(obj);
/* XXX check PID liveliness & EXE path */
if (qemuConnectMonitor(driver, obj) < 0)
driver->nextvmid = obj->def->id + 1;
endjob:
- if (qemuDomainObjEndJob(driver, obj) == 0)
+ if (!qemuDomainObjEndJob(driver, obj))
obj = NULL;
- if (obj && virDomainObjUnref(obj) > 0)
+ if (obj && virObjectUnref(obj))
virDomainObjUnlock(obj);
qemuDriverUnlock(driver);
return;
error:
- if (qemuDomainObjEndJob(driver, obj) == 0)
+ if (!qemuDomainObjEndJob(driver, obj))
obj = NULL;
if (obj) {
if (!virDomainObjIsActive(obj)) {
- if (virDomainObjUnref(obj) > 0)
+ if (virObjectUnref(obj))
virDomainObjUnlock(obj);
qemuDriverUnlock(driver);
return;
}
- if (virDomainObjUnref(obj) > 0) {
+ if (virObjectUnref(obj)) {
/* We can't get the monitor back, so must kill the VM
* to remove danger of it ending up running twice if
* user tries to start it again later
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Could not create thread. QEMU initialization "
"might be incomplete"));
- if (qemuDomainObjEndJob(src->driver, obj) == 0) {
+ if (!qemuDomainObjEndJob(src->driver, obj)) {
obj = NULL;
- } else if (virDomainObjUnref(obj) > 0) {
+ } else if (virObjectUnref(obj)) {
/* We can't spawn a thread and thus connect to monitor.
* Kill qemu */
qemuProcessStop(src->driver, obj, VIR_DOMAIN_SHUTOFF_FAILED, 0);
* a case, but there are too many to maintain certainty, so we
* will do this as a precaution).
*/
- virDomainObjRef(vm);
+ virObjectRef(vm);
virDomainObjUnlock(vm);
qemuDriverLock(driver);
virDomainObjLock(vm);
- /* Safe to ignore value since ref count was incremented above */
- ignore_value(virDomainObjUnref(vm));
+ virObjectUnref(vm);
}
return ret;
}
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
- if (qemuDomainObjEndJob(driver, dom) == 0)
+ if (!qemuDomainObjEndJob(driver, dom))
dom = NULL;
if (dom && !dom->persistent)
qemuDomainRemoveInactive(driver, dom);
VIR_FREE(directoryName);
VIR_FREE(fileName);
VIR_FREE(vmx);
- /* any non-NULL vm here has not been shared, so unref will return 0 */
- if (vm)
- ignore_value(virDomainObjUnref(vm));
+ virObjectUnref(vm);
return ret;
}