Signed-off-by: Rafael Fonseca <r4f4rfs(a)gmail.com>
---
src/qemu/qemu_blockjob.c | 67 ++++++++++++++++++++++-----------------
src/qemu/qemu_blockjob.h | 15 ++++++---
src/qemu/qemu_domain.c | 4 +--
src/qemu/qemu_hotplug.c | 3 +-
src/qemu/qemu_migration.c | 16 +++-------
5 files changed, 55 insertions(+), 50 deletions(-)
diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index 2032c0c1c5..38fbba2b90 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -71,8 +71,23 @@ VIR_ENUM_IMPL(qemuBlockjob,
"create",
"broken");
-static virClassPtr qemuBlockJobDataClass;
+G_DEFINE_TYPE(qemuBlockJobData, qemu_block_job_data, G_TYPE_OBJECT);
+static void qemuBlockJobDataDispose(GObject *obj);
+static void qemuBlockJobDataFinalize(GObject *obj);
+static void
+qemu_block_job_data_init(qemuBlockJobData *job G_GNUC_UNUSED)
+{
+}
+
+static void
+qemu_block_job_data_class_init(qemuBlockJobDataClass *klass)
+{
+ GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+ obj->dispose = qemuBlockJobDataDispose;
+ obj->finalize = qemuBlockJobDataFinalize;
+}
static void
qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job)
@@ -88,43 +103,38 @@ qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job)
static void
-qemuBlockJobDataDispose(void *obj)
+qemuBlockJobDataDispose(GObject *obj)
{
- qemuBlockJobDataPtr job = obj;
+ qemuBlockJobDataPtr job = QEMU_BLOCK_JOB_DATA(obj);
virObjectUnref(job->chain);
+ job->chain = NULL;
virObjectUnref(job->mirrorChain);
+ job->mirrorChain = NULL;
+
+ G_OBJECT_CLASS(qemu_block_job_data_parent_class)->dispose(obj);
+}
+
+static void
+qemuBlockJobDataFinalize(GObject *obj)
+{
+ qemuBlockJobDataPtr job = QEMU_BLOCK_JOB_DATA(obj);
qemuBlockJobDataDisposeJobdata(job);
g_free(job->name);
g_free(job->errmsg);
-}
-
-static int
-qemuBlockJobDataOnceInit(void)
-{
- if (!VIR_CLASS_NEW(qemuBlockJobData, virClassForObject()))
- return -1;
-
- return 0;
+ G_OBJECT_CLASS(qemu_block_job_data_parent_class)->finalize(obj);
}
-VIR_ONCE_GLOBAL_INIT(qemuBlockJobData);
-
qemuBlockJobDataPtr
qemuBlockJobDataNew(qemuBlockJobType type,
const char *name)
{
- g_autoptr(qemuBlockJobData) job = NULL;
-
- if (qemuBlockJobDataInitialize() < 0)
- return NULL;
-
- if (!(job = virObjectNew(qemuBlockJobDataClass)))
- return NULL;
+ g_autoptr(qemuBlockJobData) job =
+ QEMU_BLOCK_JOB_DATA(g_object_new(QEMU_TYPE_BLOCK_JOB_DATA, NULL));
job->name = g_strdup(name);
@@ -180,15 +190,15 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job,
return -1;
}
- if (virHashAddEntry(priv->blockjobs, job->name, virObjectRef(job)) < 0) {
- virObjectUnref(job);
+ if (virHashAddEntry(priv->blockjobs, job->name, g_object_ref(job)) < 0) {
+ g_object_unref(job);
return -1;
}
if (disk) {
job->disk = disk;
job->chain = virObjectRef(disk->src);
- QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
+ QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = g_object_ref(job);
}
if (savestatus)
@@ -209,8 +219,7 @@ qemuBlockJobUnregister(qemuBlockJobDataPtr job,
diskPriv = QEMU_DOMAIN_DISK_PRIVATE(job->disk);
if (job == diskPriv->blockjob) {
- virObjectUnref(diskPriv->blockjob);
- diskPriv->blockjob = NULL;
+ g_clear_object(&diskPriv->blockjob);
}
job->disk = NULL;
@@ -427,7 +436,7 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
if (!job)
return NULL;
- return virObjectRef(job);
+ return g_object_ref(job);
}
@@ -466,7 +475,7 @@ qemuBlockJobStartupFinalize(virDomainObjPtr vm,
if (job->state == QEMU_BLOCKJOB_STATE_NEW)
qemuBlockJobUnregister(job, vm);
- virObjectUnref(job);
+ g_object_unref(job);
}
@@ -1738,7 +1747,7 @@ qemuBlockJobGetByDisk(virDomainDiskDefPtr disk)
if (!job)
return NULL;
- return virObjectRef(job);
+ return g_object_ref(job);
}
diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h
index 19498b5bd8..fc36131c67 100644
--- a/src/qemu/qemu_blockjob.h
+++ b/src/qemu/qemu_blockjob.h
@@ -23,6 +23,7 @@
#include "internal.h"
#include "qemu_conf.h"
+#include <glib-object.h>
/**
* This enum has to map all known block job states from enum virDomainBlockJobType
@@ -119,11 +120,8 @@ struct _qemuBlockJobBackupData {
};
-typedef struct _qemuBlockJobData qemuBlockJobData;
-typedef qemuBlockJobData *qemuBlockJobDataPtr;
-
struct _qemuBlockJobData {
- virObject parent;
+ GObject parent;
char *name;
@@ -154,7 +152,14 @@ struct _qemuBlockJobData {
bool invalidData; /* the job data (except name) is not valid */
bool reconnected; /* internal field for tracking whether job is live after reconnect
to qemu */
};
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuBlockJobData, virObjectUnref);
+
+#define QEMU_TYPE_BLOCK_JOB_DATA qemu_block_job_data_get_type()
+G_DECLARE_FINAL_TYPE(qemuBlockJobData,
+ qemu_block_job_data,
+ QEMU,
+ BLOCK_JOB_DATA,
+ GObject);
+typedef qemuBlockJobData *qemuBlockJobDataPtr;
int
qemuBlockJobRegister(qemuBlockJobDataPtr job,
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index c6980a53b6..99478890b6 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1166,7 +1166,7 @@ qemuDomainDiskPrivateDispose(void *obj)
virObjectUnref(priv->migrSource);
VIR_FREE(priv->qomName);
VIR_FREE(priv->nodeCopyOnRead);
- virObjectUnref(priv->blockjob);
+ g_clear_object(&priv->blockjob);
}
static virClassPtr qemuDomainStorageSourcePrivateClass;
@@ -2215,7 +2215,7 @@ qemuDomainObjPrivateAlloc(void *opaque)
if (!(priv->devs = virChrdevAlloc()))
goto error;
- if (!(priv->blockjobs = virHashCreate(5, virObjectFreeHashData)))
+ if (!(priv->blockjobs = virHashCreate(5, g_object_unref)))
goto error;
/* agent commands block by default, user can choose different behavior */
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 14654a17d7..98b02710d5 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -4276,8 +4276,7 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
if (diskPriv->blockjob) {
/* the block job keeps reference to the disk chain */
diskPriv->blockjob->disk = NULL;
- virObjectUnref(diskPriv->blockjob);
- diskPriv->blockjob = NULL;
+ g_clear_object(&diskPriv->blockjob);
} else {
if (!(diskBackend =
qemuBlockStorageSourceChainDetachPrepareBlockdev(disk->src)))
goto cleanup;
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index ab4ae8e150..6b668029b1 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -512,7 +512,7 @@ qemuMigrationSrcNBDStorageCopyReady(virDomainObjPtr vm,
for (i = 0; i < vm->def->ndisks; i++) {
virDomainDiskDefPtr disk = vm->def->disks[i];
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
- qemuBlockJobDataPtr job;
+ g_autoptr(qemuBlockJobData) job = NULL;
if (!diskPriv->migrating)
continue;
@@ -526,12 +526,9 @@ qemuMigrationSrcNBDStorageCopyReady(virDomainObjPtr vm,
qemuBlockJobUpdate(vm, job, asyncJob);
if (job->state == VIR_DOMAIN_BLOCK_JOB_FAILED) {
qemuMigrationNBDReportMirrorError(job, disk->dst);
- virObjectUnref(job);
return -1;
}
- virObjectUnref(job);
-
if (disk->mirrorState != VIR_DOMAIN_DISK_MIRROR_STATE_READY)
notReady++;
}
@@ -570,7 +567,7 @@ qemuMigrationSrcNBDCopyCancelled(virDomainObjPtr vm,
for (i = 0; i < vm->def->ndisks; i++) {
virDomainDiskDefPtr disk = vm->def->disks[i];
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
- qemuBlockJobDataPtr job;
+ g_autoptr(qemuBlockJobData) job = NULL;
if (!diskPriv->migrating)
continue;
@@ -597,8 +594,6 @@ qemuMigrationSrcNBDCopyCancelled(virDomainObjPtr vm,
if (job->state == VIR_DOMAIN_BLOCK_JOB_COMPLETED)
completed++;
-
- virObjectUnref(job);
}
/* Updating completed block job drops the lock thus we have to recheck
@@ -704,14 +699,13 @@ qemuMigrationSrcNBDCopyCancel(virQEMUDriverPtr driver,
for (i = 0; i < vm->def->ndisks; i++) {
virDomainDiskDefPtr disk = vm->def->disks[i];
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
- qemuBlockJobDataPtr job;
+ g_autoptr(qemuBlockJobData) job = NULL;
if (!(job = qemuBlockJobDiskGetJob(disk)) ||
!qemuBlockJobIsRunning(job))
diskPriv->migrating = false;
if (!diskPriv->migrating) {
- virObjectUnref(job);
continue;
}
@@ -726,8 +720,6 @@ qemuMigrationSrcNBDCopyCancel(virQEMUDriverPtr driver,
qemuBlockJobSyncEnd(vm, job, asyncJob);
diskPriv->migrating = false;
}
-
- virObjectUnref(job);
}
while ((rv = qemuMigrationSrcNBDCopyCancelled(vm, asyncJob, check)) != 1) {
@@ -5437,7 +5429,7 @@ qemuMigrationSrcCancel(virQEMUDriverPtr driver,
storage = true;
}
- virObjectUnref(job);
+ g_clear_object(&job);
}
if (storage &&
--
2.25.3