[PATCH v2 36/40] qemu: convert qemuBlockJobData to GObject

Rafael Fonseca r4f4rfs at gmail.com
Tue Apr 21 13:49:17 UTC 2020


Signed-off-by: Rafael Fonseca <r4f4rfs at 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





More information about the libvir-list mailing list