qemuDomainJobInfoUpdateTime(priv->job.current);
- g_free(priv->job.completed);
- priv->job.completed = g_new0(qemuDomainJobInfo, 1);
- *priv->job.completed = *priv->job.current;
+ g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
+ priv->job.completed = qemuDomainJobInfoCopy(priv->job.current);
priv->job.completed->stats.backup.total = priv->backup->push_total;
priv->job.completed->stats.backup.transferred = priv->backup->push_transferred;
}
+void
+qemuDomainJobInfoFree(qemuDomainJobInfoPtr info)
+{
+ g_free(info);
+}
+
+
+qemuDomainJobInfoPtr
+qemuDomainJobInfoCopy(qemuDomainJobInfoPtr info)
+{
+ qemuDomainJobInfoPtr ret = g_new0(qemuDomainJobInfo, 1);
+
+ memcpy(ret, info, sizeof(*info));
+
+ return ret;
+}
+
void
qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
virDomainObjPtr vm)
job->spiceMigrated = false;
job->dumpCompleted = false;
VIR_FREE(job->error);
- VIR_FREE(job->current);
+ g_clear_pointer(&job->current, qemuDomainJobInfoFree);
qemuMigrationParamsFree(job->migParams);
job->migParams = NULL;
job->apiFlags = 0;
{
qemuDomainObjResetJob(priv);
qemuDomainObjResetAsyncJob(priv);
- VIR_FREE(priv->job.current);
- VIR_FREE(priv->job.completed);
+ g_clear_pointer(&priv->job.current, qemuDomainJobInfoFree);
+ g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
virCondDestroy(&priv->job.cond);
virCondDestroy(&priv->job.asyncCond);
}
qemuDomainAsyncJobTypeToString(asyncJob),
obj, obj->def->name);
qemuDomainObjResetAsyncJob(priv);
- if (VIR_ALLOC(priv->job.current) < 0)
- goto cleanup;
+ priv->job.current = g_new0(qemuDomainJobInfo, 1);
priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_ACTIVE;
priv->job.asyncJob = asyncJob;
priv->job.asyncOwner = virThreadSelfID();
qemuDomainMirrorStats mirrorStats;
};
+void
+qemuDomainJobInfoFree(qemuDomainJobInfoPtr info);
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuDomainJobInfo, qemuDomainJobInfoFree);
+
+qemuDomainJobInfoPtr
+qemuDomainJobInfoCopy(qemuDomainJobInfoPtr info);
+
typedef struct _qemuDomainJobObj qemuDomainJobObj;
typedef qemuDomainJobObj *qemuDomainJobObjPtr;
struct _qemuDomainJobObj {
if (detach)
priv->job.current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_MEMDUMP;
else
- VIR_FREE(priv->job.current);
+ g_clear_pointer(&priv->job.current, qemuDomainJobInfoFree);
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver,
virDomainObjPtr vm,
bool completed,
- qemuDomainJobInfoPtr jobInfo)
+ qemuDomainJobInfoPtr *jobInfo)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
int ret = -1;
+ *jobInfo = NULL;
+
if (completed) {
if (priv->job.completed && !priv->job.current)
- *jobInfo = *priv->job.completed;
- else
- jobInfo->status = QEMU_DOMAIN_JOB_STATUS_NONE;
+ *jobInfo = qemuDomainJobInfoCopy(priv->job.completed);
return 0;
}
goto cleanup;
if (!priv->job.current) {
- jobInfo->status = QEMU_DOMAIN_JOB_STATUS_NONE;
ret = 0;
goto cleanup;
}
- *jobInfo = *priv->job.current;
+ *jobInfo = qemuDomainJobInfoCopy(priv->job.current);
- switch (jobInfo->statsType) {
+ switch ((*jobInfo)->statsType) {
case QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION:
case QEMU_DOMAIN_JOB_STATS_TYPE_SAVEDUMP:
- if (qemuDomainGetJobInfoMigrationStats(driver, vm, jobInfo) < 0)
+ if (qemuDomainGetJobInfoMigrationStats(driver, vm, *jobInfo) < 0)
goto cleanup;
break;
case QEMU_DOMAIN_JOB_STATS_TYPE_MEMDUMP:
- if (qemuDomainGetJobInfoDumpStats(driver, vm, jobInfo) < 0)
+ if (qemuDomainGetJobInfoDumpStats(driver, vm, *jobInfo) < 0)
goto cleanup;
break;
case QEMU_DOMAIN_JOB_STATS_TYPE_BACKUP:
- if (qemuBackupGetJobInfoStats(driver, vm, jobInfo) < 0)
+ if (qemuBackupGetJobInfoStats(driver, vm, *jobInfo) < 0)
goto cleanup;
break;
virDomainJobInfoPtr info)
{
virQEMUDriverPtr driver = dom->conn->privateData;
- qemuDomainJobInfo jobInfo;
+ g_autoptr(qemuDomainJobInfo) jobInfo = NULL;
virDomainObjPtr vm;
int ret = -1;
if (qemuDomainGetJobStatsInternal(driver, vm, false, &jobInfo) < 0)
goto cleanup;
- if (jobInfo.status == QEMU_DOMAIN_JOB_STATUS_NONE) {
+ if (!jobInfo ||
+ jobInfo->status == QEMU_DOMAIN_JOB_STATUS_NONE) {
ret = 0;
goto cleanup;
}
- ret = qemuDomainJobInfoToInfo(&jobInfo, info);
+ ret = qemuDomainJobInfoToInfo(jobInfo, info);
cleanup:
virDomainObjEndAPI(&vm);
virQEMUDriverPtr driver = dom->conn->privateData;
virDomainObjPtr vm;
qemuDomainObjPrivatePtr priv;
- qemuDomainJobInfo jobInfo;
+ g_autoptr(qemuDomainJobInfo) jobInfo = NULL;
bool completed = !!(flags & VIR_DOMAIN_JOB_STATS_COMPLETED);
int ret = -1;
if (qemuDomainGetJobStatsInternal(driver, vm, completed, &jobInfo) < 0)
goto cleanup;
- if (jobInfo.status == QEMU_DOMAIN_JOB_STATUS_NONE) {
+ if (!jobInfo ||
+ jobInfo->status == QEMU_DOMAIN_JOB_STATUS_NONE) {
*type = VIR_DOMAIN_JOB_NONE;
*params = NULL;
*nparams = 0;
goto cleanup;
}
- ret = qemuDomainJobInfoToParams(&jobInfo, type, params, nparams);
+ ret = qemuDomainJobInfoToParams(jobInfo, type, params, nparams);
if (completed && ret == 0 && !(flags & VIR_DOMAIN_JOB_STATS_KEEP_COMPLETED))
- VIR_FREE(priv->job.completed);
+ g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
cleanup:
virDomainObjEndAPI(&vm);
qemuDomainJobInfoUpdateTime(jobInfo);
qemuDomainJobInfoUpdateDowntime(jobInfo);
- VIR_FREE(priv->job.completed);
- if (VIR_ALLOC(priv->job.completed) == 0) {
- *priv->job.completed = *jobInfo;
- priv->job.completed->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
- }
+ g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
+ priv->job.completed = qemuDomainJobInfoCopy(jobInfo);
+ priv->job.completed->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
if (asyncJob != QEMU_ASYNC_JOB_MIGRATION_OUT &&
jobInfo->status == QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED)
if (retcode == 0)
jobInfo = priv->job.completed;
else
- VIR_FREE(priv->job.completed);
+ g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
/* Update times with the values sent by the destination daemon */
if (mig->jobInfo && jobInfo) {
: QEMU_MIGRATION_PHASE_FINISH2);
qemuDomainCleanupRemove(vm, qemuMigrationDstPrepareCleanup);
- VIR_FREE(priv->job.completed);
+ g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
cookie_flags = QEMU_MIGRATION_COOKIE_NETWORK |
QEMU_MIGRATION_COOKIE_STATS |
* is obsolete anyway.
*/
if (inPostCopy)
- VIR_FREE(priv->job.completed);
+ g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
}
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
qemuDomainRemoveInactiveJob(driver, vm);
cleanup:
- VIR_FREE(jobInfo);
+ g_clear_pointer(&jobInfo, qemuDomainJobInfoFree);
virPortAllocatorRelease(port);
if (priv->mon)
qemuMonitorSetDomainLog(priv->mon, NULL, NULL, NULL);
VIR_FREE(mig->name);
VIR_FREE(mig->lockState);
VIR_FREE(mig->lockDriver);
- VIR_FREE(mig->jobInfo);
+ g_clear_pointer(&mig->jobInfo, qemuDomainJobInfoFree);
virCPUDefFree(mig->cpu);
qemuMigrationCookieCapsFree(mig->caps);
VIR_FREE(mig);
if (!priv->job.completed)
return 0;
- if (!mig->jobInfo && VIR_ALLOC(mig->jobInfo) < 0)
- return -1;
+ g_clear_pointer(&mig->jobInfo, qemuDomainJobInfoFree);
+ mig->jobInfo = qemuDomainJobInfoCopy(priv->job.completed);
- *mig->jobInfo = *priv->job.completed;
mig->flags |= QEMU_MIGRATION_COOKIE_STATS;
return 0;
if (!(ctxt->node = virXPathNode("./statistics", ctxt)))
return NULL;
- if (VIR_ALLOC(jobInfo) < 0)
- return NULL;
+ jobInfo = g_new0(qemuDomainJobInfo, 1);
stats = &jobInfo->stats.mig;
jobInfo->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;