Signed-off-by: Rafael Fonseca <r4f4rfs(a)gmail.com>
---
src/libxl/libxl_migration.c | 76 ++++++++++++++++++++++++-------------
1 file changed, 49 insertions(+), 27 deletions(-)
diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c
index 50225855ae..8530b172ec 100644
--- a/src/libxl/libxl_migration.c
+++ b/src/libxl/libxl_migration.c
@@ -60,7 +60,7 @@ struct _libxlMigrationCookie {
};
typedef struct _libxlMigrationDstArgs {
- virObject parent;
+ GObject parent;
int recvfd;
virConnectPtr conn;
@@ -73,7 +73,30 @@ typedef struct _libxlMigrationDstArgs {
size_t nsocks;
} libxlMigrationDstArgs;
-static virClassPtr libxlMigrationDstArgsClass;
+G_DEFINE_TYPE(libxlMigrationDstArgs, libxl_migration_dst_args, G_TYPE_OBJECT);
+#define LIBXL_TYPE_MIGRATION_DST_ARGS libxl_migration_dst_args_get_type()
+G_DECLARE_FINAL_TYPE(libxlMigrationDstArgs,
+ libxl_migration_dst_args,
+ LIBXL,
+ MIGRATION_DST_ARGS,
+ GObject);
+
+static void libxlMigrationDstArgsDispose(GObject *obj);
+static void libxlMigrationDstArgsFinalize(GObject *obj);
+
+static void
+libxl_migration_dst_args_init(lixlMigrationDstArgs *args G_GNUC_UNUSED)
+{
+}
+
+static void
+libxl_migration_dst_args_class_init(lixlMigrationDstArgsClass *klass)
+{
+ GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+ obj->dispose = libxlMigrationDstArgsDispose;
+ obj->finalize = libxlMigrationDstArgsFinalize;
+}
static void
@@ -226,31 +249,34 @@ libxlMigrationEatCookie(const char *cookiein,
}
static void
-libxlMigrationDstArgsDispose(void *obj)
+libxlMigrationDstArgsDispose(GObject *obj)
{
- libxlMigrationDstArgs *args = obj;
+ libxlMigrationDstArgs *args = LIBXL_MIGRATION_DST_ARGS(obj);
- libxlMigrationCookieFree(args->migcookie);
- VIR_FREE(args->socks);
virObjectUnref(args->conn);
+ args->conn = NULL;
virObjectUnref(args->vm);
+ args->vm = NULL;
+
+ G_OBJECT_CLASS(libxl_migration_dst_args_parent_class)->dispose(obj);
}
-static int
-libxlMigrationDstArgsOnceInit(void)
+static void
+libxlMigrationDstArgsFinalize(GObject *obj)
{
- if (!VIR_CLASS_NEW(libxlMigrationDstArgs, virClassForObject()))
- return -1;
+ libxlMigrationDstArgs *args = LIBXL_MIGRATION_DST_ARGS(obj);
- return 0;
+ libxlMigrationCookieFree(args->migcookie);
+ VIR_FREE(args->socks);
+
+ G_OBJECT_CLASS(libxl_migration_dst_args_parent_class)->finalize(obj);
}
-VIR_ONCE_GLOBAL_INIT(libxlMigrationDstArgs);
static void
libxlDoMigrateDstReceive(void *opaque)
{
- libxlMigrationDstArgs *args = opaque;
+ g_autoptr(libxlMigrationDstArgs) args = LIBXL_MIGRATION_DST_ARGS(opaque);
virDomainObjPtr vm = args->vm;
virNetSocketPtr *socks = args->socks;
size_t nsocks = args->nsocks;
@@ -277,7 +303,6 @@ libxlDoMigrateDstReceive(void *opaque)
}
args->nsocks = 0;
VIR_FORCE_CLOSE(recvfd);
- virObjectUnref(args);
virDomainObjEndAPI(&vm);
}
@@ -287,7 +312,7 @@ libxlMigrateDstReceive(virNetSocketPtr sock,
int events G_GNUC_UNUSED,
void *opaque)
{
- libxlMigrationDstArgs *args = opaque;
+ g_autoptr(libxlMigrationDstArgs) args = LIBXL_MIGRATION_DST_ARGS(opaque);
virNetSocketPtr *socks = args->socks;
size_t nsocks = args->nsocks;
libxlDomainObjPrivatePtr priv = args->vm->privateData;
@@ -321,7 +346,7 @@ libxlMigrateDstReceive(virNetSocketPtr sock,
libxlDoMigrateDstReceive,
name,
false,
- args) < 0) {
+ g_object_ref(args)) < 0) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("Failed to create thread for receiving migration
data"));
goto fail;
@@ -339,7 +364,6 @@ libxlMigrateDstReceive(virNetSocketPtr sock,
}
args->nsocks = 0;
VIR_FORCE_CLOSE(recvfd);
- virObjectUnref(args);
}
static int
@@ -551,7 +575,7 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dconn,
libxlMigrationCookiePtr mig = NULL;
libxlDriverPrivatePtr driver = dconn->privateData;
virDomainObjPtr vm = NULL;
- libxlMigrationDstArgs *args = NULL;
+ g_autoptr(libxlMigrationDstArgs) args = NULL;
bool taint_hook = false;
libxlDomainObjPrivatePtr priv = NULL;
char *xmlout = NULL;
@@ -600,8 +624,8 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dconn,
if (libxlMigrationDstArgsInitialize() < 0)
goto endjob;
- if (!(args = virObjectNew(libxlMigrationDstArgsClass)))
- goto endjob;
+ args = LIBXL_MIGRATION_DST_ARGS(
+ g_object_new(LIBXL_TYPE_MIGRATION_DST_ARGS, NULL));
args->conn = virObjectRef(dconn);
args->vm = virObjectRef(vm);
@@ -618,7 +642,7 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dconn,
name = g_strdup_printf("mig-%s", args->vm->def->name);
if (virThreadCreateFull(priv->migrationDstReceiveThr, true,
libxlDoMigrateDstReceive,
- name, false, args) < 0) {
+ name, false, g_object_ref(args)) < 0) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("Failed to create thread for receiving migration
data"));
goto endjob;
@@ -634,7 +658,6 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dconn,
libxlMigrationCookieFree(mig);
VIR_FORCE_CLOSE(dataFD[1]);
VIR_FORCE_CLOSE(dataFD[0]);
- virObjectUnref(args);
/* Remove virDomainObj from domain list */
if (vm)
virDomainObjListRemove(driver->domains, vm);
@@ -665,7 +688,7 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn,
virNetSocketPtr *socks = NULL;
size_t nsocks = 0;
int nsocks_listen = 0;
- libxlMigrationDstArgs *args = NULL;
+ g_autoptr(libxlMigrationDstArgs) args = NULL;
bool taint_hook = false;
libxlDomainObjPrivatePtr priv = NULL;
size_t i;
@@ -765,8 +788,8 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn,
if (libxlMigrationDstArgsInitialize() < 0)
goto endjob;
- if (!(args = virObjectNew(libxlMigrationDstArgsClass)))
- goto endjob;
+ args = LIBXL_MIGRATION_DST_ARGS(
+ g_object_new(LIBXL_TYPE_MIGRATION_DST_ARGS, NULL));
args->conn = virObjectRef(dconn);
args->vm = virObjectRef(vm);
@@ -786,7 +809,7 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn,
if (virNetSocketAddIOCallback(socks[i],
VIR_EVENT_HANDLE_READABLE,
libxlMigrateDstReceive,
- virObjectRef(args),
+ g_object_ref(args),
NULL) < 0)
continue;
@@ -823,7 +846,6 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn,
VIR_FREE(hostname);
else
virURIFree(uri);
- virObjectUnref(args);
virDomainObjEndAPI(&vm);
return ret;
}
--
2.25.3