To acquire the asynchronous job condition
- ``qemuDomainObjBeginAsyncJob()``
+ ``virDomainObjBeginAsyncJob()``
- Waits until no async job is running
- Waits for ``job.cond`` condition ``job.active != 0`` using ``virDomainObj``
mutex
and repeats waiting in that case
- Sets ``job.asyncJob`` to the asynchronous job type
- ``qemuDomainObjEndAsyncJob()``
+ ``virDomainObjEndAsyncJob()``
- Sets ``job.asyncJob`` to 0
- Broadcasts on ``job.asyncCond`` condition
obj = qemuDomObjFromDomain(dom);
- qemuDomainObjBeginAsyncJob(obj, VIR_ASYNC_JOB_TYPE);
+ virDomainObjBeginAsyncJob(obj, VIR_ASYNC_JOB_TYPE);
qemuDomainObjSetAsyncJobMask(obj, allowedJobs);
...do prep work...
...do final work...
- qemuDomainObjEndAsyncJob(obj);
+ virDomainObjEndAsyncJob(obj);
virDomainObjEndAPI(&obj);
obj = qemuDomObjFromDomain(dom);
- qemuDomainObjBeginAsyncJob(obj, VIR_ASYNC_JOB_TYPE);
+ virDomainObjBeginAsyncJob(obj, VIR_ASYNC_JOB_TYPE);
...do prep work...
...do final work...
- qemuDomainObjEndAsyncJob(obj);
+ virDomainObjEndAsyncJob(obj);
virDomainObjEndAPI(&obj);
VIR_ASYNC_JOB_NONE, false);
}
+int virDomainObjBeginAsyncJob(virDomainObj *obj,
+ virDomainAsyncJob asyncJob,
+ virDomainJobOperation operation,
+ unsigned long apiFlags)
+{
+ if (virDomainObjBeginJobInternal(obj, obj->job, VIR_JOB_ASYNC,
+ VIR_AGENT_JOB_NONE,
+ asyncJob, false) < 0)
+ return -1;
+
+ obj->job->current->operation = operation;
+ obj->job->apiFlags = apiFlags;
+ return 0;
+}
+
/*
* obj must be locked and have a reference before calling
*
* grabbing a job requires checking more variables. */
virCondBroadcast(&obj->job->cond);
}
+
+void
+virDomainObjEndAsyncJob(virDomainObj *obj)
+{
+ obj->job->jobsQueued--;
+
+ VIR_DEBUG("Stopping async job: %s (vm=%p name=%s)",
+ virDomainAsyncJobTypeToString(obj->job->asyncJob),
+ obj, obj->def->name);
+
+ virDomainObjResetAsyncJob(obj->job);
+ if (obj->job->cb->saveStatusPrivate)
+ obj->job->cb->saveStatusPrivate(obj);
+ virCondBroadcast(&obj->job->asyncCond);
+}
int virDomainObjBeginAgentJob(virDomainObj *obj,
virDomainAgentJob agentJob)
G_GNUC_WARN_UNUSED_RESULT;
+int virDomainObjBeginAsyncJob(virDomainObj *obj,
+ virDomainAsyncJob asyncJob,
+ virDomainJobOperation operation,
+ unsigned long apiFlags)
+ G_GNUC_WARN_UNUSED_RESULT;
void virDomainObjEndJob(virDomainObj *obj);
void virDomainObjEndAgentJob(virDomainObj *obj);
+void virDomainObjEndAsyncJob(virDomainObj *obj);
virDomainJobTypeToString;
virDomainNestedJobAllowed;
virDomainObjBeginAgentJob;
+virDomainObjBeginAsyncJob;
virDomainObjBeginJob;
virDomainObjBeginJobInternal;
virDomainObjCanSetJob;
virDomainObjClearJob;
virDomainObjEndAgentJob;
+virDomainObjEndAsyncJob;
virDomainObjEndJob;
virDomainObjInitJob;
virDomainObjPreserveJob;
g_clear_pointer(&priv->backup, virDomainBackupDefFree);
if (vm->job->asyncJob == VIR_ASYNC_JOB_BACKUP)
- qemuDomainObjEndAsyncJob(vm);
+ virDomainObjEndAsyncJob(vm);
}
* infrastructure for async jobs. We'll allow standard modify-type jobs
* as the interlocking of conflicting operations is handled on the block
* job level */
- if (qemuDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_BACKUP,
+ if (virDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_BACKUP,
VIR_DOMAIN_JOB_OPERATION_BACKUP, flags) < 0)
return -1;
if (ret == 0)
qemuDomainObjReleaseAsyncJob(vm);
else
- qemuDomainObjEndAsyncJob(vm);
+ virDomainObjEndAsyncJob(vm);
return ret;
}
* To be called immediately before any QEMU monitor API call.
* Must have already either called virDomainObjBeginJob()
* and checked that the VM is still active, with asyncJob of
- * VIR_ASYNC_JOB_NONE; or already called qemuDomainObjBeginAsyncJob,
+ * VIR_ASYNC_JOB_NONE; or already called virDomainObjBeginAsyncJob,
* with the same asyncJob.
*
* Returns 0 if job was started, in which case this must be followed with
obj->job->asyncOwner = 0;
}
-int qemuDomainObjBeginAsyncJob(virDomainObj *obj,
- virDomainAsyncJob asyncJob,
- virDomainJobOperation operation,
- unsigned long apiFlags)
-{
- if (virDomainObjBeginJobInternal(obj, obj->job, VIR_JOB_ASYNC,
- VIR_AGENT_JOB_NONE,
- asyncJob, false) < 0)
- return -1;
-
- obj->job->current->operation = operation;
- obj->job->apiFlags = apiFlags;
- return 0;
-}
-
int
qemuDomainObjBeginNestedJob(virDomainObj *obj,
virDomainAsyncJob asyncJob)
VIR_ASYNC_JOB_NONE, true);
}
-void
-qemuDomainObjEndAsyncJob(virDomainObj *obj)
-{
- obj->job->jobsQueued--;
-
- VIR_DEBUG("Stopping async job: %s (vm=%p name=%s)",
- virDomainAsyncJobTypeToString(obj->job->asyncJob),
- obj, obj->def->name);
-
- virDomainObjResetAsyncJob(obj->job);
- qemuDomainSaveStatus(obj);
- virCondBroadcast(&obj->job->asyncCond);
-}
-
void
qemuDomainObjAbortAsyncJob(virDomainObj *obj)
{
void qemuDomainEventEmitJobCompleted(virQEMUDriver *driver,
virDomainObj *vm);
-int qemuDomainObjBeginAsyncJob(virDomainObj *obj,
- virDomainAsyncJob asyncJob,
- virDomainJobOperation operation,
- unsigned long apiFlags)
- G_GNUC_WARN_UNUSED_RESULT;
int qemuDomainObjBeginNestedJob(virDomainObj *obj,
virDomainAsyncJob asyncJob)
G_GNUC_WARN_UNUSED_RESULT;
virDomainJob job)
G_GNUC_WARN_UNUSED_RESULT;
-void qemuDomainObjEndAsyncJob(virDomainObj *obj);
void qemuDomainObjAbortAsyncJob(virDomainObj *obj);
void qemuDomainObjSetJobPhase(virDomainObj *obj,
int phase);
virQEMUSaveData *data = NULL;
g_autoptr(qemuDomainSaveCookie) cookie = NULL;
- if (qemuDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_SAVE,
- VIR_DOMAIN_JOB_OPERATION_SAVE, flags) < 0)
+ if (virDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_SAVE,
+ VIR_DOMAIN_JOB_OPERATION_SAVE, flags) < 0)
goto cleanup;
if (!qemuMigrationSrcIsAllowed(driver, vm, false, VIR_ASYNC_JOB_SAVE, 0))
virErrorRestore(&save_err);
}
}
- qemuDomainObjEndAsyncJob(vm);
+ virDomainObjEndAsyncJob(vm);
if (ret == 0)
qemuDomainRemoveInactive(driver, vm);
if (virDomainCoreDumpWithFormatEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
- if (qemuDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_DUMP,
+ if (virDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_DUMP,
VIR_DOMAIN_JOB_OPERATION_DUMP,
flags) < 0)
goto cleanup;
}
}
- qemuDomainObjEndAsyncJob(vm);
+ virDomainObjEndAsyncJob(vm);
if (ret == 0 && flags & VIR_DUMP_CRASH)
qemuDomainRemoveInactive(driver, vm);
switch (action) {
case VIR_DOMAIN_WATCHDOG_ACTION_DUMP:
- if (qemuDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_DUMP,
+ if (virDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_DUMP,
VIR_DOMAIN_JOB_OPERATION_DUMP,
flags) < 0) {
return;
}
endjob:
- qemuDomainObjEndAsyncJob(vm);
+ virDomainObjEndAsyncJob(vm);
}
static int
bool removeInactive = false;
unsigned long flags = VIR_DUMP_MEMORY_ONLY;
- if (qemuDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_DUMP,
+ if (virDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_DUMP,
VIR_DOMAIN_JOB_OPERATION_DUMP, flags) < 0)
return;
}
endjob:
- qemuDomainObjEndAsyncJob(vm);
+ virDomainObjEndAsyncJob(vm);
if (removeInactive)
qemuDomainRemoveInactive(driver, vm);
}
}
mask |= JOB_MASK(VIR_JOB_MODIFY_MIGRATION_SAFE);
- if (qemuDomainObjBeginAsyncJob(vm, job, op, apiFlags) < 0)
+ if (virDomainObjBeginAsyncJob(vm, job, op, apiFlags) < 0)
return -1;
qemuDomainJobSetStatsType(vm->job->current,
static void ATTRIBUTE_NONNULL(1)
qemuMigrationJobFinish(virDomainObj *vm)
{
- qemuDomainObjEndAsyncJob(vm);
+ virDomainObjEndAsyncJob(vm);
}
virDomainJobOperation operation,
unsigned long apiFlags)
{
- if (qemuDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_START,
+ if (virDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_START,
operation, apiFlags) < 0)
return -1;
void
qemuProcessEndJob(virDomainObj *vm)
{
- qemuDomainObjEndAsyncJob(vm);
+ virDomainObjEndAsyncJob(vm);
}
* a regular job, so we need to set the job mask to disallow query as
* 'savevm' blocks the monitor. External snapshot will then modify the
* job mask appropriately. */
- if (qemuDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_SNAPSHOT,
+ if (virDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_SNAPSHOT,
VIR_DOMAIN_JOB_OPERATION_SNAPSHOT, flags) < 0)
return NULL;
snapshot = qemuSnapshotCreate(vm, domain, def, driver, cfg, flags);
}
- qemuDomainObjEndAsyncJob(vm);
+ virDomainObjEndAsyncJob(vm);
return snapshot;
}