[PATCH 00/36] convert virObjects to GObject

This patch series convert various simple instances of virObject to a GObject equivalent. virDomain is still WIP because it causes some linking problem I am still investigating. virObjects that work as parent class to other objects will be covered in a next patchset. Rafael Fonseca (36): util: virresctrl: convert classes to GObject conf: capabilities: convert virCaps to GOBject qemu: convert virQEMUCaps to GObject rpc: convert virNetClientProgram to GObject rpc: convert virNetServerProgram to GObject conf: convert virDomainXMLOption to GObject bhyve: convert bhyveMonitor to GObject bhyve: convert virBhyveDriverConfig to GObject rpc: convert virNetServerService to GObject conf: convert virDomainCapsCPUModels to GObject util: convert dnsmasqCaps to GObject conf: convert virDomainChrSourceDef to GObject admin: convert virAdmServer to GObject admin: convert virAdmClient to GObject datatypes: convert virDomainCheckpoint to GObject datatypes: convert virDomainSnapshot to GObject datatypes: convert virNWFilter to GObject datatypes: convert virNWFilterBinding to GObject datatypes: convert virNetwork to GObject datatypes: convert virNetworkPort to GObject datatypes: convert virInterface to GObject datatypes: convert virStoragePool to GObject datatypes: convert virStorageVol to GObject datatypes: convert virNodeDevice to GObject datatypes: convert virSecret to GObject datatypes: convert virStream to GObject conf: convert virNetworkXMLOption to GObject lxc: convert virLXCDriverConfig to GObject libxl: convert libxlDriverConfig to GObject hypervisor: convert virHostdevManager to GObject libxl: convert libxlMigrationDstArgs to GObject qemu: convert qemuBlockJobData to GObject qemu: convert virQEMUDriverConfig to GObject conf: convert virDomain*Private to GObject conf: convert virSaveCookie to GObject util: convert virStorageSource to GObject src/admin/admin_remote.c | 10 +- src/admin/libvirt-admin.c | 4 +- src/admin/libvirt_admin_private.syms | 2 - src/bhyve/bhyve_capabilities.c | 19 +- src/bhyve/bhyve_conf.c | 34 +- src/bhyve/bhyve_driver.c | 36 +- src/bhyve/bhyve_monitor.c | 35 +- src/bhyve/bhyve_monitor.h | 3 +- src/bhyve/bhyve_utils.h | 11 +- src/conf/capabilities.c | 42 +- src/conf/capabilities.h | 6 +- src/conf/domain_capabilities.c | 48 +- src/conf/domain_capabilities.h | 10 +- src/conf/domain_conf.c | 126 ++--- src/conf/domain_conf.h | 36 +- src/conf/network_conf.c | 31 +- src/conf/network_conf.h | 12 +- src/conf/network_event.c | 2 +- src/conf/node_device_event.c | 9 +- src/conf/node_device_util.c | 4 +- src/conf/secret_event.c | 9 +- src/conf/snapshot_conf.c | 3 +- src/conf/snapshot_conf.h | 2 +- src/conf/storage_capabilities.c | 5 +- src/conf/storage_event.c | 15 +- src/conf/virchrdev.c | 5 +- src/conf/virconftypes.h | 3 +- src/conf/virdomaincheckpointobjlist.c | 6 +- src/conf/virdomainsnapshotobjlist.c | 6 +- src/conf/virinterfaceobj.c | 7 +- src/conf/virnetworkobj.c | 14 +- src/conf/virnodedeviceobj.c | 10 +- src/conf/virnwfilterbindingobjlist.c | 6 +- src/conf/virnwfilterobj.c | 6 +- src/conf/virsavecookie.c | 10 +- src/conf/virsavecookie.h | 14 +- src/conf/virsecretobj.c | 8 +- src/conf/virstorageobj.c | 16 +- src/datatypes.c | 601 +++++++++++++++--------- src/datatypes.h | 199 ++++---- src/esx/esx_driver.c | 28 +- src/hypervisor/virhostdev.c | 31 +- src/hypervisor/virhostdev.h | 13 +- src/interface/interface_backend_netcf.c | 2 +- src/interface/interface_backend_udev.c | 2 +- src/libvirt-domain-checkpoint.c | 7 +- src/libvirt-domain-snapshot.c | 7 +- src/libvirt-interface.c | 6 +- src/libvirt-network.c | 14 +- src/libvirt-nodedev.c | 6 +- src/libvirt-nwfilter.c | 14 +- src/libvirt-secret.c | 7 +- src/libvirt-storage.c | 12 +- src/libvirt-stream.c | 7 +- src/libvirt_private.syms | 11 - src/libxl/libxl_capabilities.c | 19 +- src/libxl/libxl_conf.c | 57 ++- src/libxl/libxl_conf.h | 12 +- src/libxl/libxl_driver.c | 178 +++---- src/libxl/libxl_migration.c | 80 ++-- src/libxl/xen_common.c | 2 +- src/locking/lock_daemon.c | 28 +- src/locking/lock_driver_lockd.c | 23 +- src/logging/log_daemon.c | 28 +- src/logging/log_manager.c | 17 +- src/lxc/lxc_conf.c | 47 +- src/lxc/lxc_conf.h | 10 +- src/lxc/lxc_controller.c | 25 +- src/lxc/lxc_driver.c | 102 ++-- src/lxc/lxc_monitor.c | 3 +- src/lxc/lxc_process.c | 36 +- src/network/bridge_driver.c | 23 +- src/nwfilter/nwfilter_driver.c | 3 +- src/openvz/openvz_conf.c | 10 +- src/qemu/qemu_blockjob.c | 126 +++-- src/qemu/qemu_blockjob.h | 15 +- src/qemu/qemu_capabilities.c | 133 +++--- src/qemu/qemu_capabilities.h | 9 +- src/qemu/qemu_conf.c | 44 +- src/qemu/qemu_conf.h | 19 +- src/qemu/qemu_domain.c | 435 ++++++++--------- src/qemu/qemu_domain.h | 157 +++++-- src/qemu/qemu_driver.c | 32 +- src/qemu/qemu_migration.c | 12 +- src/qemu/qemu_process.c | 21 +- src/qemu/qemu_virtiofs.c | 12 +- src/remote/remote_daemon.c | 52 +- src/remote/remote_daemon_dispatch.c | 35 +- src/remote/remote_daemon_stream.c | 8 +- src/remote/remote_driver.c | 71 +-- src/rpc/gendispatch.pl | 4 +- src/rpc/virnetclient.c | 4 +- src/rpc/virnetclientprogram.c | 29 +- src/rpc/virnetclientprogram.h | 10 +- src/rpc/virnetclientstream.c | 5 +- src/rpc/virnetserver.c | 18 +- src/rpc/virnetserverprogram.c | 30 +- src/rpc/virnetserverprogram.h | 17 +- src/rpc/virnetserverservice.c | 87 ++-- src/security/virt-aa-helper.c | 11 +- src/storage/storage_backend.c | 3 +- src/storage/storage_driver.c | 7 +- src/storage/storage_util.c | 4 +- src/test/test_driver.c | 33 +- src/util/virdnsmasq.c | 56 +-- src/util/virdnsmasq.h | 6 +- src/util/virfdstream.c | 5 +- src/util/virfilecache.c | 13 +- src/util/virresctrl.c | 137 +++--- src/util/virresctrl.h | 15 +- src/util/virsecret.c | 3 +- src/util/virstoragefile.c | 41 +- src/util/virstoragefile.h | 9 +- src/vbox/vbox_common.c | 10 +- src/vmware/vmware_conf.c | 15 +- src/vz/vz_driver.c | 30 +- src/vz/vz_sdk.c | 22 +- tests/bhyveargv2xmltest.c | 4 +- tests/bhyvexml2argvtest.c | 4 +- tests/bhyvexml2xmltest.c | 4 +- tests/cputest.c | 49 +- tests/domaincapstest.c | 6 +- tests/domainconftest.c | 6 +- tests/genericxml2xmltest.c | 6 +- tests/networkxml2conftest.c | 10 +- tests/networkxml2xmltest.c | 3 +- tests/openvzutilstest.c | 4 +- tests/qemublocktest.c | 3 +- tests/qemucapabilitiestest.c | 9 +- tests/qemucaps2xmltest.c | 29 +- tests/qemucapsprobe.c | 4 +- tests/qemuhotplugtest.c | 6 +- tests/qemumemlocktest.c | 3 +- tests/testutils.c | 4 +- tests/testutilslxc.c | 24 +- tests/testutilsqemu.c | 35 +- tests/testutilsxen.c | 9 +- tests/vircaps2xmltest.c | 6 +- tests/vircapstest.c | 14 +- tests/virfilecachetest.c | 53 +-- tests/virnetdaemontest.c | 4 +- tests/virresctrltest.c | 6 +- tests/vmx2xmltest.c | 11 +- tests/xml2vmxtest.c | 15 +- 144 files changed, 2243 insertions(+), 2188 deletions(-) -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/capabilities.c | 3 +- src/conf/domain_conf.c | 21 +++--- src/util/virresctrl.c | 137 ++++++++++++++++++++++------------------ src/util/virresctrl.h | 15 +++-- tests/virresctrltest.c | 3 +- 5 files changed, 97 insertions(+), 82 deletions(-) diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 99b69aebb5..2c91461a54 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -266,7 +266,8 @@ virCapsDispose(void *object) VIR_FREE(caps->host.netprefix); VIR_FREE(caps->host.pagesSize); virCPUDefFree(caps->host.cpu); - virObjectUnref(caps->host.resctrl); + if (caps->host.resctrl) + g_object_unref(caps->host.resctrl); } /** diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 914e03c705..425a6bccb6 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3286,7 +3286,8 @@ virDomainResctrlMonDefFree(virDomainResctrlMonDefPtr domresmon) return; virBitmapFree(domresmon->vcpus); - virObjectUnref(domresmon->instance); + if (domresmon->instance) + g_object_unref(domresmon->instance); VIR_FREE(domresmon); } @@ -3302,7 +3303,8 @@ virDomainResctrlDefFree(virDomainResctrlDefPtr resctrl) for (i = 0; i < resctrl->nmonitors; i++) virDomainResctrlMonDefFree(resctrl->monitors[i]); - virObjectUnref(resctrl->alloc); + if (resctrl->alloc) + g_object_unref(resctrl->alloc); virBitmapFree(resctrl->vcpus); VIR_FREE(resctrl->monitors); VIR_FREE(resctrl); @@ -19887,11 +19889,6 @@ virDomainResctrlMonDefParse(virDomainDefPtr def, domresmon->tag = tag; domresmon->instance = virResctrlMonitorNew(); - if (!domresmon->instance) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Could not create monitor")); - goto cleanup; - } if (tag == VIR_RESCTRL_MONITOR_TYPE_CACHE) { tmp = virXMLPropString(nodes[i], "level"); @@ -20001,7 +19998,7 @@ virDomainResctrlNew(xmlNodePtr node, goto cleanup; } - resctrl->alloc = virObjectRef(alloc); + resctrl->alloc = g_object_ref(alloc); ret = g_steal_pointer(&resctrl); cleanup: @@ -20048,8 +20045,7 @@ virDomainCachetuneDefParse(virDomainDefPtr def, return -1; } - if (!(alloc = virResctrlAllocNew())) - return -1; + alloc = virResctrlAllocNew(); for (i = 0; i < n; i++) { if (virDomainCachetuneDefParseCache(ctxt, nodes[i], alloc) < 0) @@ -20234,10 +20230,9 @@ virDomainMemorytuneDefParse(virDomainDefPtr def, return -1; if (resctrl) { - alloc = virObjectRef(resctrl->alloc); + alloc = g_object_ref(resctrl->alloc); } else { - if (!(alloc = virResctrlAllocNew())) - return -1; + alloc = virResctrlAllocNew(); } /* First, parse <memorytune/node> element if any <node> element exists */ diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c index c537d606cc..d112cc02e4 100644 --- a/src/util/virresctrl.c +++ b/src/util/virresctrl.c @@ -112,12 +112,6 @@ typedef struct _virResctrlAllocMemBW virResctrlAllocMemBW; typedef virResctrlAllocMemBW *virResctrlAllocMemBWPtr; -/* Class definitions and initializations */ -static virClassPtr virResctrlInfoClass; -static virClassPtr virResctrlAllocClass; -static virClassPtr virResctrlMonitorClass; - - /* virResctrlInfo */ struct _virResctrlInfoPerType { /* Kernel-provided information */ @@ -182,7 +176,7 @@ struct _virResctrlInfoMongrp { }; struct _virResctrlInfo { - virObject parent; + GObject parent; virResctrlInfoPerLevelPtr *levels; size_t nlevels; @@ -192,14 +186,17 @@ struct _virResctrlInfo { virResctrlInfoMongrpPtr monitor_info; }; +/* Class definitions and initializations */ +G_DEFINE_TYPE(virResctrlInfo, vir_resctrl_info, G_TYPE_OBJECT); + static void -virResctrlInfoDispose(void *obj) +virResctrlInfoFinalize(GObject *obj) { size_t i = 0; size_t j = 0; - virResctrlInfoPtr resctrl = obj; + virResctrlInfoPtr resctrl = VIR_RESCTRL_INFO(obj); for (i = 0; i < resctrl->nlevels; i++) { virResctrlInfoPerLevelPtr level = resctrl->levels[i]; @@ -221,6 +218,8 @@ virResctrlInfoDispose(void *obj) VIR_FREE(resctrl->membw_info); VIR_FREE(resctrl->levels); VIR_FREE(resctrl->monitor_info); + + G_OBJECT_CLASS(vir_resctrl_info_parent_class)->finalize(obj); } @@ -334,7 +333,7 @@ struct _virResctrlAllocMemBW { }; struct _virResctrlAlloc { - virObject parent; + GObject parent; virResctrlAllocPerLevelPtr *levels; size_t nlevels; @@ -355,7 +354,7 @@ struct _virResctrlAlloc { * memory bandwidth. */ struct _virResctrlMonitor { - virObject parent; + GObject parent; /* Each virResctrlMonitor is associated with one specific allocation, * either the root directory allocation under /sys/fs/resctrl or a @@ -372,15 +371,20 @@ struct _virResctrlMonitor { char *path; }; +/* Class definitions and initializations */ +G_DEFINE_TYPE(virResctrlAlloc, vir_resctrl_alloc, G_TYPE_OBJECT); +G_DEFINE_TYPE(virResctrlMonitor, vir_resctrl_monitor, G_TYPE_OBJECT); + + static void -virResctrlAllocDispose(void *obj) +virResctrlAllocFinalize(GObject *obj) { size_t i = 0; size_t j = 0; size_t k = 0; - virResctrlAllocPtr alloc = obj; + virResctrlAllocPtr alloc = VIR_RESCTRL_ALLOC(obj); for (i = 0; i < alloc->nlevels; i++) { virResctrlAllocPerLevelPtr level = alloc->levels[i]; @@ -419,38 +423,62 @@ virResctrlAllocDispose(void *obj) VIR_FREE(alloc->id); VIR_FREE(alloc->path); VIR_FREE(alloc->levels); + + G_OBJECT_CLASS(vir_resctrl_alloc_parent_class)->finalize(obj); } static void -virResctrlMonitorDispose(void *obj) +virResctrlMonitorFinalize(GObject *obj) { - virResctrlMonitorPtr monitor = obj; + virResctrlMonitorPtr monitor = VIR_RESCTRL_MONITOR(obj); - virObjectUnref(monitor->alloc); + if (monitor->alloc) + g_object_unref(monitor->alloc); VIR_FREE(monitor->id); VIR_FREE(monitor->path); + + G_OBJECT_CLASS(vir_resctrl_monitor_parent_class)->finalize(obj); } +static void +vir_resctrl_info_init(virResctrlInfo *resctrlinfo G_GNUC_UNUSED) +{ +} -/* Global initialization for classes */ -static int -virResctrlOnceInit(void) +static void +vir_resctrl_info_class_init(virResctrlInfoClass *klass) { - if (!VIR_CLASS_NEW(virResctrlInfo, virClassForObject())) - return -1; + GObjectClass *obj = G_OBJECT_CLASS(klass); - if (!VIR_CLASS_NEW(virResctrlAlloc, virClassForObject())) - return -1; + obj->finalize = virResctrlInfoFinalize; +} - if (!VIR_CLASS_NEW(virResctrlMonitor, virClassForObject())) - return -1; +static void +vir_resctrl_alloc_init(virResctrlAlloc *resctrlalloc G_GNUC_UNUSED) +{ +} - return 0; +static void +vir_resctrl_alloc_class_init(virResctrlAllocClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virResctrlAllocFinalize; +} + +static void +vir_resctrl_monitor_init(virResctrlMonitor *resctrlmon G_GNUC_UNUSED) +{ } -VIR_ONCE_GLOBAL_INIT(virResctrl); +static void +vir_resctrl_monitor_class_init(virResctrlMonitorClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + obj->finalize = virResctrlMonitorFinalize; +} /* Common functions */ static int @@ -793,21 +821,13 @@ virResctrlGetInfo(virResctrlInfoPtr resctrl) virResctrlInfoPtr virResctrlInfoNew(void) { - virResctrlInfoPtr ret = NULL; - - if (virResctrlInitialize() < 0) - return NULL; - - ret = virObjectNew(virResctrlInfoClass); - if (!ret) - return NULL; + g_autoptr(virResctrlInfo) ret = VIR_RESCTRL_INFO(g_object_new(VIR_TYPE_RESCTRL_INFO, NULL)); if (virResctrlGetInfo(ret) < 0) { - virObjectUnref(ret); return NULL; } - return ret; + return g_steal_pointer(&ret); } @@ -1034,10 +1054,7 @@ virResctrlInfoGetMonitorPrefix(virResctrlInfoPtr resctrl, virResctrlAllocPtr virResctrlAllocNew(void) { - if (virResctrlInitialize() < 0) - return NULL; - - return virObjectNew(virResctrlAllocClass); + return VIR_RESCTRL_ALLOC(g_object_new(VIR_TYPE_RESCTRL_ALLOC, NULL)); } @@ -1769,8 +1786,8 @@ virResctrlAllocGetGroup(virResctrlInfoPtr resctrl, error: VIR_FREE(schemata); - virObjectUnref(*alloc); - *alloc = NULL; + if (*alloc) + g_clear_object(alloc); return -1; } @@ -1836,9 +1853,6 @@ virResctrlAllocNewFromInfo(virResctrlInfoPtr info) virResctrlAllocPtr ret = virResctrlAllocNew(); virBitmapPtr mask = NULL; - if (!ret) - return NULL; - for (i = 0; i < info->nlevels; i++) { virResctrlInfoPerLevelPtr i_level = info->levels[i]; @@ -1884,8 +1898,8 @@ virResctrlAllocNewFromInfo(virResctrlInfoPtr info) virBitmapFree(mask); return ret; error: - virObjectUnref(ret); - ret = NULL; + if (ret) + g_clear_object(&ret); goto cleanup; } @@ -1927,7 +1941,8 @@ virResctrlAllocGetUnused(virResctrlInfoPtr resctrl) goto error; virResctrlAllocSubtract(ret, alloc); - virObjectUnref(alloc); + if (alloc) + g_object_unref(alloc); if (virDirOpen(&dirp, SYSFS_RESCTRL_PATH) < 0) goto error; @@ -1948,20 +1963,21 @@ virResctrlAllocGetUnused(virResctrlInfoPtr resctrl) } virResctrlAllocSubtract(ret, alloc); - virObjectUnref(alloc); - alloc = NULL; + if (alloc) + g_clear_object(&alloc); } if (rv < 0) goto error; cleanup: - virObjectUnref(alloc); + if (alloc) + g_object_unref(alloc); VIR_DIR_CLOSE(dirp); return ret; error: - virObjectUnref(ret); - ret = NULL; + if (ret) + g_clear_object(&ret); goto cleanup; } @@ -2297,8 +2313,10 @@ virResctrlAllocAssign(virResctrlInfoPtr resctrl, ret = 0; cleanup: - virObjectUnref(alloc_free); - virObjectUnref(alloc_default); + if (alloc_free) + g_object_unref(alloc_free); + if (alloc_default) + g_object_unref(alloc_default); return ret; } @@ -2506,10 +2524,7 @@ virResctrlAllocRemove(virResctrlAllocPtr alloc) virResctrlMonitorPtr virResctrlMonitorNew(void) { - if (virResctrlInitialize() < 0) - return NULL; - - return virObjectNew(virResctrlMonitorClass); + return VIR_RESCTRL_MONITOR(g_object_new(VIR_TYPE_RESCTRL_MONITOR, NULL)); } @@ -2623,7 +2638,7 @@ void virResctrlMonitorSetAlloc(virResctrlMonitorPtr monitor, virResctrlAllocPtr alloc) { - monitor->alloc = virObjectRef(alloc); + monitor->alloc = g_object_ref(alloc); } diff --git a/src/util/virresctrl.h b/src/util/virresctrl.h index dcd9ca2bb2..6724d904d1 100644 --- a/src/util/virresctrl.h +++ b/src/util/virresctrl.h @@ -19,8 +19,8 @@ #pragma once #include "internal.h" +#include <glib-object.h> -#include "virobject.h" #include "virbitmap.h" #include "virenum.h" @@ -93,7 +93,9 @@ struct _virResctrlInfoMon { unsigned int cache_level; }; -typedef struct _virResctrlInfo virResctrlInfo; +#define VIR_TYPE_RESCTRL_INFO vir_resctrl_info_get_type() +G_DECLARE_FINAL_TYPE(virResctrlInfo, vir_resctrl_info, VIR, RESCTRL_INFO, GObject); + typedef virResctrlInfo *virResctrlInfoPtr; virResctrlInfoPtr @@ -111,10 +113,11 @@ virResctrlInfoGetMemoryBandwidth(virResctrlInfoPtr resctrl, unsigned int level, virResctrlInfoMemBWPerNodePtr control); /* Alloc-related things */ -typedef struct _virResctrlAlloc virResctrlAlloc; +#define VIR_TYPE_RESCTRL_ALLOC vir_resctrl_alloc_get_type() +G_DECLARE_FINAL_TYPE(virResctrlAlloc, vir_resctrl_alloc, VIR, RESCTRL_ALLOC, GObject); + typedef virResctrlAlloc *virResctrlAllocPtr; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virResctrlAlloc, virObjectUnref); typedef int virResctrlAllocForeachCacheCallback(unsigned int level, @@ -190,7 +193,9 @@ virResctrlInfoGetMonitorPrefix(virResctrlInfoPtr resctrl, /* Monitor-related things */ -typedef struct _virResctrlMonitor virResctrlMonitor; +#define VIR_TYPE_RESCTRL_MONITOR vir_resctrl_monitor_get_type() +G_DECLARE_FINAL_TYPE(virResctrlMonitor, vir_resctrl_monitor, VIR, RESCTRL_MONITOR, GObject); + typedef virResctrlMonitor *virResctrlMonitorPtr; typedef struct _virResctrlMonitorStats virResctrlMonitorStats; diff --git a/tests/virresctrltest.c b/tests/virresctrltest.c index bb6d0fe48e..91baef506d 100644 --- a/tests/virresctrltest.c +++ b/tests/virresctrltest.c @@ -21,7 +21,7 @@ test_virResctrlGetUnused(const void *opaque) char *system_dir = NULL; char *resctrl_dir = NULL; int ret = -1; - virResctrlAllocPtr alloc = NULL; + g_autoptr(virResctrlAlloc) alloc = NULL; char *schemata_str = NULL; char *schemata_file; virCapsPtr caps = NULL; @@ -66,7 +66,6 @@ test_virResctrlGetUnused(const void *opaque) ret = 0; cleanup: virObjectUnref(caps); - virObjectUnref(alloc); VIR_FREE(system_dir); VIR_FREE(resctrl_dir); VIR_FREE(schemata_str); -- 2.25.1

On Fri, Apr 03, 2020 at 17:15:29 +0200, Rafael Fonseca wrote:
Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/capabilities.c | 3 +- src/conf/domain_conf.c | 21 +++--- src/util/virresctrl.c | 137 ++++++++++++++++++++++------------------ src/util/virresctrl.h | 15 +++-- tests/virresctrltest.c | 3 +- 5 files changed, 97 insertions(+), 82 deletions(-)
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 99b69aebb5..2c91461a54 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -266,7 +266,8 @@ virCapsDispose(void *object) VIR_FREE(caps->host.netprefix); VIR_FREE(caps->host.pagesSize); virCPUDefFree(caps->host.cpu); - virObjectUnref(caps->host.resctrl); + if (caps->host.resctrl) + g_object_unref(caps->host.resctrl);
Please use g_clear_object without the condition instead of this pattern everywhere. It was recently discussed on the list that this is the better option.

On Fri, Apr 3, 2020 at 5:37 PM Peter Krempa <pkrempa@redhat.com> wrote:
On Fri, Apr 03, 2020 at 17:15:29 +0200, Rafael Fonseca wrote:
Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/capabilities.c | 3 +- src/conf/domain_conf.c | 21 +++--- src/util/virresctrl.c | 137 ++++++++++++++++++++++------------------ src/util/virresctrl.h | 15 +++-- tests/virresctrltest.c | 3 +- 5 files changed, 97 insertions(+), 82 deletions(-)
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 99b69aebb5..2c91461a54 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -266,7 +266,8 @@ virCapsDispose(void *object) VIR_FREE(caps->host.netprefix); VIR_FREE(caps->host.pagesSize); virCPUDefFree(caps->host.cpu); - virObjectUnref(caps->host.resctrl); + if (caps->host.resctrl) + g_object_unref(caps->host.resctrl);
Please use g_clear_object without the condition instead of this pattern everywhere. It was recently discussed on the list that this is the better option.
Oh, I missed the discussion. I was following this patch example: https://libvirt.org/git/?p=libvirt.git;a=commitdiff;h=16121a88a7ef933220bcf9... Anyway I'll replace them by g_clear_object. Tks. Att -- Rafael Fonseca

On Fri, Apr 3, 2020 at 5:51 PM Rafael Fonseca <r4f4rfs@gmail.com> wrote:
Anyway I'll replace them by g_clear_object. Tks.
Is it ok if I wait to collect more feedback before sending a v2 with 's/if (...) g_object_unref/g_clear_object/'? Att. -- Rafael Fonseca

On Fri, Apr 03, 2020 at 07:02:17PM +0200, Rafael Fonseca wrote:
On Fri, Apr 3, 2020 at 5:51 PM Rafael Fonseca <r4f4rfs@gmail.com> wrote:
Anyway I'll replace them by g_clear_object. Tks.
Is it ok if I wait to collect more feedback before sending a v2 with 's/if (...) g_object_unref/g_clear_object/'?
Yes, that's fine. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

A couple minor notes below On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/capabilities.c | 3 +- src/conf/domain_conf.c | 21 +++--- src/util/virresctrl.c | 137 ++++++++++++++++++++++-------------- ---- src/util/virresctrl.h | 15 +++-- tests/virresctrltest.c | 3 +- 5 files changed, 97 insertions(+), 82 deletions(-)
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 99b69aebb5..2c91461a54 100644
[SNIP]
@@ -419,38 +423,62 @@ virResctrlAllocDispose(void *obj) VIR_FREE(alloc->id); VIR_FREE(alloc->path); VIR_FREE(alloc->levels); + + G_OBJECT_CLASS(vir_resctrl_alloc_parent_class)->finalize(obj); }
static void -virResctrlMonitorDispose(void *obj) +virResctrlMonitorFinalize(GObject *obj) { - virResctrlMonitorPtr monitor = obj; + virResctrlMonitorPtr monitor = VIR_RESCTRL_MONITOR(obj);
- virObjectUnref(monitor->alloc); + if (monitor->alloc) + g_object_unref(monitor->alloc);
In general, releasing a reference to a member GObject should be done in the 'dispose' function rather than the 'finalize' function. In this specific case, it probably doesn't make any real difference, but I'd rather stick to recommended behavior. See https://developer.gnome.org/gobject/stable/gobject-memory.html#gobject-memor... for more details. [SNIP]
@@ -1884,8 +1898,8 @@ virResctrlAllocNewFromInfo(virResctrlInfoPtr info) virBitmapFree(mask); return ret; error: - virObjectUnref(ret); - ret = NULL; + if (ret) + g_clear_object(&ret);
g_clear_object() does nothing if ret is NULL, so there's no need to check for non-NULL before calling it.

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/bhyve/bhyve_capabilities.c | 16 ++++-------- src/bhyve/bhyve_driver.c | 30 ++++++++-------------- src/conf/capabilities.c | 39 ++++++++++++++-------------- src/conf/capabilities.h | 6 ++--- src/conf/storage_capabilities.c | 5 ++-- src/conf/virconftypes.h | 3 +-- src/esx/esx_driver.c | 25 +++++++----------- src/libxl/libxl_capabilities.c | 19 +++++--------- src/libxl/libxl_conf.c | 3 ++- src/lxc/lxc_conf.c | 16 +++++------- src/lxc/lxc_controller.c | 3 ++- src/lxc/lxc_driver.c | 45 ++++++++++++--------------------- src/lxc/lxc_process.c | 3 ++- src/openvz/openvz_conf.c | 7 +++-- src/qemu/qemu_capabilities.c | 14 +++------- src/qemu/qemu_conf.c | 8 +++--- src/qemu/qemu_driver.c | 3 ++- src/security/virt-aa-helper.c | 8 +++--- src/storage/storage_backend.c | 3 +-- src/test/test_driver.c | 28 +++++++++----------- src/vbox/vbox_common.c | 7 +++-- src/vmware/vmware_conf.c | 12 ++++----- src/vz/vz_driver.c | 27 ++++++++------------ tests/bhyveargv2xmltest.c | 2 +- tests/bhyvexml2argvtest.c | 2 +- tests/bhyvexml2xmltest.c | 2 +- tests/domainconftest.c | 3 ++- tests/genericxml2xmltest.c | 3 ++- tests/openvzutilstest.c | 2 +- tests/qemucaps2xmltest.c | 13 +++------- tests/qemuhotplugtest.c | 6 ++--- tests/testutils.c | 4 +-- tests/testutilslxc.c | 21 +++++++-------- tests/testutilsqemu.c | 11 ++++---- tests/testutilsxen.c | 3 +-- tests/vircaps2xmltest.c | 6 +---- tests/vircapstest.c | 14 +++------- tests/virresctrltest.c | 3 +-- tests/vmx2xmltest.c | 8 ++---- tests/xml2vmxtest.c | 9 +++---- 40 files changed, 177 insertions(+), 265 deletions(-) diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index fb8829d571..66442e50ba 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -43,31 +43,25 @@ VIR_LOG_INIT("bhyve.bhyve_capabilities"); virCapsPtr virBhyveCapsBuild(void) { - virCapsPtr caps; + g_autoptr(virCaps) caps = NULL; virCapsGuestPtr guest; - if ((caps = virCapabilitiesNew(virArchFromHost(), - false, false)) == NULL) - return NULL; + caps = virCapabilitiesNew(virArchFromHost(), false, false); if ((guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_X86_64, "bhyve", NULL, 0, NULL)) == NULL) - goto error; + return NULL; if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_BHYVE, NULL, NULL, 0, NULL) == NULL) - goto error; + return NULL; if (!(caps->host.cpu = virCPUProbeHost(caps->host.arch))) VIR_WARN("Failed to get host CPU"); - return caps; - - error: - virObjectUnref(caps); - return NULL; + return g_steal_pointer(&caps); } int diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index b6204c7fb9..4ca3666700 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -126,22 +126,21 @@ bhyveAutostartDomains(bhyveConnPtr driver) * Get a reference to the virCapsPtr instance for the * driver. * - * The caller must release the reference with virObjetUnref + * The caller must release the reference with g_object_unref * * Returns: a reference to a virCapsPtr instance or NULL */ virCapsPtr ATTRIBUTE_NONNULL(1) bhyveDriverGetCapabilities(bhyveConnPtr driver) { - return virObjectRef(driver->caps); + return g_object_ref(driver->caps); } static char * bhyveConnectGetCapabilities(virConnectPtr conn) { bhyveConnPtr privconn = conn->privateData; - virCapsPtr caps; - char *xml = NULL; + g_autoptr(virCaps) caps; if (virConnectGetCapabilitiesEnsureACL(conn) < 0) return NULL; @@ -149,15 +148,10 @@ bhyveConnectGetCapabilities(virConnectPtr conn) if (!(caps = bhyveDriverGetCapabilities(privconn))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to get Capabilities")); - goto cleanup; + return NULL; } - if (!(xml = virCapabilitiesFormatXML(caps))) - goto cleanup; - - cleanup: - virObjectUnref(caps); - return xml; + return virCapabilitiesFormatXML(caps); } static virDomainObjPtr @@ -508,7 +502,7 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag virDomainDefPtr oldDef = NULL; virDomainObjPtr vm = NULL; virObjectEventPtr event = NULL; - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE; virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL); @@ -555,7 +549,6 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id); cleanup: - virObjectUnref(caps); virDomainDefFree(def); virDomainDefFree(oldDef); virDomainObjEndAPI(&vm); @@ -1188,7 +1181,8 @@ bhyveStateCleanup(void) return -1; virObjectUnref(bhyve_driver->domains); - virObjectUnref(bhyve_driver->caps); + if (bhyve_driver->caps) + g_object_unref(bhyve_driver->caps); virObjectUnref(bhyve_driver->xmlopt); virSysinfoDefFree(bhyve_driver->hostsysinfo); virObjectUnref(bhyve_driver->closeCallbacks); @@ -1440,19 +1434,19 @@ bhyveConnectCompareCPU(virConnectPtr conn, { bhyveConnPtr driver = conn->privateData; int ret = VIR_CPU_COMPARE_ERROR; - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; bool failIncompatible; virCheckFlags(VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE, VIR_CPU_COMPARE_ERROR); if (virConnectCompareCPUEnsureACL(conn) < 0) - goto cleanup; + return ret; failIncompatible = !!(flags & VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE); if (!(caps = bhyveDriverGetCapabilities(driver))) - goto cleanup; + return ret; if (!caps->host.cpu || !caps->host.cpu->model) { @@ -1468,8 +1462,6 @@ bhyveConnectCompareCPU(virConnectPtr conn, xmlDesc, failIncompatible); } - cleanup: - virObjectUnref(caps); return ret; } diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 2c91461a54..299892fadd 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -54,18 +54,8 @@ VIR_ENUM_IMPL(virCapsHostPMTarget, "suspend_mem", "suspend_disk", "suspend_hybrid", ); -static virClassPtr virCapsClass; -static void virCapsDispose(void *obj); +G_DEFINE_TYPE(virCaps, vir_caps, G_TYPE_OBJECT); -static int virCapabilitiesOnceInit(void) -{ - if (!VIR_CLASS_NEW(virCaps, virClassForObject())) - return -1; - - return 0; -} - -VIR_ONCE_GLOBAL_INIT(virCapabilities); /** * virCapabilitiesNew: @@ -80,13 +70,7 @@ virCapabilitiesNew(virArch hostarch, bool offlineMigrate, bool liveMigrate) { - virCapsPtr caps; - - if (virCapabilitiesInitialize() < 0) - return NULL; - - if (!(caps = virObjectNew(virCapsClass))) - return NULL; + virCapsPtr caps = VIR_CAPS(g_object_new(VIR_TYPE_CAPS, NULL)); caps->host.arch = hostarch; caps->host.offlineMigrate = offlineMigrate; @@ -225,9 +209,9 @@ virCapabilitiesClearSecModel(virCapsHostSecModelPtr secmodel) } static void -virCapsDispose(void *object) +virCapsFinalize(GObject *object) { - virCapsPtr caps = object; + virCapsPtr caps = VIR_CAPS(object); size_t i; for (i = 0; i < caps->npools; i++) @@ -268,6 +252,21 @@ virCapsDispose(void *object) virCPUDefFree(caps->host.cpu); if (caps->host.resctrl) g_object_unref(caps->host.resctrl); + + G_OBJECT_CLASS(vir_caps_parent_class)->finalize(object); +} + +static void +vir_caps_init(virCaps *caps G_GNUC_UNUSED) +{ +} + +static void +vir_caps_class_init(virCapsClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virCapsFinalize; } /** diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index e2581fac8b..b563f79148 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -200,7 +200,7 @@ struct _virCapsStoragePool { struct _virCaps { - virObject parent; + GObject parent; virCapsHost host; size_t nguests; @@ -212,8 +212,8 @@ struct _virCaps { virCapsStoragePoolPtr *pools; }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCaps, virObjectUnref); - +#define VIR_TYPE_CAPS vir_caps_get_type() +G_DECLARE_FINAL_TYPE(virCaps, vir_caps, VIR, CAPS, GObject); struct _virCapsDomainData { int ostype; diff --git a/src/conf/storage_capabilities.c b/src/conf/storage_capabilities.c index 1a3417f90b..bb612e0ec9 100644 --- a/src/conf/storage_capabilities.c +++ b/src/conf/storage_capabilities.c @@ -40,7 +40,8 @@ virStoragePoolCapsDispose(void *obj) virStoragePoolCapsPtr caps = obj; VIR_DEBUG("obj=%p", caps); - virObjectUnref(caps->driverCaps); + if (caps->driverCaps) + g_object_unref(caps->driverCaps); } @@ -66,7 +67,7 @@ virStoragePoolCapsNew(virCapsPtr driverCaps) if (!(caps = virObjectLockableNew(virStoragePoolCapsClass))) return NULL; - caps->driverCaps = virObjectRef(driverCaps); + caps->driverCaps = g_object_ref(driverCaps); return caps; } diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index 1c62cde251..96df0f9f6f 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -27,8 +27,7 @@ typedef struct _virBlkioDevice virBlkioDevice; typedef virBlkioDevice *virBlkioDevicePtr; -typedef struct _virCaps virCaps; -typedef virCaps *virCapsPtr; +typedef struct _virCaps *virCapsPtr; typedef struct _virCapsDomainData virCapsDomainData; typedef virCapsDomainData *virCapsDomainDataPtr; diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 0ede65279a..f893d112d0 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -69,7 +69,8 @@ esxFreePrivate(esxPrivate **priv) esxVI_Context_Free(&(*priv)->host); esxVI_Context_Free(&(*priv)->vCenter); esxUtil_FreeParsedUri(&(*priv)->parsedUri); - virObjectUnref((*priv)->caps); + if ((*priv)->caps) + g_object_unref((*priv)->caps); virObjectUnref((*priv)->xmlopt); VIR_FREE(*priv); } @@ -540,7 +541,7 @@ static virCapsPtr esxCapsInit(esxPrivate *priv) { esxVI_Boolean supportsLongMode = esxSupportsLongMode(priv); - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; virCapsGuestPtr guest = NULL; if (supportsLongMode == esxVI_Boolean_Undefined) @@ -552,14 +553,11 @@ esxCapsInit(esxPrivate *priv) caps = virCapabilitiesNew(VIR_ARCH_I686, true, true); } - if (!caps) - return NULL; - virCapabilitiesAddHostMigrateTransport(caps, "vpxmigr"); if (esxLookupHostSystemBiosUuid(priv, caps->host.host_uuid) < 0) - goto failure; + return NULL; /* i686 */ guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, @@ -568,10 +566,10 @@ esxCapsInit(esxPrivate *priv) NULL); if (!guest) - goto failure; + return NULL; if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_VMWARE, NULL, NULL, 0, NULL)) - goto failure; + return NULL; /* x86_64 */ if (supportsLongMode == esxVI_Boolean_True) { @@ -581,18 +579,13 @@ esxCapsInit(esxPrivate *priv) 0, NULL); if (!guest) - goto failure; + return NULL; if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_VMWARE, NULL, NULL, 0, NULL)) - goto failure; + return NULL; } - return caps; - - failure: - virObjectUnref(caps); - - return NULL; + return g_steal_pointer(&caps); } diff --git a/src/libxl/libxl_capabilities.c b/src/libxl/libxl_capabilities.c index beac8c8cfc..4bbe761b3d 100644 --- a/src/libxl/libxl_capabilities.c +++ b/src/libxl/libxl_capabilities.c @@ -704,29 +704,24 @@ libxlMakeDomainDeviceHostdevCaps(virDomainCapsDeviceHostdevPtr dev) virCapsPtr libxlMakeCapabilities(libxl_ctx *ctx) { - virCapsPtr caps; + g_autoptr(virCaps) caps = NULL; #ifdef LIBXL_HAVE_NO_SUSPEND_RESUME - if ((caps = virCapabilitiesNew(virArchFromHost(), false, false)) == NULL) + caps = virCapabilitiesNew(virArchFromHost(), false, false); #else - if ((caps = virCapabilitiesNew(virArchFromHost(), true, true)) == NULL) + caps = virCapabilitiesNew(virArchFromHost(), true, true); #endif - return NULL; if (libxlCapsInitHost(ctx, caps) < 0) - goto error; + return NULL; if (libxlCapsInitNuma(ctx, caps) < 0) - goto error; + return NULL; if (libxlCapsInitGuests(ctx, caps) < 0) - goto error; - - return caps; + return NULL; - error: - virObjectUnref(caps); - return NULL; + return g_steal_pointer(&caps); } /* diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index be5fc505fe..21089c33d7 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -70,7 +70,8 @@ libxlDriverConfigDispose(void *obj) { libxlDriverConfigPtr cfg = obj; - virObjectUnref(cfg->caps); + if (cfg->caps) + g_object_unref(cfg->caps); libxl_ctx_free(cfg->ctx); if (cfg->logger) libxlLoggerFree(cfg->logger); diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c index 8469f30b9e..cfb80eaf22 100644 --- a/src/lxc/lxc_conf.c +++ b/src/lxc/lxc_conf.c @@ -59,14 +59,12 @@ VIR_ONCE_GLOBAL_INIT(virLXCConfig); /* Functions */ virCapsPtr virLXCDriverCapsInit(virLXCDriverPtr driver) { - virCapsPtr caps; + g_autoptr(virCaps) caps = NULL; virCapsGuestPtr guest; virArch altArch; char *lxc_path = NULL; - if ((caps = virCapabilitiesNew(virArchFromHost(), - false, false)) == NULL) - goto error; + caps = virCapabilitiesNew(virArchFromHost(), false, false); /* Some machines have problematic NUMA topology causing * unexpected failures. We don't want to break the lxc @@ -164,11 +162,10 @@ virCapsPtr virLXCDriverCapsInit(virLXCDriverPtr driver) VIR_INFO("No driver, not initializing security driver"); } - return caps; + return g_steal_pointer(&caps); error: VIR_FREE(lxc_path); - virObjectUnref(caps); return NULL; } @@ -180,7 +177,7 @@ virCapsPtr virLXCDriverCapsInit(virLXCDriverPtr driver) * driver. If @refresh is true, the capabilities will be * rebuilt first * - * The caller must release the reference with virObjetUnref + * The caller must release the reference with g_object_unref * * Returns: a reference to a virCapsPtr instance or NULL */ @@ -194,7 +191,8 @@ virCapsPtr virLXCDriverGetCapabilities(virLXCDriverPtr driver, return NULL; lxcDriverLock(driver); - virObjectUnref(driver->caps); + if (driver->caps) + g_object_unref(driver->caps); driver->caps = caps; } else { lxcDriverLock(driver); @@ -207,7 +205,7 @@ virCapsPtr virLXCDriverGetCapabilities(virLXCDriverPtr driver, } } - ret = virObjectRef(driver->caps); + ret = g_object_ref(driver->caps); lxcDriverUnlock(driver); return ret; } diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index 453b435dd6..3d3258eabe 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -181,7 +181,8 @@ virLXCControllerDriverFree(virLXCDriverPtr driver) if (!driver) return; virObjectUnref(driver->xmlopt); - virObjectUnref(driver->caps); + if (driver->caps) + g_object_unref(driver->caps); virMutexDestroy(&driver->lock); g_free(driver); } diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 851894c459..1c59ddef6d 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -197,8 +197,7 @@ static int lxcConnectIsAlive(virConnectPtr conn G_GNUC_UNUSED) static char *lxcConnectGetCapabilities(virConnectPtr conn) { virLXCDriverPtr driver = conn->privateData; - virCapsPtr caps; - char *xml; + g_autoptr(virCaps) caps = NULL; if (virConnectGetCapabilitiesEnsureACL(conn) < 0) return NULL; @@ -206,10 +205,7 @@ static char *lxcConnectGetCapabilities(virConnectPtr conn) { if (!(caps = virLXCDriverGetCapabilities(driver, true))) return NULL; - xml = virCapabilitiesFormatXML(caps); - - virObjectUnref(caps); - return xml; + return virCapabilitiesFormatXML(caps); } @@ -405,7 +401,7 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) virObjectEventPtr event = NULL; virDomainDefPtr oldDef = NULL; virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE; virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL); @@ -462,7 +458,6 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) virDomainDefFree(oldDef); virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(caps); virObjectUnref(cfg); return dom; } @@ -940,7 +935,7 @@ static char *lxcConnectDomainXMLFromNative(virConnectPtr conn, char *xml = NULL; virDomainDefPtr def = NULL; virLXCDriverPtr driver = conn->privateData; - virCapsPtr caps = virLXCDriverGetCapabilities(driver, false); + g_autoptr(virCaps) caps = virLXCDriverGetCapabilities(driver, false); virCheckFlags(0, NULL); @@ -959,7 +954,6 @@ static char *lxcConnectDomainXMLFromNative(virConnectPtr conn, xml = virDomainDefFormat(def, driver->xmlopt, 0); cleanup: - virObjectUnref(caps); virDomainDefFree(def); return xml; } @@ -1086,7 +1080,7 @@ lxcDomainCreateXMLWithFiles(virConnectPtr conn, virDomainPtr dom = NULL; virObjectEventPtr event = NULL; virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE; virCheckFlags(VIR_DOMAIN_START_AUTODESTROY | @@ -1156,7 +1150,6 @@ lxcDomainCreateXMLWithFiles(virConnectPtr conn, virDomainDefFree(def); virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(caps); virObjectUnref(cfg); virNWFilterUnlockFilterUpdates(); return dom; @@ -1235,29 +1228,27 @@ static int lxcNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr secmodel) { virLXCDriverPtr driver = conn->privateData; - virCapsPtr caps = NULL; - int ret = 0; + g_autoptr(virCaps) caps = NULL; memset(secmodel, 0, sizeof(*secmodel)); if (virNodeGetSecurityModelEnsureACL(conn) < 0) - goto cleanup; + return 0; if (!(caps = virLXCDriverGetCapabilities(driver, false))) - goto cleanup; + return 0; /* we treat no driver as success, but simply return no data in *secmodel */ if (caps->host.nsecModels == 0 || caps->host.secModels[0].model == NULL) - goto cleanup; + return 0; if (virStrcpy(secmodel->model, caps->host.secModels[0].model, VIR_SECURITY_MODEL_BUFLEN) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("security model string exceeds max %d bytes"), VIR_SECURITY_MODEL_BUFLEN - 1); - ret = -1; - goto cleanup; + return -1; } if (virStrcpy(secmodel->doi, caps->host.secModels[0].doi, @@ -1265,13 +1256,10 @@ static int lxcNodeGetSecurityModel(virConnectPtr conn, virReportError(VIR_ERR_INTERNAL_ERROR, _("security DOI string exceeds max %d bytes"), VIR_SECURITY_DOI_BUFLEN-1); - ret = -1; - goto cleanup; + return -1; } - cleanup: - virObjectUnref(caps); - return ret; + return 0; } @@ -1623,7 +1611,8 @@ static int lxcStateCleanup(void) virSysinfoDefFree(lxc_driver->hostsysinfo); virObjectUnref(lxc_driver->hostdevMgr); - virObjectUnref(lxc_driver->caps); + if (lxc_driver->caps) + g_object_unref(lxc_driver->caps); virObjectUnref(lxc_driver->securityManager); virObjectUnref(lxc_driver->xmlopt); @@ -1802,7 +1791,7 @@ lxcDomainSetSchedulerParametersFlags(virDomainPtr dom, unsigned int flags) { virLXCDriverPtr driver = dom->conn->privateData; - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; size_t i; virDomainObjPtr vm = NULL; virDomainDefPtr def = NULL; @@ -1924,7 +1913,6 @@ lxcDomainSetSchedulerParametersFlags(virDomainPtr dom, cleanup: virDomainDefFree(persistentDefCopy); virDomainObjEndAPI(&vm); - virObjectUnref(caps); virObjectUnref(cfg); return ret; } @@ -4477,7 +4465,7 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom, unsigned int flags) { virLXCDriverPtr driver = dom->conn->privateData; - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; virDomainObjPtr vm = NULL; virDomainDefPtr vmdef = NULL; virDomainDeviceDefPtr dev = NULL, dev_copy = NULL; @@ -4563,7 +4551,6 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom, virDomainDeviceDefFree(dev_copy); virDomainDeviceDefFree(dev); virDomainObjEndAPI(&vm); - virObjectUnref(caps); virObjectUnref(cfg); return ret; } diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 5199f3806e..699accc633 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -1565,7 +1565,8 @@ int virLXCProcessStart(virConnectPtr conn, VIR_FREE(pidfile); VIR_FREE(logfile); virObjectUnref(cfg); - virObjectUnref(caps); + if (caps) + g_object_unref(caps); virErrorRestore(&err); diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index 78547b8b28..1f70bfc3d9 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -151,9 +151,7 @@ virCapsPtr openvzCapsInit(void) g_autoptr(virCaps) caps = NULL; virCapsGuestPtr guest; - if ((caps = virCapabilitiesNew(virArchFromHost(), - false, false)) == NULL) - return NULL; + caps = virCapabilitiesNew(virArchFromHost(), false, false); if (!(caps->host.numa = virCapabilitiesHostNUMANewHost())) return NULL; @@ -483,7 +481,8 @@ openvzFreeDriver(struct openvz_driver *driver) virObjectUnref(driver->xmlopt); virObjectUnref(driver->domains); - virObjectUnref(driver->caps); + if (driver->caps) + g_object_unref(driver->caps); VIR_FREE(driver); } diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 73a8856f34..4bbd14f7ad 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1062,13 +1062,11 @@ virQEMUCapsProbeHostCPU(virArch hostArch, virCapsPtr virQEMUCapsInit(virFileCachePtr cache) { - virCapsPtr caps; + g_autoptr(virCaps) caps = NULL; size_t i; virArch hostarch = virArchFromHost(); - if ((caps = virCapabilitiesNew(hostarch, - true, true)) == NULL) - goto error; + caps = virCapabilitiesNew(hostarch, true, true); if (virCapabilitiesInitCaches(caps) < 0) VIR_WARN("Failed to get host CPU cache info"); @@ -1096,13 +1094,9 @@ virQEMUCapsInit(virFileCachePtr cache) if (virQEMUCapsInitGuest(caps, cache, hostarch, i) < 0) - goto error; - - return caps; + return NULL; - error: - virObjectUnref(caps); - return NULL; + return g_steal_pointer(&caps); } diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 15837cece4..68df8a419a 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -1350,7 +1350,7 @@ virCapsPtr virQEMUDriverCreateCapabilities(virQEMUDriverPtr driver) * driver. If @refresh is true, the capabilities will be * rebuilt first * - * The caller must release the reference with virObjetUnref + * The caller must release the reference with g_object_unref * * Returns: a reference to a virCapsPtr instance or NULL */ @@ -1364,7 +1364,8 @@ virCapsPtr virQEMUDriverGetCapabilities(virQEMUDriverPtr driver, return NULL; qemuDriverLock(driver); - virObjectUnref(driver->caps); + if (driver->caps) + g_object_unref(driver->caps); driver->caps = caps; } else { qemuDriverLock(driver); @@ -1378,7 +1379,8 @@ virCapsPtr virQEMUDriverGetCapabilities(virQEMUDriverPtr driver, } } - ret = virObjectRef(driver->caps); + if (driver->caps) + ret = g_object_ref(driver->caps); qemuDriverUnlock(driver); return ret; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index daa3cb397d..99a5058033 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1134,7 +1134,8 @@ qemuStateCleanup(void) virObjectUnref(qemu_driver->xmlopt); virCPUDefFree(qemu_driver->hostcpu); virCapabilitiesHostNUMAUnref(qemu_driver->hostnuma); - virObjectUnref(qemu_driver->caps); + if (qemu_driver->caps) + g_object_unref(qemu_driver->caps); ebtablesContextFree(qemu_driver->ebtables); VIR_FREE(qemu_driver->qemuImgBinary); virObjectUnref(qemu_driver->domains); diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index 8526b7b985..7b0ae6acad 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -79,7 +79,8 @@ vahDeinit(vahControl * ctl) return -1; VIR_FREE(ctl->def); - virObjectUnref(ctl->caps); + if (ctl->caps) + g_object_unref(ctl->caps); virObjectUnref(ctl->xmlopt); VIR_FREE(ctl->files); VIR_FREE(ctl->virtType); @@ -632,10 +633,7 @@ get_definition(vahControl * ctl, const char *xmlStr) if (caps_mockup(ctl, xmlStr) != 0) return -1; - if ((ctl->caps = virCapabilitiesNew(ctl->arch, true, true)) == NULL) { - vah_error(ctl, 0, _("could not allocate memory")); - return -1; - } + ctl->caps = virCapabilitiesNew(ctl->arch, true, true); if (!(ctl->xmlopt = virDomainXMLOptionNew(&virAAHelperDomainDefParserConfig, NULL, NULL, NULL, NULL))) { diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index e9f6663e6d..cb573c4945 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -190,8 +190,7 @@ virStorageBackendGetCapabilities(void) virCapsPtr caps; size_t i; - if (!(caps = virCapabilitiesNew(VIR_ARCH_NONE, false, false))) - return NULL; + caps = virCapabilitiesNew(VIR_ARCH_NONE, false, false); for (i = 0; i < virStorageBackendsCount; i++) virCapabilitiesAddStoragePool(caps, virStorageBackends[i]->type); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 7759847c2d..00c3d34a81 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -158,7 +158,8 @@ testDriverDispose(void *obj) testDriverPtr driver = obj; size_t i; - virObjectUnref(driver->caps); + if (driver->caps) + g_object_unref(driver->caps); virObjectUnref(driver->xmlopt); virObjectUnref(driver->domains); virNodeDeviceObjListFree(driver->devs); @@ -284,24 +285,23 @@ static virCapsPtr testBuildCapabilities(virConnectPtr conn) { testDriverPtr privconn = conn->privateData; - virCapsPtr caps; + g_autoptr(virCaps) caps = NULL; virCapsGuestPtr guest; int guest_types[] = { VIR_DOMAIN_OSTYPE_HVM, VIR_DOMAIN_OSTYPE_XEN }; size_t i, j; - if ((caps = virCapabilitiesNew(VIR_ARCH_I686, false, false)) == NULL) - goto error; + caps = virCapabilitiesNew(VIR_ARCH_I686, false, false); if (virCapabilitiesAddHostFeature(caps, "pae") < 0) - goto error; + return NULL; if (virCapabilitiesAddHostFeature(caps, "nonpae") < 0) - goto error; + return NULL; virCapabilitiesHostInitIOMMU(caps); if (VIR_ALLOC_N(caps->host.pagesSize, 4) < 0) - goto error; + return NULL; caps->host.pagesSize[caps->host.nPagesSize++] = 4; caps->host.pagesSize[caps->host.nPagesSize++] = 8; @@ -317,7 +317,7 @@ testBuildCapabilities(virConnectPtr conn) if (VIR_ALLOC_N(cpu_cells, privconn->cells[i].numCpus) < 0 || VIR_ALLOC_N(pages, nPages) < 0) { VIR_FREE(cpu_cells); - goto error; + return NULL; } memcpy(cpu_cells, privconn->cells[i].cpus, @@ -347,7 +347,7 @@ testBuildCapabilities(virConnectPtr conn) NULL, 0, NULL)) == NULL) - goto error; + return NULL; if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_TEST, @@ -355,7 +355,7 @@ testBuildCapabilities(virConnectPtr conn) NULL, 0, NULL) == NULL) - goto error; + return NULL; virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_PAE); virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_NONPAE); @@ -363,16 +363,12 @@ testBuildCapabilities(virConnectPtr conn) caps->host.nsecModels = 1; if (VIR_ALLOC_N(caps->host.secModels, caps->host.nsecModels) < 0) - goto error; + return NULL; caps->host.secModels[0].model = g_strdup("testSecurity"); caps->host.secModels[0].doi = g_strdup(""); - return caps; - - error: - virObjectUnref(caps); - return NULL; + return g_steal_pointer(&caps); } diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index e98ae04ec0..0e009a5739 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -89,9 +89,7 @@ vboxCapsInit(void) g_autoptr(virCaps) caps = NULL; virCapsGuestPtr guest = NULL; - if ((caps = virCapabilitiesNew(virArchFromHost(), - false, false)) == NULL) - return NULL; + caps = virCapabilitiesNew(virArchFromHost(), false, false); if (!(caps->host.numa = virCapabilitiesHostNUMANewHost())) return NULL; @@ -124,7 +122,8 @@ vboxDriverDispose(void *obj) { vboxDriverPtr driver = obj; - virObjectUnref(driver->caps); + if (driver->caps) + g_object_unref(driver->caps); virObjectUnref(driver->xmlopt); } diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index fd62bb96f7..ee21e96971 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -54,7 +54,8 @@ vmwareFreeDriver(struct vmware_driver *driver) virMutexDestroy(&driver->lock); virObjectUnref(driver->domains); - virObjectUnref(driver->caps); + if (driver->caps) + g_object_unref(driver->caps); virObjectUnref(driver->xmlopt); VIR_FREE(driver->vmrun); VIR_FREE(driver); @@ -64,12 +65,10 @@ vmwareFreeDriver(struct vmware_driver *driver) virCapsPtr vmwareCapsInit(void) { - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; virCapsGuestPtr guest = NULL; - if ((caps = virCapabilitiesNew(virArchFromHost(), - false, false)) == NULL) - goto error; + caps = virCapabilitiesNew(virArchFromHost(), false, false); if (!(caps->host.numa = virCapabilitiesHostNUMANewHost())) goto error; @@ -116,11 +115,10 @@ vmwareCapsInit(void) guest = NULL; } - return caps; + return g_steal_pointer(&caps); error: virCapabilitiesFreeGuest(guest); - virObjectUnref(caps); return NULL; } diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index d882b91def..517259131d 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -98,7 +98,7 @@ vzCapsAddGuestDomain(virCapsPtr caps, static virCapsPtr vzBuildCapabilities(void) { - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; virNodeInfo nodeinfo; virDomainOSType ostypes[] = { VIR_DOMAIN_OSTYPE_HVM, @@ -112,15 +112,13 @@ vzBuildCapabilities(void) }; size_t i, j, k; - if ((caps = virCapabilitiesNew(virArchFromHost(), - false, false)) == NULL) - return NULL; + caps = virCapabilitiesNew(virArchFromHost(), false, false); if (!(caps->host.numa = virCapabilitiesHostNUMANewHost())) - goto error; + return NULL; if (virCapabilitiesInitCaches(caps) < 0) - goto error; + return NULL; G_STATIC_ASSERT(G_N_ELEMENTS(archs) == G_N_ELEMENTS(emulators)); @@ -129,23 +127,19 @@ vzBuildCapabilities(void) for (k = 0; k < G_N_ELEMENTS(emulators); k++) if (vzCapsAddGuestDomain(caps, ostypes[i], archs[j], emulators[k], virt_types[k]) < 0) - goto error; + return NULL; if (virCapabilitiesGetNodeInfo(&nodeinfo)) - goto error; + return NULL; if (!(caps->host.cpu = virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_HOST, &nodeinfo, NULL))) - goto error; + return NULL; if (virCapabilitiesAddHostMigrateTransport(caps, "vzmigr") < 0) - goto error; - - return caps; + return NULL; - error: - virObjectUnref(caps); - return NULL; + return g_steal_pointer(&caps); } static void vzDriverDispose(void * obj) @@ -154,7 +148,8 @@ static void vzDriverDispose(void * obj) prlsdkDisconnect(driver); virObjectUnref(driver->domains); - virObjectUnref(driver->caps); + if (driver->caps) + g_object_unref(driver->caps); virObjectUnref(driver->xmlopt); virObjectUnref(driver->domainEventState); virSysinfoDefFree(driver->hostsysinfo); diff --git a/tests/bhyveargv2xmltest.c b/tests/bhyveargv2xmltest.c index 735cc4b338..5de5b48a8e 100644 --- a/tests/bhyveargv2xmltest.c +++ b/tests/bhyveargv2xmltest.c @@ -195,7 +195,7 @@ mymain(void) DO_TEST("bhyveload-bootorder"); DO_TEST_FAIL("extraargs"); - virObjectUnref(driver.caps); + g_object_unref(driver.caps); virObjectUnref(driver.xmlopt); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index 9e7eb218b8..9ea0d76f06 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -249,7 +249,7 @@ mymain(void) driver.bhyvecaps &= ~BHYVE_CAP_CPUTOPOLOGY; DO_TEST_FAILURE("cputopology"); - virObjectUnref(driver.caps); + g_object_unref(driver.caps); virObjectUnref(driver.xmlopt); virPortAllocatorRangeFree(driver.remotePorts); diff --git a/tests/bhyvexml2xmltest.c b/tests/bhyvexml2xmltest.c index a0c20a14c1..cb0f6022c3 100644 --- a/tests/bhyvexml2xmltest.c +++ b/tests/bhyvexml2xmltest.c @@ -127,7 +127,7 @@ mymain(void) /* USB xhci tablet */ DO_TEST_DIFFERENT("input-xhci-tablet"); - virObjectUnref(driver.caps); + g_object_unref(driver.caps); virObjectUnref(driver.xmlopt); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/domainconftest.c b/tests/domainconftest.c index 754ef2eb3d..ada397b925 100644 --- a/tests/domainconftest.c +++ b/tests/domainconftest.c @@ -103,7 +103,8 @@ mymain(void) DO_TEST_GET_FS("/dev/pts", false); DO_TEST_GET_FS("/doesnotexist", false); - virObjectUnref(caps); + if (caps) + g_object_unref(caps); virObjectUnref(xmlopt); cleanup: diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c index 501bcdb0a1..0659ca1b28 100644 --- a/tests/genericxml2xmltest.c +++ b/tests/genericxml2xmltest.c @@ -195,7 +195,8 @@ mymain(void) DO_TEST_BACKUP("backup-push"); DO_TEST_BACKUP("backup-push-seclabel"); - virObjectUnref(caps); + if (caps) + g_object_unref(caps); virObjectUnref(xmlopt); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/openvzutilstest.c b/tests/openvzutilstest.c index 2b1a9fb5ce..48de2d1c7d 100644 --- a/tests/openvzutilstest.c +++ b/tests/openvzutilstest.c @@ -132,7 +132,7 @@ testReadNetworkConf(const void *data G_GNUC_UNUSED) cleanup: virObjectUnref(driver.xmlopt); - virObjectUnref(driver.caps); + g_object_unref(driver.caps); VIR_FREE(actual); virDomainDefFree(def); diff --git a/tests/qemucaps2xmltest.c b/tests/qemucaps2xmltest.c index 7a5125fea6..349af0e431 100644 --- a/tests/qemucaps2xmltest.c +++ b/tests/qemucaps2xmltest.c @@ -99,7 +99,7 @@ static virCapsPtr testGetCaps(char *capsData, const testQemuData *data) { virQEMUCapsPtr qemuCaps = NULL; - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; virArch arch = virArchFromString(data->archName); g_autofree char *binary = NULL; @@ -110,10 +110,7 @@ testGetCaps(char *capsData, const testQemuData *data) goto error; } - if ((caps = virCapabilitiesNew(arch, false, false)) == NULL) { - fprintf(stderr, "failed to create the fake capabilities"); - goto error; - } + caps = virCapabilitiesNew(arch, false, false); if (virQEMUCapsInitGuestFromBinary(caps, binary, @@ -124,11 +121,10 @@ testGetCaps(char *capsData, const testQemuData *data) } virObjectUnref(qemuCaps); - return caps; + return g_steal_pointer(&caps); error: virObjectUnref(qemuCaps); - virObjectUnref(caps); return NULL; } @@ -140,7 +136,7 @@ testQemuCapsXML(const void *opaque) char *capsFile = NULL, *xmlFile = NULL; char *capsData = NULL; char *capsXml = NULL; - virCapsPtr capsProvided = NULL; + g_autoptr(virCaps) capsProvided = NULL; xmlFile = g_strdup_printf("%s/caps.%s.xml", data->outputDir, data->archName); @@ -167,7 +163,6 @@ testQemuCapsXML(const void *opaque) VIR_FREE(capsFile); VIR_FREE(capsXml); VIR_FREE(capsData); - virObjectUnref(capsProvided); return ret; } diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index d9244dca44..b7ba016306 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -245,7 +245,7 @@ testQemuHotplug(const void *data) unsigned int device_parse_flags = 0; virDomainObjPtr vm = NULL; virDomainDeviceDefPtr dev = NULL; - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; qemuMonitorTestPtr test_mon = NULL; qemuDomainObjPrivatePtr priv = NULL; @@ -356,7 +356,6 @@ testQemuHotplug(const void *data) test->vm = NULL; } virDomainDeviceDefFree(dev); - virObjectUnref(caps); qemuMonitorTestFree(test_mon); return ((ret < 0 && fail) || (!ret && !fail)) ? 0 : -1; } @@ -412,7 +411,7 @@ testQemuHotplugCpuPrepare(const char *test, virHashTablePtr qmpschema) { qemuDomainObjPrivatePtr priv = NULL; - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; char *prefix = NULL; struct testQemuHotplugCpuData *data = NULL; @@ -464,7 +463,6 @@ testQemuHotplugCpuPrepare(const char *test, return data; error: - virObjectUnref(caps); testQemuHotplugCpuDataFree(data); VIR_FREE(prefix); return NULL; diff --git a/tests/testutils.c b/tests/testutils.c index 5fd81b70a2..5383df083d 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -909,9 +909,7 @@ virCapsPtr virTestGenericCapsInit(void) g_autoptr(virCaps) caps = NULL; virCapsGuestPtr guest; - if ((caps = virCapabilitiesNew(VIR_ARCH_X86_64, - false, false)) == NULL) - return NULL; + caps = virCapabilitiesNew(VIR_ARCH_X86_64, false, false); if ((guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_I686, "/usr/bin/acme-virt", NULL, diff --git a/tests/testutilslxc.c b/tests/testutilslxc.c index b5e2f542e7..2f28975332 100644 --- a/tests/testutilslxc.c +++ b/tests/testutilslxc.c @@ -11,7 +11,7 @@ virCapsPtr testLXCCapsInit(void) { - virCapsPtr caps; + g_autoptr(virCaps) caps = NULL; virCapsGuestPtr guest; if ((caps = virCapabilitiesNew(VIR_ARCH_X86_64, @@ -22,20 +22,20 @@ testLXCCapsInit(void) VIR_ARCH_I686, "/usr/libexec/libvirt_lxc", NULL, 0, NULL)) == NULL) - goto error; + return NULL; if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_LXC, NULL, NULL, 0, NULL)) - goto error; + return NULL; if ((guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_EXE, VIR_ARCH_X86_64, "/usr/libexec/libvirt_lxc", NULL, 0, NULL)) == NULL) - goto error; + return NULL; if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_LXC, NULL, NULL, 0, NULL)) - goto error; + return NULL; if (virTestGetDebug()) { @@ -43,18 +43,14 @@ testLXCCapsInit(void) caps_str = virCapabilitiesFormatXML(caps); if (!caps_str) - goto error; + return NULL; VIR_TEST_DEBUG("LXC driver capabilities:\n%s", caps_str); VIR_FREE(caps_str); } - return caps; - - error: - virObjectUnref(caps); - return NULL; + return g_steal_pointer(&caps); } @@ -81,7 +77,8 @@ void testLXCDriverFree(virLXCDriverPtr driver) { virObjectUnref(driver->xmlopt); - virObjectUnref(driver->caps); + if (driver->caps) + g_object_unref(driver->caps); virMutexDestroy(&driver->lock); g_free(driver); } diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index f3b4e2b3b2..082467f58e 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -196,11 +196,10 @@ testQemuAddGuest(virCapsPtr caps, virCapsPtr testQemuCapsInit(void) { - virCapsPtr caps; + g_autoptr(virCaps) caps = NULL; size_t i; - if (!(caps = virCapabilitiesNew(VIR_ARCH_X86_64, false, false))) - return NULL; + caps = virCapabilitiesNew(VIR_ARCH_X86_64, false, false); /* Add dummy 'none' security_driver. This is equal to setting * security_driver = "none" in qemu.conf. */ @@ -231,11 +230,10 @@ virCapsPtr testQemuCapsInit(void) VIR_FREE(caps_str); } - return caps; + return g_steal_pointer(&caps); cleanup: caps->host.cpu = NULL; - virObjectUnref(caps); return NULL; } @@ -314,7 +312,8 @@ void qemuTestDriverFree(virQEMUDriver *driver) } virObjectUnref(driver->qemuCapsCache); virObjectUnref(driver->xmlopt); - virObjectUnref(driver->caps); + if (driver->caps) + g_object_unref(driver->caps); virObjectUnref(driver->config); virObjectUnref(driver->securityManager); } diff --git a/tests/testutilsxen.c b/tests/testutilsxen.c index d50c3003da..7da90cdd1e 100644 --- a/tests/testutilsxen.c +++ b/tests/testutilsxen.c @@ -11,7 +11,7 @@ static virCapsPtr testXLInitCaps(void) { - virCapsPtr caps; + g_autoptr(virCaps) caps = NULL; virCapsGuestPtr guest; virCapsGuestMachinePtr *machines; int nmachines; @@ -78,7 +78,6 @@ testXLInitCaps(void) cleanup: virCapabilitiesFreeMachines(machines, nmachines); - virObjectUnref(caps); return NULL; } diff --git a/tests/vircaps2xmltest.c b/tests/vircaps2xmltest.c index 17cd600a7a..02907b5a91 100644 --- a/tests/vircaps2xmltest.c +++ b/tests/vircaps2xmltest.c @@ -38,7 +38,7 @@ test_virCapabilities(const void *opaque) { struct virCapabilitiesData *data = (struct virCapabilitiesData *) opaque; const char *archStr = virArchToString(data->arch); - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; char *capsXML = NULL; char *path = NULL; char *system = NULL; @@ -55,9 +55,6 @@ test_virCapabilities(const void *opaque) virFileWrapperAddPrefix("/sys/fs/resctrl", resctrl); caps = virCapabilitiesNew(data->arch, data->offlineMigrate, data->liveMigrate); - if (!caps) - goto cleanup; - if (!(caps->host.numa = virCapabilitiesHostNUMANewHost())) goto cleanup; @@ -82,7 +79,6 @@ test_virCapabilities(const void *opaque) VIR_FREE(resctrl); VIR_FREE(path); VIR_FREE(capsXML); - virObjectUnref(caps); return ret; } diff --git a/tests/vircapstest.c b/tests/vircapstest.c index 08eb017a76..9b37faa1d6 100644 --- a/tests/vircapstest.c +++ b/tests/vircapstest.c @@ -151,11 +151,10 @@ static int test_virCapsDomainDataLookupQEMU(const void *data G_GNUC_UNUSED) { int ret = 0; - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; if (!(caps = testQemuCapsInit())) { - ret = -1; - goto out; + return -1; } /* Checking each parameter individually */ @@ -199,8 +198,6 @@ test_virCapsDomainDataLookupQEMU(const void *data G_GNUC_UNUSED) "/usr/bin/qemu-system-aarch64", "pc"); CAPS_EXPECT_ERR(-1, VIR_ARCH_NONE, VIR_DOMAIN_VIRT_VMWARE, NULL, "pc"); - out: - virObjectUnref(caps); return ret; } #endif /* WITH_QEMU */ @@ -210,11 +207,10 @@ static int test_virCapsDomainDataLookupLXC(const void *data G_GNUC_UNUSED) { int ret = 0; - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; if (!(caps = testLXCCapsInit())) { - ret = -1; - goto out; + return -1; } CAPSCOMP(-1, VIR_ARCH_NONE, VIR_DOMAIN_VIRT_NONE, NULL, NULL, @@ -224,8 +220,6 @@ test_virCapsDomainDataLookupLXC(const void *data G_GNUC_UNUSED) VIR_DOMAIN_OSTYPE_EXE, VIR_ARCH_X86_64, VIR_DOMAIN_VIRT_LXC, "/usr/libexec/libvirt_lxc", NULL); - out: - virObjectUnref(caps); return ret; } #endif /* WITH_LXC */ diff --git a/tests/virresctrltest.c b/tests/virresctrltest.c index 91baef506d..76cc2ef3c6 100644 --- a/tests/virresctrltest.c +++ b/tests/virresctrltest.c @@ -24,7 +24,7 @@ test_virResctrlGetUnused(const void *opaque) g_autoptr(virResctrlAlloc) alloc = NULL; char *schemata_str = NULL; char *schemata_file; - virCapsPtr caps = NULL; + g_autoptr(virCaps) caps = NULL; system_dir = g_strdup_printf("%s/vircaps2xmldata/linux-%s/system", abs_srcdir, data->filename); @@ -65,7 +65,6 @@ test_virResctrlGetUnused(const void *opaque) ret = 0; cleanup: - virObjectUnref(caps); VIR_FREE(system_dir); VIR_FREE(resctrl_dir); VIR_FREE(schemata_str); diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c index 1966aed6fe..b5c557fe33 100644 --- a/tests/vmx2xmltest.c +++ b/tests/vmx2xmltest.c @@ -25,9 +25,6 @@ testCapsInit(void) caps = virCapabilitiesNew(VIR_ARCH_I686, true, true); - if (caps == NULL) - return; - virCapabilitiesAddHostMigrateTransport(caps, "vpxmigr"); /* i686 guest */ @@ -61,8 +58,7 @@ testCapsInit(void) return; failure: - virObjectUnref(caps); - caps = NULL; + g_clear_object(&caps); } static int @@ -285,7 +281,7 @@ mymain(void) DO_TEST("datacenterpath", "datacenterpath"); - virObjectUnref(caps); + g_object_unref(caps); virObjectUnref(xmlopt); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c index 8f0a2a72a4..d6c7eb4f53 100644 --- a/tests/xml2vmxtest.c +++ b/tests/xml2vmxtest.c @@ -25,9 +25,6 @@ testCapsInit(void) caps = virCapabilitiesNew(VIR_ARCH_I686, true, true); - if (caps == NULL) - return; - virCapabilitiesAddHostMigrateTransport(caps, "esx"); @@ -62,9 +59,9 @@ testCapsInit(void) return; failure: - virObjectUnref(caps); + if (caps) + g_clear_object(&caps); virObjectUnref(xmlopt); - caps = NULL; } static int @@ -294,7 +291,7 @@ mymain(void) DO_TEST("datacenterpath", "datacenterpath", 4); - virObjectUnref(caps); + g_object_unref(caps); virObjectUnref(xmlopt); return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE; -- 2.25.1

virFileCache had to also be changed to properly unref the QEMUCaps objects; in turn, virfilecachetest was also converted to GObject so it plays nicely with virFileCache. Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/qemu/qemu_capabilities.c | 119 +++++++++++++++-------------------- src/qemu/qemu_capabilities.h | 9 ++- src/qemu/qemu_domain.c | 8 +-- src/qemu/qemu_process.c | 3 +- src/util/virfilecache.c | 13 ++-- tests/cputest.c | 14 ++--- tests/domaincapstest.c | 3 +- tests/qemublocktest.c | 3 +- tests/qemucapabilitiestest.c | 9 +-- tests/qemucaps2xmltest.c | 16 ++--- tests/qemucapsprobe.c | 4 +- tests/qemumemlocktest.c | 3 +- tests/testutilsqemu.c | 18 +++--- tests/virfilecachetest.c | 53 +++++++--------- 14 files changed, 118 insertions(+), 157 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 4bbd14f7ad..36a8467f2c 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -639,7 +639,7 @@ static void virQEMUDomainCapsCacheDispose(void *obj) * And don't forget to update virQEMUCapsNewCopy. */ struct _virQEMUCaps { - virObject parent; + GObject parent; bool kvmSupportsNesting; @@ -677,14 +677,23 @@ struct virQEMUCapsSearchData { }; -static virClassPtr virQEMUCapsClass; -static void virQEMUCapsDispose(void *obj); +G_DEFINE_TYPE(virQEMUCaps, vir_qemu_caps, G_TYPE_OBJECT); -static int virQEMUCapsOnceInit(void) +static void virQEMUCapsFinalize(GObject *obj); + +static void vir_qemu_caps_init(virQEMUCaps *caps G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(virQEMUCaps, virClassForObject())) - return -1; +} +static void vir_qemu_caps_class_init(virQEMUCapsClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virQEMUCapsFinalize; +} + +static int virQEMUCapsOnceInit(void) +{ if (!(VIR_CLASS_NEW(virQEMUDomainCapsCache, virClassForObjectLockable()))) return -1; @@ -864,7 +873,7 @@ virQEMUCapsInitGuest(virCapsPtr caps, virArch guestarch) { char *binary = NULL; - virQEMUCapsPtr qemuCaps = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; int ret = -1; binary = virQEMUCapsGetDefaultEmulator(hostarch, guestarch); @@ -882,7 +891,6 @@ virQEMUCapsInitGuest(virCapsPtr caps, guestarch); VIR_FREE(binary); - virObjectUnref(qemuCaps); return ret; } @@ -1633,7 +1641,7 @@ int virQEMUCapsGetDefaultVersion(virCapsPtr caps, virFileCachePtr capsCache, unsigned int *version) { - virQEMUCapsPtr qemucaps; + g_autoptr(virQEMUCaps) qemucaps = NULL; virArch hostarch; virCapsDomainDataPtr capsdata; @@ -1656,7 +1664,6 @@ int virQEMUCapsGetDefaultVersion(virCapsPtr caps, return -1; *version = virQEMUCapsGetVersion(qemucaps); - virObjectUnref(qemucaps); return 0; } @@ -1682,26 +1689,17 @@ virQEMUDomainCapsCacheNew(void) virQEMUCapsPtr virQEMUCapsNew(void) { - virQEMUCapsPtr qemuCaps; - - if (virQEMUCapsInitialize() < 0) - return NULL; - - if (!(qemuCaps = virObjectNew(virQEMUCapsClass))) - return NULL; + g_autoptr(virQEMUCaps) qemuCaps = + VIR_QEMU_CAPS(g_object_new(VIR_TYPE_QEMU_CAPS, NULL)); qemuCaps->invalidation = true; if (!(qemuCaps->flags = virBitmapNew(QEMU_CAPS_LAST))) - goto error; + return NULL; if (!(qemuCaps->domCapsCache = virQEMUDomainCapsCacheNew())) - goto error; - - return qemuCaps; + return NULL; - error: - virObjectUnref(qemuCaps); - return NULL; + return g_steal_pointer(&qemuCaps); } @@ -1709,6 +1707,8 @@ virQEMUCapsPtr virQEMUCapsNewBinary(const char *binary) { virQEMUCapsPtr qemuCaps = virQEMUCapsNew(); + if (!qemuCaps) + return NULL; if (qemuCaps) qemuCaps->binary = g_strdup(binary); @@ -1818,7 +1818,7 @@ virQEMUCapsAccelCopy(virQEMUCapsAccelPtr dst, virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) { - virQEMUCapsPtr ret = virQEMUCapsNewBinary(qemuCaps->binary); + g_autoptr(virQEMUCaps) ret = virQEMUCapsNewBinary(qemuCaps->binary); size_t i; if (!ret) @@ -1842,10 +1842,10 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) if (virQEMUCapsAccelCopy(&ret->kvm, &qemuCaps->kvm) < 0 || virQEMUCapsAccelCopy(&ret->tcg, &qemuCaps->tcg) < 0) - goto error; + return NULL; if (VIR_ALLOC_N(ret->gicCapabilities, qemuCaps->ngicCapabilities) < 0) - goto error; + return NULL; ret->ngicCapabilities = qemuCaps->ngicCapabilities; for (i = 0; i < qemuCaps->ngicCapabilities; i++) ret->gicCapabilities[i] = qemuCaps->gicCapabilities[i]; @@ -1853,13 +1853,9 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SEV_GUEST) && virQEMUCapsSEVInfoCopy(&ret->sevCapabilities, qemuCaps->sevCapabilities) < 0) - goto error; - - return ret; + return NULL; - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } @@ -1880,9 +1876,9 @@ virQEMUCapsAccelClear(virQEMUCapsAccelPtr caps) } -void virQEMUCapsDispose(void *obj) +void virQEMUCapsFinalize(GObject *obj) { - virQEMUCapsPtr qemuCaps = obj; + virQEMUCapsPtr qemuCaps = VIR_QEMU_CAPS(obj); virObjectUnref(qemuCaps->domCapsCache); virBitmapFree(qemuCaps->flags); @@ -1897,6 +1893,8 @@ void virQEMUCapsDispose(void *obj) virQEMUCapsAccelClear(&qemuCaps->kvm); virQEMUCapsAccelClear(&qemuCaps->tcg); + + G_OBJECT_CLASS(vir_qemu_caps_parent_class)->finalize(obj); } void @@ -5142,18 +5140,18 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch, unsigned int microcodeVersion, const char *kernelVersion) { - virQEMUCapsPtr qemuCaps; + g_autoptr(virQEMUCaps) qemuCaps = NULL; struct stat sb; if (!(qemuCaps = virQEMUCapsNewBinary(binary))) - goto error; + return NULL; /* We would also want to check faccessat if we cared about ACLs, * but we don't. */ if (stat(binary, &sb) < 0) { virReportSystemError(errno, _("Cannot check QEMU binary %s"), binary); - goto error; + return NULL; } qemuCaps->ctime = sb.st_ctime; @@ -5164,11 +5162,11 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch, if (!virFileIsExecutable(binary)) { virReportSystemError(errno, _("QEMU binary %s is not executable"), binary); - goto error; + return NULL; } if (virQEMUCapsInitQMP(qemuCaps, libDir, runUid, runGid) < 0) - goto error; + return NULL; qemuCaps->libvirtCtime = virGetSelfLastChanged(); qemuCaps->libvirtVersion = LIBVIR_VERSION_NUMBER; @@ -5184,11 +5182,7 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch, qemuCaps->kvmSupportsNesting = virQEMUCapsKVMSupportsNesting(); } - return qemuCaps; - - error: - virObjectUnref(qemuCaps); - return NULL; + return g_steal_pointer(&qemuCaps); } static void * @@ -5212,20 +5206,16 @@ virQEMUCapsLoadFile(const char *filename, const char *binary, void *privData) { - virQEMUCapsPtr qemuCaps = virQEMUCapsNewBinary(binary); + g_autoptr(virQEMUCaps) qemuCaps = virQEMUCapsNewBinary(binary); virQEMUCapsCachePrivPtr priv = privData; if (!qemuCaps) return NULL; if (virQEMUCapsLoadCache(priv->hostArch, qemuCaps, filename) < 0) - goto error; - - return qemuCaps; + return NULL; - error: - virObjectUnref(qemuCaps); - return NULL; + return g_steal_pointer(&qemuCaps); } @@ -5341,15 +5331,13 @@ virQEMUCapsCacheLookupCopy(virFileCachePtr cache, const char *binary, const char *machineType) { - virQEMUCapsPtr qemuCaps = virQEMUCapsCacheLookup(cache, binary); + g_autoptr(virQEMUCaps) qemuCaps = virQEMUCapsCacheLookup(cache, binary); virQEMUCapsPtr ret; if (!qemuCaps) return NULL; ret = virQEMUCapsNewCopy(qemuCaps); - virObjectUnref(qemuCaps); - if (!ret) return NULL; @@ -5453,8 +5441,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache, virArch hostarch = virArchFromHost(); virArch arch = hostarch; virDomainVirtType capsType; - virQEMUCapsPtr qemuCaps = NULL; - virQEMUCapsPtr ret = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; virArch arch_from_caps; g_autofree char *probedbinary = NULL; @@ -5462,14 +5449,14 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache, (virttype = virDomainVirtTypeFromString(virttypeStr)) < 0) { virReportError(VIR_ERR_INVALID_ARG, _("unknown virttype: %s"), virttypeStr); - goto cleanup; + return NULL; } if (archStr && (arch = virArchFromString(archStr)) == VIR_ARCH_NONE) { virReportError(VIR_ERR_INVALID_ARG, _("unknown architecture: %s"), archStr); - goto cleanup; + return NULL; } if (!binary) { @@ -5478,7 +5465,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache, } if (!(qemuCaps = virQEMUCapsCacheLookup(cache, binary))) - goto cleanup; + return NULL; arch_from_caps = virQEMUCapsGetArch(qemuCaps); @@ -5492,7 +5479,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache, "match given architecture '%s'"), virArchToString(arch_from_caps), virArchToString(arch)); - goto cleanup; + return NULL; } if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) @@ -5507,7 +5494,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache, virReportError(VIR_ERR_INVALID_ARG, _("KVM is not supported by '%s' on this host"), binary); - goto cleanup; + return NULL; } if (machine) { @@ -5518,7 +5505,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache, virReportError(VIR_ERR_INVALID_ARG, _("the machine '%s' is not supported by emulator '%s'"), machine, binary); - goto cleanup; + return NULL; } } else { machine = virQEMUCapsGetPreferredMachine(qemuCaps, virttype); @@ -5531,11 +5518,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache, if (retMachine) *retMachine = machine; - ret = g_steal_pointer(&qemuCaps); - - cleanup: - virObjectUnref(qemuCaps); - return ret; + return g_steal_pointer(&qemuCaps); } bool diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 51ec1a5165..0602c23b10 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -21,7 +21,9 @@ #pragma once -#include "virobject.h" +#include "internal.h" +#include <glib-object.h> + #include "capabilities.h" #include "vircommand.h" #include "qemu_monitor.h" @@ -553,10 +555,11 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; -typedef struct _virQEMUCaps virQEMUCaps; +#define VIR_TYPE_QEMU_CAPS vir_qemu_caps_get_type() +G_DECLARE_FINAL_TYPE(virQEMUCaps, vir_qemu_caps, VIR, QEMU_CAPS, GObject); + typedef virQEMUCaps *virQEMUCapsPtr; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virQEMUCaps, virObjectUnref); virQEMUCapsPtr virQEMUCapsNew(void); virQEMUCapsPtr virQEMUCapsNewBinary(const char *binary); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 0ae0547b86..32dd69892a 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2249,8 +2249,8 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv) VIR_FREE(priv->machineName); - virObjectUnref(priv->qemuCaps); - priv->qemuCaps = NULL; + if (priv->qemuCaps) + g_clear_object(&priv->qemuCaps); VIR_FREE(priv->pidfile); @@ -6024,7 +6024,7 @@ qemuDomainPostParseDataFree(void *parseOpaque) { virQEMUCapsPtr qemuCaps = parseOpaque; - virObjectUnref(qemuCaps); + g_object_unref(qemuCaps); } @@ -6867,7 +6867,7 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver, g_autoptr(virQEMUCaps) qCaps = NULL; if (qemuCaps) { - qCaps = virObjectRef(qemuCaps); + qCaps = g_object_ref(qemuCaps); } else { if (!(qCaps = virQEMUCapsCacheLookupCopy(driver->qemuCapsCache, def->virtType, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 6b9f6fb860..3f28c5245c 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5491,7 +5491,8 @@ qemuProcessPrepareQEMUCaps(virDomainObjPtr vm, qemuDomainObjPrivatePtr priv = vm->privateData; size_t i; - virObjectUnref(priv->qemuCaps); + if (priv->qemuCaps) + g_object_unref(priv->qemuCaps); if (!(priv->qemuCaps = virQEMUCapsCacheLookupCopy(qemuCapsCache, vm->def->virtType, vm->def->emulator, diff --git a/src/util/virfilecache.c b/src/util/virfilecache.c index aecabf173d..e9b4211861 100644 --- a/src/util/virfilecache.c +++ b/src/util/virfilecache.c @@ -34,6 +34,7 @@ #include "virlog.h" #include "virobject.h" #include "virstring.h" +#include <glib-object.h> #include <sys/stat.h> #include <sys/types.h> @@ -169,7 +170,8 @@ virFileCacheLoad(virFileCachePtr cache, *data = g_steal_pointer(&loadData); cleanup: - virObjectUnref(loadData); + if (loadData) + g_object_unref(loadData); return ret; } @@ -206,7 +208,7 @@ virFileCacheNewData(virFileCachePtr cache, return NULL; if (virFileCacheSave(cache, name, data) < 0) { - virObjectUnref(data); + g_object_unref(data); data = NULL; } } @@ -275,8 +277,7 @@ virFileCacheValidate(virFileCachePtr cache, if (*data) { VIR_DEBUG("Caching data '%p' for '%s'", *data, name); if (virHashAddEntry(cache->table, name, *data) < 0) { - virObjectUnref(*data); - *data = NULL; + g_clear_object(data); } } } @@ -306,7 +307,7 @@ virFileCacheLookup(virFileCachePtr cache, data = virHashLookup(cache->table, name); virFileCacheValidate(cache, name, &data); - virObjectRef(data); + g_object_ref(data); virObjectUnlock(cache); return data; @@ -337,7 +338,7 @@ virFileCacheLookupByFunc(virFileCachePtr cache, data = virHashSearch(cache->table, iter, iterData, (void **)&name); virFileCacheValidate(cache, name, &data); - virObjectRef(data); + g_object_ref(data); virObjectUnlock(cache); return data; diff --git a/tests/cputest.c b/tests/cputest.c index 1f59f0d3a9..4590bfacee 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -519,8 +519,8 @@ cpuTestMakeQEMUCaps(const struct data *data) return qemuCaps; error: - virObjectUnref(qemuCaps); - qemuCaps = NULL; + if (qemuCaps) + g_clear_object(&qemuCaps); goto cleanup; } @@ -529,7 +529,7 @@ static int cpuTestGetCPUModels(const struct data *data, virDomainCapsCPUModelsPtr *models) { - virQEMUCapsPtr qemuCaps; + g_autoptr(virQEMUCaps) qemuCaps = NULL; *models = NULL; @@ -542,8 +542,6 @@ cpuTestGetCPUModels(const struct data *data, *models = virQEMUCapsGetCPUModels(qemuCaps, VIR_DOMAIN_VIRT_KVM, NULL, NULL); - virObjectUnref(qemuCaps); - return 0; } @@ -876,7 +874,7 @@ static int cpuTestJSONCPUID(const void *arg) { const struct data *data = arg; - virQEMUCapsPtr qemuCaps = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; virCPUDefPtr cpu = NULL; char *result = NULL; int ret = -1; @@ -898,7 +896,6 @@ cpuTestJSONCPUID(const void *arg) ret = cpuTestCompareXML(data->arch, cpu, result); cleanup: - virObjectUnref(qemuCaps); virCPUDefFree(cpu); VIR_FREE(result); return ret; @@ -909,7 +906,7 @@ static int cpuTestJSONSignature(const void *arg) { const struct data *data = arg; - virQEMUCapsPtr qemuCaps = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; virCPUDataPtr hostData = NULL; qemuMonitorCPUModelInfoPtr modelInfo; int ret = -1; @@ -924,7 +921,6 @@ cpuTestJSONSignature(const void *arg) ret = cpuTestCompareSignature(data, hostData); cleanup: - virObjectUnref(qemuCaps); virCPUDataFree(hostData); return ret; } diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index fb803eaa47..d6f0021665 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -79,7 +79,7 @@ fillQemuCaps(virDomainCapsPtr domCaps, { int ret = -1; char *path = NULL; - virQEMUCapsPtr qemuCaps = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; virDomainCapsLoaderPtr loader = &domCaps->os.loader; virDomainVirtType virtType; @@ -131,7 +131,6 @@ fillQemuCaps(virDomainCapsPtr domCaps, ret = 0; cleanup: - virObjectUnref(qemuCaps); VIR_FREE(path); return ret; } diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c index f9fbfc98f2..ec97e399c8 100644 --- a/tests/qemublocktest.c +++ b/tests/qemublocktest.c @@ -1450,7 +1450,8 @@ mymain(void) cleanup: qemuTestDriverFree(&driver); VIR_FREE(capslatest_x86_64); - virObjectUnref(caps_x86_64); + if (caps_x86_64) + g_object_unref(caps_x86_64); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c index 5b32ac1451..b7a93748d9 100644 --- a/tests/qemucapabilitiestest.c +++ b/tests/qemucapabilitiestest.c @@ -74,7 +74,7 @@ testQemuCaps(const void *opaque) char *repliesFile = NULL; char *capsFile = NULL; qemuMonitorTestPtr mon = NULL; - virQEMUCapsPtr capsActual = NULL; + g_autoptr(virQEMUCaps) capsActual = NULL; char *binary = NULL; char *actual = NULL; unsigned int fakeMicrocodeVersion = 0; @@ -138,7 +138,6 @@ testQemuCaps(const void *opaque) VIR_FREE(actual); VIR_FREE(binary); qemuMonitorTestFree(mon); - virObjectUnref(capsActual); return ret; } @@ -149,8 +148,8 @@ testQemuCapsCopy(const void *opaque) int ret = -1; const testQemuData *data = opaque; char *capsFile = NULL; - virQEMUCapsPtr orig = NULL; - virQEMUCapsPtr copy = NULL; + g_autoptr(virQEMUCaps) orig = NULL; + g_autoptr(virQEMUCaps) copy = NULL; char *actual = NULL; capsFile = g_strdup_printf("%s/%s_%s.%s.xml", @@ -174,8 +173,6 @@ testQemuCapsCopy(const void *opaque) cleanup: VIR_FREE(capsFile); - virObjectUnref(orig); - virObjectUnref(copy); VIR_FREE(actual); return ret; } diff --git a/tests/qemucaps2xmltest.c b/tests/qemucaps2xmltest.c index 349af0e431..6039895fd8 100644 --- a/tests/qemucaps2xmltest.c +++ b/tests/qemucaps2xmltest.c @@ -51,7 +51,7 @@ testQemuDataInit(testQemuDataPtr data) static virQEMUCapsPtr testQemuGetCaps(char *caps) { - virQEMUCapsPtr qemuCaps = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; xmlDocPtr xml; xmlXPathContextPtr ctxt = NULL; ssize_t i, n; @@ -85,11 +85,10 @@ testQemuGetCaps(char *caps) VIR_FREE(nodes); xmlFreeDoc(xml); xmlXPathFreeContext(ctxt); - return qemuCaps; + return g_steal_pointer(&qemuCaps); error: VIR_FREE(nodes); - virObjectUnref(qemuCaps); xmlFreeDoc(xml); xmlXPathFreeContext(ctxt); return NULL; @@ -98,7 +97,7 @@ testQemuGetCaps(char *caps) static virCapsPtr testGetCaps(char *capsData, const testQemuData *data) { - virQEMUCapsPtr qemuCaps = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; g_autoptr(virCaps) caps = NULL; virArch arch = virArchFromString(data->archName); g_autofree char *binary = NULL; @@ -107,7 +106,7 @@ testGetCaps(char *capsData, const testQemuData *data) if ((qemuCaps = testQemuGetCaps(capsData)) == NULL) { fprintf(stderr, "failed to parse qemu capabilities flags"); - goto error; + return NULL; } caps = virCapabilitiesNew(arch, false, false); @@ -117,15 +116,10 @@ testGetCaps(char *capsData, const testQemuData *data) qemuCaps, arch) < 0) { fprintf(stderr, "failed to create the capabilities from qemu"); - goto error; + return NULL; } - virObjectUnref(qemuCaps); return g_steal_pointer(&caps); - - error: - virObjectUnref(qemuCaps); - return NULL; } static int diff --git a/tests/qemucapsprobe.c b/tests/qemucapsprobe.c index c7e8f3309d..f3705a1ed5 100644 --- a/tests/qemucapsprobe.c +++ b/tests/qemucapsprobe.c @@ -45,7 +45,7 @@ int main(int argc, char **argv) { virThread thread; - virQEMUCapsPtr caps; + g_autoptr(virQEMUCaps) caps = NULL; const char *mock = VIR_TEST_MOCK("qemucapsprobe"); if (!virFileIsExecutable(mock)) { @@ -78,7 +78,5 @@ main(int argc, char **argv) -1, -1, 0, NULL))) return EXIT_FAILURE; - virObjectUnref(caps); - return EXIT_SUCCESS; } diff --git a/tests/qemumemlocktest.c b/tests/qemumemlocktest.c index 3f18fed1c3..c1945f1f2b 100644 --- a/tests/qemumemlocktest.c +++ b/tests/qemumemlocktest.c @@ -58,7 +58,7 @@ mymain(void) { int ret = 0; char *fakerootdir; - virQEMUCapsPtr qemuCaps = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE); @@ -148,7 +148,6 @@ mymain(void) DO_TEST("pseries-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED); cleanup: - virObjectUnref(qemuCaps); if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 082467f58e..dd8143ff55 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -286,20 +286,16 @@ virQEMUCapsPtr qemuTestParseCapabilitiesArch(virArch arch, const char *capsFile) { - virQEMUCapsPtr qemuCaps = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; g_autofree char *binary = g_strdup_printf("/usr/bin/qemu-system-%s", virArchToString(arch)); if (!(qemuCaps = virQEMUCapsNewBinary(binary)) || virQEMUCapsLoadCache(arch, qemuCaps, capsFile) < 0) - goto error; + return NULL; virQEMUCapsSetInvalidation(qemuCaps, false); - return qemuCaps; - - error: - virObjectUnref(qemuCaps); - return NULL; + return g_steal_pointer(&qemuCaps); } @@ -359,7 +355,7 @@ int qemuTestCapsCacheInsert(virFileCachePtr cache, } if (virFileCacheInsertData(cache, qemu_emulators[i], tmpCaps) < 0) { - virObjectUnref(tmpCaps); + g_object_unref(tmpCaps); return -1; } } @@ -663,7 +659,7 @@ testQemuInfoSetArgs(struct testQemuInfo *info, { va_list argptr; testQemuInfoArgName argname; - virQEMUCapsPtr qemuCaps = NULL; + g_autoptr(virQEMUCaps) qemuCaps = NULL; int gic = GIC_NONE; char *capsarch = NULL; char *capsver = NULL; @@ -780,7 +776,6 @@ testQemuInfoSetArgs(struct testQemuInfo *info, ret = 0; cleanup: - virObjectUnref(qemuCaps); va_end(argptr); return ret; @@ -792,5 +787,6 @@ testQemuInfoClear(struct testQemuInfo *info) { VIR_FREE(info->infile); VIR_FREE(info->outfile); - virObjectUnref(info->qemuCaps); + if (info->qemuCaps) + g_object_unref(info->qemuCaps); } diff --git a/tests/virfilecachetest.c b/tests/virfilecachetest.c index 6d280b3bec..2c4f4a94e5 100644 --- a/tests/virfilecachetest.c +++ b/tests/virfilecachetest.c @@ -24,52 +24,50 @@ #include "virfile.h" #include "virfilecache.h" +#include <glib-object.h> #define VIR_FROM_THIS VIR_FROM_NONE struct _testFileCacheObj { - virObject parent; + GObject parent; char *data; }; -typedef struct _testFileCacheObj testFileCacheObj; +#define TYPE_TEST_FILE_CACHE_OBJ test_file_cache_obj_get_type() +G_DECLARE_FINAL_TYPE(testFileCacheObj, test_file_cache_obj, TEST, FILE_CACHE_OBJ, GObject); typedef testFileCacheObj *testFileCacheObjPtr; -static virClassPtr testFileCacheObjClass; +G_DEFINE_TYPE(testFileCacheObj, test_file_cache_obj, G_TYPE_OBJECT); static void -testFileCacheObjDispose(void *opaque) +testFileCacheObjFinalize(GObject *opaque) { - testFileCacheObjPtr obj = opaque; + testFileCacheObjPtr obj = TEST_FILE_CACHE_OBJ(opaque); VIR_FREE(obj->data); -} + G_OBJECT_CLASS(test_file_cache_obj_parent_class)->finalize(opaque); +} -static int -testFileCacheObjOnceInit(void) +static void +test_file_cache_obj_init(testFileCacheObj *obj G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(testFileCacheObj, virClassForObject())) - return -1; - - return 0; } +static void +test_file_cache_obj_class_init(testFileCacheObjClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); -VIR_ONCE_GLOBAL_INIT(testFileCacheObj); + obj->finalize = testFileCacheObjFinalize; +} static testFileCacheObjPtr testFileCacheObjNew(const char *data) { - testFileCacheObjPtr obj; - - if (testFileCacheObjInitialize() < 0) - return NULL; - - if (!(obj = virObjectNew(testFileCacheObjClass))) - return NULL; + testFileCacheObjPtr obj = TEST_FILE_CACHE_OBJ(g_object_new(TYPE_TEST_FILE_CACHE_OBJ, NULL)); obj->data = g_strdup(data); @@ -160,9 +158,8 @@ typedef testFileCacheData *testFileCacheDataPtr; static int testFileCache(const void *opaque) { - int ret = -1; const testFileCacheData *data = opaque; - testFileCacheObjPtr obj = NULL; + g_autoptr(testFileCacheObj) obj = NULL; testFileCachePrivPtr testPriv = virFileCacheGetPriv(data->cache); testPriv->dataSaved = false; @@ -171,27 +168,23 @@ testFileCache(const void *opaque) if (!(obj = virFileCacheLookup(data->cache, data->name))) { fprintf(stderr, "Getting cached data failed.\n"); - goto cleanup; + return -1; } if (!obj->data || STRNEQ(data->expectData, obj->data)) { fprintf(stderr, "Expect data '%s', loaded data '%s'.\n", data->expectData, NULLSTR(obj->data)); - goto cleanup; + return -1; } if (data->expectSave != testPriv->dataSaved) { fprintf(stderr, "Expect data to be saved '%s', data saved '%s'.\n", data->expectSave ? "yes" : "no", testPriv->dataSaved ? "yes" : "no"); - goto cleanup; + return -1; } - ret = 0; - - cleanup: - virObjectUnref(obj); - return ret; + return 0; } -- 2.25.1

On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote: > virFileCache had to also be changed to properly unref the QEMUCaps > objects; in turn, virfilecachetest was also converted to GObject so > it > plays nicely with virFileCache. There is still some documentation in virfilecache.h that says that the virFileCacheNewDataPtr function must return an instance of virObject. > > Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> > --- > src/qemu/qemu_capabilities.c | 119 +++++++++++++++---------------- > ---- > src/qemu/qemu_capabilities.h | 9 ++- > src/qemu/qemu_domain.c | 8 +-- > src/qemu/qemu_process.c | 3 +- > src/util/virfilecache.c | 13 ++-- > tests/cputest.c | 14 ++--- > tests/domaincapstest.c | 3 +- > tests/qemublocktest.c | 3 +- > tests/qemucapabilitiestest.c | 9 +-- > tests/qemucaps2xmltest.c | 16 ++--- > tests/qemucapsprobe.c | 4 +- > tests/qemumemlocktest.c | 3 +- > tests/testutilsqemu.c | 18 +++--- > tests/virfilecachetest.c | 53 +++++++--------- > 14 files changed, 118 insertions(+), 157 deletions(-) > > diff --git a/src/qemu/qemu_capabilities.c > b/src/qemu/qemu_capabilities.c > index 4bbd14f7ad..36a8467f2c 100644 > --- a/src/qemu/qemu_capabilities.c > +++ b/src/qemu/qemu_capabilities.c > @@ -639,7 +639,7 @@ static void virQEMUDomainCapsCacheDispose(void > *obj) > * And don't forget to update virQEMUCapsNewCopy. > */ > struct _virQEMUCaps { > - virObject parent; > + GObject parent; > > bool kvmSupportsNesting; > > @@ -677,14 +677,23 @@ struct virQEMUCapsSearchData { > }; > > > -static virClassPtr virQEMUCapsClass; > -static void virQEMUCapsDispose(void *obj); > +G_DEFINE_TYPE(virQEMUCaps, vir_qemu_caps, G_TYPE_OBJECT); > > -static int virQEMUCapsOnceInit(void) > +static void virQEMUCapsFinalize(GObject *obj); > + > +static void vir_qemu_caps_init(virQEMUCaps *caps G_GNUC_UNUSED) > { > - if (!VIR_CLASS_NEW(virQEMUCaps, virClassForObject())) > - return -1; > +} > > +static void vir_qemu_caps_class_init(virQEMUCapsClass *klass) > +{ > + GObjectClass *obj = G_OBJECT_CLASS(klass); > + > + obj->finalize = virQEMUCapsFinalize; > +} > + > +static int virQEMUCapsOnceInit(void) > +{ > if (!(VIR_CLASS_NEW(virQEMUDomainCapsCache, > virClassForObjectLockable()))) > return -1; > > @@ -864,7 +873,7 @@ virQEMUCapsInitGuest(virCapsPtr caps, > virArch guestarch) > { > char *binary = NULL; > - virQEMUCapsPtr qemuCaps = NULL; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > int ret = -1; > > binary = virQEMUCapsGetDefaultEmulator(hostarch, guestarch); > @@ -882,7 +891,6 @@ virQEMUCapsInitGuest(virCapsPtr caps, > guestarch); > > VIR_FREE(binary); > - virObjectUnref(qemuCaps); > > return ret; > } > @@ -1633,7 +1641,7 @@ int virQEMUCapsGetDefaultVersion(virCapsPtr > caps, > virFileCachePtr capsCache, > unsigned int *version) > { > - virQEMUCapsPtr qemucaps; > + g_autoptr(virQEMUCaps) qemucaps = NULL; > virArch hostarch; > virCapsDomainDataPtr capsdata; > > @@ -1656,7 +1664,6 @@ int virQEMUCapsGetDefaultVersion(virCapsPtr > caps, > return -1; > > *version = virQEMUCapsGetVersion(qemucaps); > - virObjectUnref(qemucaps); > return 0; > } > > @@ -1682,26 +1689,17 @@ virQEMUDomainCapsCacheNew(void) > virQEMUCapsPtr > virQEMUCapsNew(void) > { > - virQEMUCapsPtr qemuCaps; > - > - if (virQEMUCapsInitialize() < 0) > - return NULL; > - > - if (!(qemuCaps = virObjectNew(virQEMUCapsClass))) > - return NULL; > + g_autoptr(virQEMUCaps) qemuCaps = > + VIR_QEMU_CAPS(g_object_new(VIR_TYPE_QEMU_CAPS, NULL)); > > qemuCaps->invalidation = true; > if (!(qemuCaps->flags = virBitmapNew(QEMU_CAPS_LAST))) > - goto error; > + return NULL; > > if (!(qemuCaps->domCapsCache = virQEMUDomainCapsCacheNew())) > - goto error; > - > - return qemuCaps; > + return NULL; > > - error: > - virObjectUnref(qemuCaps); > - return NULL; > + return g_steal_pointer(&qemuCaps); > } > > > @@ -1709,6 +1707,8 @@ virQEMUCapsPtr > virQEMUCapsNewBinary(const char *binary) > { > virQEMUCapsPtr qemuCaps = virQEMUCapsNew(); > + if (!qemuCaps) > + return NULL; > > if (qemuCaps) > qemuCaps->binary = g_strdup(binary); > @@ -1818,7 +1818,7 @@ virQEMUCapsAccelCopy(virQEMUCapsAccelPtr dst, > > virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) > { > - virQEMUCapsPtr ret = virQEMUCapsNewBinary(qemuCaps->binary); > + g_autoptr(virQEMUCaps) ret = virQEMUCapsNewBinary(qemuCaps- > >binary); > size_t i; > > if (!ret) > @@ -1842,10 +1842,10 @@ virQEMUCapsPtr > virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) > > if (virQEMUCapsAccelCopy(&ret->kvm, &qemuCaps->kvm) < 0 || > virQEMUCapsAccelCopy(&ret->tcg, &qemuCaps->tcg) < 0) > - goto error; > + return NULL; > > if (VIR_ALLOC_N(ret->gicCapabilities, qemuCaps- > >ngicCapabilities) < 0) > - goto error; > + return NULL; > ret->ngicCapabilities = qemuCaps->ngicCapabilities; > for (i = 0; i < qemuCaps->ngicCapabilities; i++) > ret->gicCapabilities[i] = qemuCaps->gicCapabilities[i]; > @@ -1853,13 +1853,9 @@ virQEMUCapsPtr > virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) > if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SEV_GUEST) && > virQEMUCapsSEVInfoCopy(&ret->sevCapabilities, > qemuCaps->sevCapabilities) < 0) > - goto error; > - > - return ret; > + return NULL; > > - error: > - virObjectUnref(ret); > - return NULL; > + return g_steal_pointer(&ret); > } > > > @@ -1880,9 +1876,9 @@ virQEMUCapsAccelClear(virQEMUCapsAccelPtr caps) > } > > > -void virQEMUCapsDispose(void *obj) > +void virQEMUCapsFinalize(GObject *obj) > { > - virQEMUCapsPtr qemuCaps = obj; > + virQEMUCapsPtr qemuCaps = VIR_QEMU_CAPS(obj); > > virObjectUnref(qemuCaps->domCapsCache); > virBitmapFree(qemuCaps->flags); > @@ -1897,6 +1893,8 @@ void virQEMUCapsDispose(void *obj) > > virQEMUCapsAccelClear(&qemuCaps->kvm); > virQEMUCapsAccelClear(&qemuCaps->tcg); > + > + G_OBJECT_CLASS(vir_qemu_caps_parent_class)->finalize(obj); > } > > void > @@ -5142,18 +5140,18 @@ virQEMUCapsNewForBinaryInternal(virArch > hostArch, > unsigned int microcodeVersion, > const char *kernelVersion) > { > - virQEMUCapsPtr qemuCaps; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > struct stat sb; > > if (!(qemuCaps = virQEMUCapsNewBinary(binary))) > - goto error; > + return NULL; > > /* We would also want to check faccessat if we cared about ACLs, > * but we don't. */ > if (stat(binary, &sb) < 0) { > virReportSystemError(errno, _("Cannot check QEMU binary > %s"), > binary); > - goto error; > + return NULL; > } > qemuCaps->ctime = sb.st_ctime; > > @@ -5164,11 +5162,11 @@ virQEMUCapsNewForBinaryInternal(virArch > hostArch, > if (!virFileIsExecutable(binary)) { > virReportSystemError(errno, _("QEMU binary %s is not > executable"), > binary); > - goto error; > + return NULL; > } > > if (virQEMUCapsInitQMP(qemuCaps, libDir, runUid, runGid) < 0) > - goto error; > + return NULL; > > qemuCaps->libvirtCtime = virGetSelfLastChanged(); > qemuCaps->libvirtVersion = LIBVIR_VERSION_NUMBER; > @@ -5184,11 +5182,7 @@ virQEMUCapsNewForBinaryInternal(virArch > hostArch, > qemuCaps->kvmSupportsNesting = > virQEMUCapsKVMSupportsNesting(); > } > > - return qemuCaps; > - > - error: > - virObjectUnref(qemuCaps); > - return NULL; > + return g_steal_pointer(&qemuCaps); > } > > static void * > @@ -5212,20 +5206,16 @@ virQEMUCapsLoadFile(const char *filename, > const char *binary, > void *privData) > { > - virQEMUCapsPtr qemuCaps = virQEMUCapsNewBinary(binary); > + g_autoptr(virQEMUCaps) qemuCaps = virQEMUCapsNewBinary(binary); > virQEMUCapsCachePrivPtr priv = privData; > > if (!qemuCaps) > return NULL; > > if (virQEMUCapsLoadCache(priv->hostArch, qemuCaps, filename) < > 0) > - goto error; > - > - return qemuCaps; > + return NULL; > > - error: > - virObjectUnref(qemuCaps); > - return NULL; > + return g_steal_pointer(&qemuCaps); > } > > > @@ -5341,15 +5331,13 @@ virQEMUCapsCacheLookupCopy(virFileCachePtr > cache, > const char *binary, > const char *machineType) > { > - virQEMUCapsPtr qemuCaps = virQEMUCapsCacheLookup(cache, binary); > + g_autoptr(virQEMUCaps) qemuCaps = virQEMUCapsCacheLookup(cache, > binary); > virQEMUCapsPtr ret; > > if (!qemuCaps) > return NULL; > > ret = virQEMUCapsNewCopy(qemuCaps); > - virObjectUnref(qemuCaps); > - > if (!ret) > return NULL; > > @@ -5453,8 +5441,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr > cache, > virArch hostarch = virArchFromHost(); > virArch arch = hostarch; > virDomainVirtType capsType; > - virQEMUCapsPtr qemuCaps = NULL; > - virQEMUCapsPtr ret = NULL; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > virArch arch_from_caps; > g_autofree char *probedbinary = NULL; > > @@ -5462,14 +5449,14 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr > cache, > (virttype = virDomainVirtTypeFromString(virttypeStr)) < 0) { > virReportError(VIR_ERR_INVALID_ARG, > _("unknown virttype: %s"), virttypeStr); > - goto cleanup; > + return NULL; > } > > if (archStr && > (arch = virArchFromString(archStr)) == VIR_ARCH_NONE) { > virReportError(VIR_ERR_INVALID_ARG, > _("unknown architecture: %s"), archStr); > - goto cleanup; > + return NULL; > } > > if (!binary) { > @@ -5478,7 +5465,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr > cache, > } > > if (!(qemuCaps = virQEMUCapsCacheLookup(cache, binary))) > - goto cleanup; > + return NULL; > > arch_from_caps = virQEMUCapsGetArch(qemuCaps); > > @@ -5492,7 +5479,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr > cache, > "match given architecture '%s'"), > virArchToString(arch_from_caps), > virArchToString(arch)); > - goto cleanup; > + return NULL; > } > > if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) > @@ -5507,7 +5494,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr > cache, > virReportError(VIR_ERR_INVALID_ARG, > _("KVM is not supported by '%s' on this > host"), > binary); > - goto cleanup; > + return NULL; > } > > if (machine) { > @@ -5518,7 +5505,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr > cache, > virReportError(VIR_ERR_INVALID_ARG, > _("the machine '%s' is not supported by > emulator '%s'"), > machine, binary); > - goto cleanup; > + return NULL; > } > } else { > machine = virQEMUCapsGetPreferredMachine(qemuCaps, > virttype); > @@ -5531,11 +5518,7 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr > cache, > if (retMachine) > *retMachine = machine; > > - ret = g_steal_pointer(&qemuCaps); > - > - cleanup: > - virObjectUnref(qemuCaps); > - return ret; > + return g_steal_pointer(&qemuCaps); > } > > bool > diff --git a/src/qemu/qemu_capabilities.h > b/src/qemu/qemu_capabilities.h > index 51ec1a5165..0602c23b10 100644 > --- a/src/qemu/qemu_capabilities.h > +++ b/src/qemu/qemu_capabilities.h > @@ -21,7 +21,9 @@ > > #pragma once > > -#include "virobject.h" > +#include "internal.h" > +#include <glib-object.h> > + > #include "capabilities.h" > #include "vircommand.h" > #include "qemu_monitor.h" > @@ -553,10 +555,11 @@ typedef enum { /* virQEMUCapsFlags grouping > marker for syntax-check */ > QEMU_CAPS_LAST /* this must always be the last item */ > } virQEMUCapsFlags; > > -typedef struct _virQEMUCaps virQEMUCaps; > +#define VIR_TYPE_QEMU_CAPS vir_qemu_caps_get_type() > +G_DECLARE_FINAL_TYPE(virQEMUCaps, vir_qemu_caps, VIR, QEMU_CAPS, > GObject); > + > typedef virQEMUCaps *virQEMUCapsPtr; > > -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virQEMUCaps, virObjectUnref); > > virQEMUCapsPtr virQEMUCapsNew(void); > virQEMUCapsPtr virQEMUCapsNewBinary(const char *binary); > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c > index 0ae0547b86..32dd69892a 100644 > --- a/src/qemu/qemu_domain.c > +++ b/src/qemu/qemu_domain.c > @@ -2249,8 +2249,8 @@ > qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv) > > VIR_FREE(priv->machineName); > > - virObjectUnref(priv->qemuCaps); > - priv->qemuCaps = NULL; > + if (priv->qemuCaps) > + g_clear_object(&priv->qemuCaps); > > VIR_FREE(priv->pidfile); > > @@ -6024,7 +6024,7 @@ qemuDomainPostParseDataFree(void *parseOpaque) > { > virQEMUCapsPtr qemuCaps = parseOpaque; > > - virObjectUnref(qemuCaps); > + g_object_unref(qemuCaps); > } > > > @@ -6867,7 +6867,7 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr > driver, > g_autoptr(virQEMUCaps) qCaps = NULL; > > if (qemuCaps) { > - qCaps = virObjectRef(qemuCaps); > + qCaps = g_object_ref(qemuCaps); > } else { > if (!(qCaps = virQEMUCapsCacheLookupCopy(driver- > >qemuCapsCache, > def->virtType, > diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c > index 6b9f6fb860..3f28c5245c 100644 > --- a/src/qemu/qemu_process.c > +++ b/src/qemu/qemu_process.c > @@ -5491,7 +5491,8 @@ qemuProcessPrepareQEMUCaps(virDomainObjPtr vm, > qemuDomainObjPrivatePtr priv = vm->privateData; > size_t i; > > - virObjectUnref(priv->qemuCaps); > + if (priv->qemuCaps) > + g_object_unref(priv->qemuCaps); > if (!(priv->qemuCaps = virQEMUCapsCacheLookupCopy(qemuCapsCache, > vm->def- > >virtType, > vm->def- > >emulator, > diff --git a/src/util/virfilecache.c b/src/util/virfilecache.c > index aecabf173d..e9b4211861 100644 > --- a/src/util/virfilecache.c > +++ b/src/util/virfilecache.c > @@ -34,6 +34,7 @@ > #include "virlog.h" > #include "virobject.h" > #include "virstring.h" > +#include <glib-object.h> > > #include <sys/stat.h> > #include <sys/types.h> > @@ -169,7 +170,8 @@ virFileCacheLoad(virFileCachePtr cache, > *data = g_steal_pointer(&loadData); > > cleanup: > - virObjectUnref(loadData); > + if (loadData) > + g_object_unref(loadData); > return ret; > } > > @@ -206,7 +208,7 @@ virFileCacheNewData(virFileCachePtr cache, > return NULL; > > if (virFileCacheSave(cache, name, data) < 0) { > - virObjectUnref(data); > + g_object_unref(data); > data = NULL; > } > } > @@ -275,8 +277,7 @@ virFileCacheValidate(virFileCachePtr cache, > if (*data) { > VIR_DEBUG("Caching data '%p' for '%s'", *data, name); > if (virHashAddEntry(cache->table, name, *data) < 0) { > - virObjectUnref(*data); > - *data = NULL; > + g_clear_object(data); > } > } > } > @@ -306,7 +307,7 @@ virFileCacheLookup(virFileCachePtr cache, > data = virHashLookup(cache->table, name); > virFileCacheValidate(cache, name, &data); > > - virObjectRef(data); > + g_object_ref(data); > virObjectUnlock(cache); > > return data; > @@ -337,7 +338,7 @@ virFileCacheLookupByFunc(virFileCachePtr cache, > data = virHashSearch(cache->table, iter, iterData, (void > **)&name); > virFileCacheValidate(cache, name, &data); > > - virObjectRef(data); > + g_object_ref(data); > virObjectUnlock(cache); > > return data; > diff --git a/tests/cputest.c b/tests/cputest.c > index 1f59f0d3a9..4590bfacee 100644 > --- a/tests/cputest.c > +++ b/tests/cputest.c > @@ -519,8 +519,8 @@ cpuTestMakeQEMUCaps(const struct data *data) > return qemuCaps; > > error: > - virObjectUnref(qemuCaps); > - qemuCaps = NULL; > + if (qemuCaps) > + g_clear_object(&qemuCaps); > goto cleanup; > } > > @@ -529,7 +529,7 @@ static int > cpuTestGetCPUModels(const struct data *data, > virDomainCapsCPUModelsPtr *models) > { > - virQEMUCapsPtr qemuCaps; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > > *models = NULL; > > @@ -542,8 +542,6 @@ cpuTestGetCPUModels(const struct data *data, > > *models = virQEMUCapsGetCPUModels(qemuCaps, VIR_DOMAIN_VIRT_KVM, > NULL, NULL); > > - virObjectUnref(qemuCaps); > - > return 0; > } > > @@ -876,7 +874,7 @@ static int > cpuTestJSONCPUID(const void *arg) > { > const struct data *data = arg; > - virQEMUCapsPtr qemuCaps = NULL; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > virCPUDefPtr cpu = NULL; > char *result = NULL; > int ret = -1; > @@ -898,7 +896,6 @@ cpuTestJSONCPUID(const void *arg) > ret = cpuTestCompareXML(data->arch, cpu, result); > > cleanup: > - virObjectUnref(qemuCaps); > virCPUDefFree(cpu); > VIR_FREE(result); > return ret; > @@ -909,7 +906,7 @@ static int > cpuTestJSONSignature(const void *arg) > { > const struct data *data = arg; > - virQEMUCapsPtr qemuCaps = NULL; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > virCPUDataPtr hostData = NULL; > qemuMonitorCPUModelInfoPtr modelInfo; > int ret = -1; > @@ -924,7 +921,6 @@ cpuTestJSONSignature(const void *arg) > ret = cpuTestCompareSignature(data, hostData); > > cleanup: > - virObjectUnref(qemuCaps); > virCPUDataFree(hostData); > return ret; > } > diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c > index fb803eaa47..d6f0021665 100644 > --- a/tests/domaincapstest.c > +++ b/tests/domaincapstest.c > @@ -79,7 +79,7 @@ fillQemuCaps(virDomainCapsPtr domCaps, > { > int ret = -1; > char *path = NULL; > - virQEMUCapsPtr qemuCaps = NULL; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > virDomainCapsLoaderPtr loader = &domCaps->os.loader; > virDomainVirtType virtType; > > @@ -131,7 +131,6 @@ fillQemuCaps(virDomainCapsPtr domCaps, > > ret = 0; > cleanup: > - virObjectUnref(qemuCaps); > VIR_FREE(path); > return ret; > } > diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c > index f9fbfc98f2..ec97e399c8 100644 > --- a/tests/qemublocktest.c > +++ b/tests/qemublocktest.c > @@ -1450,7 +1450,8 @@ mymain(void) > cleanup: > qemuTestDriverFree(&driver); > VIR_FREE(capslatest_x86_64); > - virObjectUnref(caps_x86_64); > + if (caps_x86_64) > + g_object_unref(caps_x86_64); > > return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; > } > diff --git a/tests/qemucapabilitiestest.c > b/tests/qemucapabilitiestest.c > index 5b32ac1451..b7a93748d9 100644 > --- a/tests/qemucapabilitiestest.c > +++ b/tests/qemucapabilitiestest.c > @@ -74,7 +74,7 @@ testQemuCaps(const void *opaque) > char *repliesFile = NULL; > char *capsFile = NULL; > qemuMonitorTestPtr mon = NULL; > - virQEMUCapsPtr capsActual = NULL; > + g_autoptr(virQEMUCaps) capsActual = NULL; > char *binary = NULL; > char *actual = NULL; > unsigned int fakeMicrocodeVersion = 0; > @@ -138,7 +138,6 @@ testQemuCaps(const void *opaque) > VIR_FREE(actual); > VIR_FREE(binary); > qemuMonitorTestFree(mon); > - virObjectUnref(capsActual); > return ret; > } > > @@ -149,8 +148,8 @@ testQemuCapsCopy(const void *opaque) > int ret = -1; > const testQemuData *data = opaque; > char *capsFile = NULL; > - virQEMUCapsPtr orig = NULL; > - virQEMUCapsPtr copy = NULL; > + g_autoptr(virQEMUCaps) orig = NULL; > + g_autoptr(virQEMUCaps) copy = NULL; > char *actual = NULL; > > capsFile = g_strdup_printf("%s/%s_%s.%s.xml", > @@ -174,8 +173,6 @@ testQemuCapsCopy(const void *opaque) > > cleanup: > VIR_FREE(capsFile); > - virObjectUnref(orig); > - virObjectUnref(copy); > VIR_FREE(actual); > return ret; > } > diff --git a/tests/qemucaps2xmltest.c b/tests/qemucaps2xmltest.c > index 349af0e431..6039895fd8 100644 > --- a/tests/qemucaps2xmltest.c > +++ b/tests/qemucaps2xmltest.c > @@ -51,7 +51,7 @@ testQemuDataInit(testQemuDataPtr data) > static virQEMUCapsPtr > testQemuGetCaps(char *caps) > { > - virQEMUCapsPtr qemuCaps = NULL; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > xmlDocPtr xml; > xmlXPathContextPtr ctxt = NULL; > ssize_t i, n; > @@ -85,11 +85,10 @@ testQemuGetCaps(char *caps) > VIR_FREE(nodes); > xmlFreeDoc(xml); > xmlXPathFreeContext(ctxt); > - return qemuCaps; > + return g_steal_pointer(&qemuCaps); > > error: > VIR_FREE(nodes); > - virObjectUnref(qemuCaps); > xmlFreeDoc(xml); > xmlXPathFreeContext(ctxt); > return NULL; > @@ -98,7 +97,7 @@ testQemuGetCaps(char *caps) > static virCapsPtr > testGetCaps(char *capsData, const testQemuData *data) > { > - virQEMUCapsPtr qemuCaps = NULL; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > g_autoptr(virCaps) caps = NULL; > virArch arch = virArchFromString(data->archName); > g_autofree char *binary = NULL; > @@ -107,7 +106,7 @@ testGetCaps(char *capsData, const testQemuData > *data) > > if ((qemuCaps = testQemuGetCaps(capsData)) == NULL) { > fprintf(stderr, "failed to parse qemu capabilities flags"); > - goto error; > + return NULL; > } > > caps = virCapabilitiesNew(arch, false, false); > @@ -117,15 +116,10 @@ testGetCaps(char *capsData, const testQemuData > *data) > qemuCaps, > arch) < 0) { > fprintf(stderr, "failed to create the capabilities from > qemu"); > - goto error; > + return NULL; > } > > - virObjectUnref(qemuCaps); > return g_steal_pointer(&caps); > - > - error: > - virObjectUnref(qemuCaps); > - return NULL; > } > > static int > diff --git a/tests/qemucapsprobe.c b/tests/qemucapsprobe.c > index c7e8f3309d..f3705a1ed5 100644 > --- a/tests/qemucapsprobe.c > +++ b/tests/qemucapsprobe.c > @@ -45,7 +45,7 @@ int > main(int argc, char **argv) > { > virThread thread; > - virQEMUCapsPtr caps; > + g_autoptr(virQEMUCaps) caps = NULL; > const char *mock = VIR_TEST_MOCK("qemucapsprobe"); > > if (!virFileIsExecutable(mock)) { > @@ -78,7 +78,5 @@ main(int argc, char **argv) > -1, -1, 0, NULL))) > return EXIT_FAILURE; > > - virObjectUnref(caps); > - > return EXIT_SUCCESS; > } > diff --git a/tests/qemumemlocktest.c b/tests/qemumemlocktest.c > index 3f18fed1c3..c1945f1f2b 100644 > --- a/tests/qemumemlocktest.c > +++ b/tests/qemumemlocktest.c > @@ -58,7 +58,7 @@ mymain(void) > { > int ret = 0; > char *fakerootdir; > - virQEMUCapsPtr qemuCaps = NULL; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > > fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE); > > @@ -148,7 +148,6 @@ mymain(void) > DO_TEST("pseries-locked+hostdev", > VIR_DOMAIN_MEMORY_PARAM_UNLIMITED); > > cleanup: > - virObjectUnref(qemuCaps); > > if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) > virFileDeleteTree(fakerootdir); > diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c > index 082467f58e..dd8143ff55 100644 > --- a/tests/testutilsqemu.c > +++ b/tests/testutilsqemu.c > @@ -286,20 +286,16 @@ virQEMUCapsPtr > qemuTestParseCapabilitiesArch(virArch arch, > const char *capsFile) > { > - virQEMUCapsPtr qemuCaps = NULL; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > g_autofree char *binary = g_strdup_printf("/usr/bin/qemu-system- > %s", > virArchToString(arch)) > ; > > if (!(qemuCaps = virQEMUCapsNewBinary(binary)) || > virQEMUCapsLoadCache(arch, qemuCaps, capsFile) < 0) > - goto error; > + return NULL; > > virQEMUCapsSetInvalidation(qemuCaps, false); > - return qemuCaps; > - > - error: > - virObjectUnref(qemuCaps); > - return NULL; > + return g_steal_pointer(&qemuCaps); > } > > > @@ -359,7 +355,7 @@ int qemuTestCapsCacheInsert(virFileCachePtr > cache, > } > > if (virFileCacheInsertData(cache, qemu_emulators[i], > tmpCaps) < 0) { > - virObjectUnref(tmpCaps); > + g_object_unref(tmpCaps); > return -1; > } > } > @@ -663,7 +659,7 @@ testQemuInfoSetArgs(struct testQemuInfo *info, > { > va_list argptr; > testQemuInfoArgName argname; > - virQEMUCapsPtr qemuCaps = NULL; > + g_autoptr(virQEMUCaps) qemuCaps = NULL; > int gic = GIC_NONE; > char *capsarch = NULL; > char *capsver = NULL; > @@ -780,7 +776,6 @@ testQemuInfoSetArgs(struct testQemuInfo *info, > ret = 0; > > cleanup: > - virObjectUnref(qemuCaps); > va_end(argptr); > > return ret; > @@ -792,5 +787,6 @@ testQemuInfoClear(struct testQemuInfo *info) > { > VIR_FREE(info->infile); > VIR_FREE(info->outfile); > - virObjectUnref(info->qemuCaps); > + if (info->qemuCaps) > + g_object_unref(info->qemuCaps); > } > diff --git a/tests/virfilecachetest.c b/tests/virfilecachetest.c > index 6d280b3bec..2c4f4a94e5 100644 > --- a/tests/virfilecachetest.c > +++ b/tests/virfilecachetest.c > @@ -24,52 +24,50 @@ > #include "virfile.h" > #include "virfilecache.h" > > +#include <glib-object.h> > > #define VIR_FROM_THIS VIR_FROM_NONE > > > struct _testFileCacheObj { > - virObject parent; > + GObject parent; > char *data; > }; > -typedef struct _testFileCacheObj testFileCacheObj; > +#define TYPE_TEST_FILE_CACHE_OBJ test_file_cache_obj_get_type() > +G_DECLARE_FINAL_TYPE(testFileCacheObj, test_file_cache_obj, TEST, > FILE_CACHE_OBJ, GObject); > typedef testFileCacheObj *testFileCacheObjPtr; > > > -static virClassPtr testFileCacheObjClass; > +G_DEFINE_TYPE(testFileCacheObj, test_file_cache_obj, G_TYPE_OBJECT); > > > static void > -testFileCacheObjDispose(void *opaque) > +testFileCacheObjFinalize(GObject *opaque) > { > - testFileCacheObjPtr obj = opaque; > + testFileCacheObjPtr obj = TEST_FILE_CACHE_OBJ(opaque); > VIR_FREE(obj->data); > -} > > + G_OBJECT_CLASS(test_file_cache_obj_parent_class)- > >finalize(opaque); > +} > > -static int > -testFileCacheObjOnceInit(void) > +static void > +test_file_cache_obj_init(testFileCacheObj *obj G_GNUC_UNUSED) > { > - if (!VIR_CLASS_NEW(testFileCacheObj, virClassForObject())) > - return -1; > - > - return 0; > } > > +static void > +test_file_cache_obj_class_init(testFileCacheObjClass *klass) > +{ > + GObjectClass *obj = G_OBJECT_CLASS(klass); > > -VIR_ONCE_GLOBAL_INIT(testFileCacheObj); > + obj->finalize = testFileCacheObjFinalize; > +} > > > static testFileCacheObjPtr > testFileCacheObjNew(const char *data) > { > - testFileCacheObjPtr obj; > - > - if (testFileCacheObjInitialize() < 0) > - return NULL; > - > - if (!(obj = virObjectNew(testFileCacheObjClass))) > - return NULL; > + testFileCacheObjPtr obj = > TEST_FILE_CACHE_OBJ(g_object_new(TYPE_TEST_FILE_CACHE_OBJ, NULL)); > > obj->data = g_strdup(data); > > @@ -160,9 +158,8 @@ typedef testFileCacheData *testFileCacheDataPtr; > static int > testFileCache(const void *opaque) > { > - int ret = -1; > const testFileCacheData *data = opaque; > - testFileCacheObjPtr obj = NULL; > + g_autoptr(testFileCacheObj) obj = NULL; > testFileCachePrivPtr testPriv = virFileCacheGetPriv(data- > >cache); > > testPriv->dataSaved = false; > @@ -171,27 +168,23 @@ testFileCache(const void *opaque) > > if (!(obj = virFileCacheLookup(data->cache, data->name))) { > fprintf(stderr, "Getting cached data failed.\n"); > - goto cleanup; > + return -1; > } > > if (!obj->data || STRNEQ(data->expectData, obj->data)) { > fprintf(stderr, "Expect data '%s', loaded data '%s'.\n", > data->expectData, NULLSTR(obj->data)); > - goto cleanup; > + return -1; > } > > if (data->expectSave != testPriv->dataSaved) { > fprintf(stderr, "Expect data to be saved '%s', data saved > '%s'.\n", > data->expectSave ? "yes" : "no", > testPriv->dataSaved ? "yes" : "no"); > - goto cleanup; > + return -1; > } > > - ret = 0; > - > - cleanup: > - virObjectUnref(obj); > - return ret; > + return 0; > } > >

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/admin/admin_remote.c | 10 +++---- src/locking/lock_driver_lockd.c | 23 ++++++++------- src/logging/log_manager.c | 17 ++++++----- src/lxc/lxc_monitor.c | 3 +- src/remote/remote_driver.c | 52 +++++++++++++++++---------------- src/rpc/virnetclient.c | 4 +-- src/rpc/virnetclientprogram.c | 29 +++++++++--------- src/rpc/virnetclientprogram.h | 10 +++++-- src/rpc/virnetclientstream.c | 5 ++-- 9 files changed, 82 insertions(+), 71 deletions(-) diff --git a/src/admin/admin_remote.c b/src/admin/admin_remote.c index ca5e0c9fe4..da90939e49 100644 --- a/src/admin/admin_remote.c +++ b/src/admin/admin_remote.c @@ -41,7 +41,8 @@ remoteAdminPrivDispose(void *opaque) { remoteAdminPrivPtr priv = opaque; - virObjectUnref(priv->program); + if (priv->program) + g_object_unref(priv->program); virObjectUnref(priv->client); } @@ -227,10 +228,9 @@ remoteAdminPrivNew(const char *sock_path) if (!(priv->client = virNetClientNewUNIX(sock_path, false, NULL))) goto error; - if (!(priv->program = virNetClientProgramNew(ADMIN_PROGRAM, - ADMIN_PROTOCOL_VERSION, - NULL, 0, NULL))) - goto error; + priv->program = virNetClientProgramNew(ADMIN_PROGRAM, + ADMIN_PROTOCOL_VERSION, + NULL, 0, NULL); if (virNetClientAddProgram(priv->client, priv->program) < 0) goto error; diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c index bec98dd05f..7520545dc0 100644 --- a/src/locking/lock_driver_lockd.c +++ b/src/locking/lock_driver_lockd.c @@ -213,12 +213,11 @@ static virNetClientPtr virLockManagerLockDaemonConnectionNew(bool privileged, daemonPath))) goto error; - if (!(*prog = virNetClientProgramNew(VIR_LOCK_SPACE_PROTOCOL_PROGRAM, - VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION, - NULL, - 0, - NULL))) - goto error; + *prog = virNetClientProgramNew(VIR_LOCK_SPACE_PROTOCOL_PROGRAM, + VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION, + NULL, + 0, + NULL); if (virNetClientAddProgram(client, *prog) < 0) goto error; @@ -233,7 +232,8 @@ static virNetClientPtr virLockManagerLockDaemonConnectionNew(bool privileged, VIR_FREE(lockdpath); virNetClientClose(client); virObjectUnref(client); - virObjectUnref(*prog); + if (*prog) + g_object_unref(*prog); return NULL; } @@ -296,7 +296,8 @@ static int virLockManagerLockDaemonSetupLockspace(const char *path) rv = 0; cleanup: - virObjectUnref(program); + if (program) + g_object_unref(program); virNetClientClose(client); virObjectUnref(client); return rv; @@ -660,7 +661,8 @@ static int virLockManagerLockDaemonAcquire(virLockManagerPtr lock, VIR_FORCE_CLOSE(*fd); virNetClientClose(client); virObjectUnref(client); - virObjectUnref(program); + if (program) + g_object_unref(program); return rv; } @@ -713,7 +715,8 @@ static int virLockManagerLockDaemonRelease(virLockManagerPtr lock, cleanup: virNetClientClose(client); virObjectUnref(client); - virObjectUnref(program); + if (program) + g_object_unref(program); return rv; } diff --git a/src/logging/log_manager.c b/src/logging/log_manager.c index fd7c2922b3..dee5307e56 100644 --- a/src/logging/log_manager.c +++ b/src/logging/log_manager.c @@ -83,12 +83,11 @@ virLogManagerConnect(bool privileged, daemonPath))) goto error; - if (!(*prog = virNetClientProgramNew(VIR_LOG_MANAGER_PROTOCOL_PROGRAM, - VIR_LOG_MANAGER_PROTOCOL_PROGRAM_VERSION, - NULL, - 0, - NULL))) - goto error; + *prog = virNetClientProgramNew(VIR_LOG_MANAGER_PROTOCOL_PROGRAM, + VIR_LOG_MANAGER_PROTOCOL_PROGRAM_VERSION, + NULL, + 0, + NULL); if (virNetClientAddProgram(client, *prog) < 0) goto error; @@ -103,7 +102,8 @@ virLogManagerConnect(bool privileged, VIR_FREE(logdpath); virNetClientClose(client); virObjectUnref(client); - virObjectUnref(*prog); + if (*prog) + g_object_unref(*prog); return NULL; } @@ -135,7 +135,8 @@ virLogManagerFree(virLogManagerPtr mgr) if (mgr->client) virNetClientClose(mgr->client); - virObjectUnref(mgr->program); + if (mgr->program) + g_object_unref(mgr->program); virObjectUnref(mgr->client); VIR_FREE(mgr); diff --git a/src/lxc/lxc_monitor.c b/src/lxc/lxc_monitor.c index 479125374b..923a0a5a2f 100644 --- a/src/lxc/lxc_monitor.c +++ b/src/lxc/lxc_monitor.c @@ -198,7 +198,8 @@ static void virLXCMonitorDispose(void *opaque) VIR_DEBUG("mon=%p", mon); if (mon->cb.destroy) (mon->cb.destroy)(mon, mon->vm); - virObjectUnref(mon->program); + if (mon->program) + g_object_unref(mon->program); virObjectUnref(mon->vm); } diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 7bae0c2514..5051c583d7 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1280,24 +1280,21 @@ doRemoteOpen(virConnectPtr conn, remoteClientCloseFunc, priv->closeCallback, virObjectFreeCallback); - if (!(priv->remoteProgram = virNetClientProgramNew(REMOTE_PROGRAM, - REMOTE_PROTOCOL_VERSION, - remoteEvents, - G_N_ELEMENTS(remoteEvents), - conn))) - goto failed; - if (!(priv->lxcProgram = virNetClientProgramNew(LXC_PROGRAM, - LXC_PROTOCOL_VERSION, - NULL, - 0, - NULL))) - goto failed; - if (!(priv->qemuProgram = virNetClientProgramNew(QEMU_PROGRAM, - QEMU_PROTOCOL_VERSION, - qemuEvents, - G_N_ELEMENTS(qemuEvents), - conn))) - goto failed; + priv->remoteProgram = virNetClientProgramNew(REMOTE_PROGRAM, + REMOTE_PROTOCOL_VERSION, + remoteEvents, + G_N_ELEMENTS(remoteEvents), + conn); + priv->lxcProgram = virNetClientProgramNew(LXC_PROGRAM, + LXC_PROTOCOL_VERSION, + NULL, + 0, + NULL); + priv->qemuProgram = virNetClientProgramNew(QEMU_PROGRAM, + QEMU_PROTOCOL_VERSION, + qemuEvents, + G_N_ELEMENTS(qemuEvents), + conn); if (virNetClientAddProgram(priv->client, priv->remoteProgram) < 0 || virNetClientAddProgram(priv->client, priv->lxcProgram) < 0 || @@ -1369,9 +1366,12 @@ doRemoteOpen(virConnectPtr conn, return VIR_DRV_OPEN_SUCCESS; failed: - virObjectUnref(priv->remoteProgram); - virObjectUnref(priv->lxcProgram); - virObjectUnref(priv->qemuProgram); + if (priv->remoteProgram) + g_object_unref(priv->remoteProgram); + if (priv->lxcProgram) + g_object_unref(priv->lxcProgram); + if (priv->qemuProgram) + g_object_unref(priv->qemuProgram); virNetClientClose(priv->client); virObjectUnref(priv->client); priv->client = NULL; @@ -1532,10 +1532,12 @@ doRemoteClose(virConnectPtr conn, struct private_data *priv) priv->client = NULL; virObjectUnref(priv->closeCallback); priv->closeCallback = NULL; - virObjectUnref(priv->remoteProgram); - virObjectUnref(priv->lxcProgram); - virObjectUnref(priv->qemuProgram); - priv->remoteProgram = priv->qemuProgram = priv->lxcProgram = NULL; + if (priv->remoteProgram) + g_clear_object(&priv->remoteProgram); + if (priv->lxcProgram) + g_clear_object(&priv->lxcProgram); + if (priv->qemuProgram) + g_clear_object(&priv->qemuProgram); /* Free hostname copy */ VIR_FREE(priv->hostname); diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index 1c5bef86a1..f940bed84e 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -685,7 +685,7 @@ void virNetClientDispose(void *obj) client->closeFf(client->closeOpaque); for (i = 0; i < client->nprograms; i++) - virObjectUnref(client->programs[i]); + g_object_unref(client->programs[i]); VIR_FREE(client->programs); g_main_loop_unref(client->eventLoop); @@ -1010,7 +1010,7 @@ int virNetClientAddProgram(virNetClientPtr client, if (VIR_EXPAND_N(client->programs, client->nprograms, 1) < 0) goto error; - client->programs[client->nprograms-1] = virObjectRef(prog); + client->programs[client->nprograms-1] = g_object_ref(prog); virObjectUnlock(client); return 0; diff --git a/src/rpc/virnetclientprogram.c b/src/rpc/virnetclientprogram.c index 4d1a2bc28b..38625e7ad1 100644 --- a/src/rpc/virnetclientprogram.c +++ b/src/rpc/virnetclientprogram.c @@ -38,7 +38,7 @@ VIR_LOG_INIT("rpc.netclientprogram"); struct _virNetClientProgram { - virObject parent; + GObject parent; unsigned program; unsigned version; @@ -47,19 +47,19 @@ struct _virNetClientProgram { void *eventOpaque; }; -static virClassPtr virNetClientProgramClass; -static void virNetClientProgramDispose(void *obj); +G_DEFINE_TYPE(virNetClientProgram, vir_net_client_program, G_TYPE_OBJECT); +static void virNetClientProgramFinalize(GObject *obj); -static int virNetClientProgramOnceInit(void) +static void vir_net_client_program_init(virNetClientProgram *prg G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(virNetClientProgram, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(virNetClientProgram); +static void vir_net_client_program_class_init(virNetClientProgramClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + obj->finalize = virNetClientProgramFinalize; +} virNetClientProgramPtr virNetClientProgramNew(unsigned program, unsigned version, @@ -67,13 +67,9 @@ virNetClientProgramPtr virNetClientProgramNew(unsigned program, size_t nevents, void *eventOpaque) { - virNetClientProgramPtr prog; - - if (virNetClientProgramInitialize() < 0) - return NULL; + virNetClientProgramPtr prog = + VIR_NET_CLIENT_PROGRAM(g_object_new(VIR_TYPE_NET_CLIENT_PROGRAM, NULL)); - if (!(prog = virObjectNew(virNetClientProgramClass))) - return NULL; prog->program = program; prog->version = version; @@ -85,8 +81,9 @@ virNetClientProgramPtr virNetClientProgramNew(unsigned program, } -void virNetClientProgramDispose(void *obj G_GNUC_UNUSED) +void virNetClientProgramFinalize(GObject *obj) { + G_OBJECT_CLASS(vir_net_client_program_parent_class)->finalize(obj); } diff --git a/src/rpc/virnetclientprogram.h b/src/rpc/virnetclientprogram.h index 1ac0f30023..1f7006d462 100644 --- a/src/rpc/virnetclientprogram.h +++ b/src/rpc/virnetclientprogram.h @@ -24,12 +24,18 @@ #include <rpc/xdr.h> #include "virnetmessage.h" -#include "virobject.h" +#include "internal.h" +#include <glib-object.h> typedef struct _virNetClient virNetClient; typedef virNetClient *virNetClientPtr; -typedef struct _virNetClientProgram virNetClientProgram; +#define VIR_TYPE_NET_CLIENT_PROGRAM vir_net_client_program_get_type() +G_DECLARE_FINAL_TYPE(virNetClientProgram, + vir_net_client_program, + VIR, + NET_CLIENT_PROGRAM, + GObject); typedef virNetClientProgram *virNetClientProgramPtr; typedef struct _virNetClientProgramEvent virNetClientProgramEvent; diff --git a/src/rpc/virnetclientstream.c b/src/rpc/virnetclientstream.c index f904eaba31..355739892e 100644 --- a/src/rpc/virnetclientstream.c +++ b/src/rpc/virnetclientstream.c @@ -145,7 +145,7 @@ virNetClientStreamPtr virNetClientStreamNew(virNetClientProgramPtr prog, if (!(st = virObjectLockableNew(virNetClientStreamClass))) return NULL; - st->prog = virObjectRef(prog); + st->prog = g_object_ref(prog); st->proc = proc; st->serial = serial; st->allowSkip = allowSkip; @@ -163,7 +163,8 @@ void virNetClientStreamDispose(void *obj) virNetMessageQueueServe(&st->rx); virNetMessageFree(msg); } - virObjectUnref(st->prog); + if (st->prog) + g_object_unref(st->prog); } bool virNetClientStreamMatches(virNetClientStreamPtr st, -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/locking/lock_daemon.c | 28 ++++++---------- src/logging/log_daemon.c | 28 ++++++---------- src/lxc/lxc_controller.c | 13 +++++--- src/remote/remote_daemon.c | 52 ++++++++++------------------- src/remote/remote_daemon_dispatch.c | 19 ++++++----- src/remote/remote_daemon_stream.c | 5 +-- src/rpc/virnetserver.c | 14 ++++---- src/rpc/virnetserverprogram.c | 30 ++++++++--------- src/rpc/virnetserverprogram.h | 10 ++++-- 9 files changed, 88 insertions(+), 111 deletions(-) diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c index 4eff63014a..260a74a81a 100644 --- a/src/locking/lock_daemon.c +++ b/src/locking/lock_daemon.c @@ -860,8 +860,8 @@ virLockDaemonUsage(const char *argv0, bool privileged) int main(int argc, char **argv) { virNetServerPtr lockSrv = NULL; virNetServerPtr adminSrv = NULL; - virNetServerProgramPtr lockProgram = NULL; - virNetServerProgramPtr adminProgram = NULL; + g_autoptr(virNetServerProgram) lockProgram = NULL; + g_autoptr(virNetServerProgram) adminProgram = NULL; char *remote_config_file = NULL; int statuswrite = -1; int ret = 1; @@ -1134,13 +1134,10 @@ int main(int argc, char **argv) { goto cleanup; } - if (!(lockProgram = virNetServerProgramNew(VIR_LOCK_SPACE_PROTOCOL_PROGRAM, - VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION, - virLockSpaceProtocolProcs, - virLockSpaceProtocolNProcs))) { - ret = VIR_DAEMON_ERR_INIT; - goto cleanup; - } + lockProgram = virNetServerProgramNew(VIR_LOCK_SPACE_PROTOCOL_PROGRAM, + VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION, + virLockSpaceProtocolProcs, + virLockSpaceProtocolNProcs); if (virNetServerAddProgram(lockSrv, lockProgram) < 0) { ret = VIR_DAEMON_ERR_INIT; @@ -1148,13 +1145,10 @@ int main(int argc, char **argv) { } if (adminSrv != NULL) { - if (!(adminProgram = virNetServerProgramNew(ADMIN_PROGRAM, - ADMIN_PROTOCOL_VERSION, - adminProcs, - adminNProcs))) { - ret = VIR_DAEMON_ERR_INIT; - goto cleanup; - } + adminProgram = virNetServerProgramNew(ADMIN_PROGRAM, + ADMIN_PROTOCOL_VERSION, + adminProcs, + adminNProcs); if (virNetServerAddProgram(adminSrv, adminProgram) < 0) { ret = VIR_DAEMON_ERR_INIT; goto cleanup; @@ -1191,8 +1185,6 @@ int main(int argc, char **argv) { ret = 0; cleanup: - virObjectUnref(lockProgram); - virObjectUnref(adminProgram); virObjectUnref(lockSrv); virObjectUnref(adminSrv); virLockDaemonFree(lockDaemon); diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c index f37054706e..98f8b9c68b 100644 --- a/src/logging/log_daemon.c +++ b/src/logging/log_daemon.c @@ -641,8 +641,8 @@ virLogDaemonUsage(const char *argv0, bool privileged) int main(int argc, char **argv) { virNetServerPtr logSrv = NULL; virNetServerPtr adminSrv = NULL; - virNetServerProgramPtr logProgram = NULL; - virNetServerProgramPtr adminProgram = NULL; + g_autoptr(virNetServerProgram) logProgram = NULL; + g_autoptr(virNetServerProgram) adminProgram = NULL; char *remote_config_file = NULL; int statuswrite = -1; int ret = 1; @@ -916,26 +916,20 @@ int main(int argc, char **argv) { goto cleanup; } - if (!(logProgram = virNetServerProgramNew(VIR_LOG_MANAGER_PROTOCOL_PROGRAM, - VIR_LOG_MANAGER_PROTOCOL_PROGRAM_VERSION, - virLogManagerProtocolProcs, - virLogManagerProtocolNProcs))) { - ret = VIR_DAEMON_ERR_INIT; - goto cleanup; - } + logProgram = virNetServerProgramNew(VIR_LOG_MANAGER_PROTOCOL_PROGRAM, + VIR_LOG_MANAGER_PROTOCOL_PROGRAM_VERSION, + virLogManagerProtocolProcs, + virLogManagerProtocolNProcs); if (virNetServerAddProgram(logSrv, logProgram) < 0) { ret = VIR_DAEMON_ERR_INIT; goto cleanup; } if (adminSrv != NULL) { - if (!(adminProgram = virNetServerProgramNew(ADMIN_PROGRAM, - ADMIN_PROTOCOL_VERSION, - adminProcs, - adminNProcs))) { - ret = VIR_DAEMON_ERR_INIT; - goto cleanup; - } + adminProgram = virNetServerProgramNew(ADMIN_PROGRAM, + ADMIN_PROTOCOL_VERSION, + adminProcs, + adminNProcs); if (virNetServerAddProgram(adminSrv, adminProgram) < 0) { ret = VIR_DAEMON_ERR_INIT; goto cleanup; @@ -971,8 +965,6 @@ int main(int argc, char **argv) { ret = 0; cleanup: - virObjectUnref(logProgram); - virObjectUnref(adminProgram); virObjectUnref(logSrv); virObjectUnref(adminSrv); virLogDaemonFree(logDaemon); diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index 3d3258eabe..2369704ac6 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -317,6 +317,8 @@ static void virLXCControllerFree(virLXCControllerPtr ctrl) VIR_FREE(ctrl->nsFDs); virCgroupFree(&ctrl->cgroup); + if (ctrl->prog) + g_object_unref(ctrl->prog); /* This must always be the last thing to be closed */ VIR_FORCE_CLOSE(ctrl->handshakeFd); VIR_FREE(ctrl); @@ -992,11 +994,10 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl) virObjectUnref(svc); svc = NULL; - if (!(ctrl->prog = virNetServerProgramNew(VIR_LXC_MONITOR_PROGRAM, - VIR_LXC_MONITOR_PROGRAM_VERSION, - virLXCMonitorProcs, - virLXCMonitorNProcs))) - goto error; + ctrl->prog = virNetServerProgramNew(VIR_LXC_MONITOR_PROGRAM, + VIR_LXC_MONITOR_PROGRAM_VERSION, + virLXCMonitorProcs, + virLXCMonitorNProcs); if (!(ctrl->daemon = virNetDaemonNew()) || virNetDaemonAddServer(ctrl->daemon, srv) < 0) @@ -1008,6 +1009,8 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl) error: VIR_FREE(sockpath); + if (ctrl->prog) + g_clear_object(&ctrl->prog); virObjectUnref(srv); virObjectUnref(ctrl->daemon); ctrl->daemon = NULL; diff --git a/src/remote/remote_daemon.c b/src/remote/remote_daemon.c index 7eec599177..46b6b4fdc7 100644 --- a/src/remote/remote_daemon.c +++ b/src/remote/remote_daemon.c @@ -760,8 +760,8 @@ int main(int argc, char **argv) { virNetDaemonPtr dmn = NULL; virNetServerPtr srv = NULL; virNetServerPtr srvAdm = NULL; - virNetServerProgramPtr adminProgram = NULL; - virNetServerProgramPtr lxcProgram = NULL; + g_autoptr(virNetServerProgram) adminProgram = NULL; + g_autoptr(virNetServerProgram) lxcProgram = NULL; char *remote_config_file = NULL; int statuswrite = -1; int ret = 1; @@ -1038,37 +1038,28 @@ int main(int argc, char **argv) { remoteProcs[REMOTE_PROC_AUTH_SASL_STEP].needAuth = false; remoteProcs[REMOTE_PROC_AUTH_SASL_START].needAuth = false; remoteProcs[REMOTE_PROC_AUTH_POLKIT].needAuth = false; - if (!(remoteProgram = virNetServerProgramNew(REMOTE_PROGRAM, - REMOTE_PROTOCOL_VERSION, - remoteProcs, - remoteNProcs))) { - ret = VIR_DAEMON_ERR_INIT; - goto cleanup; - } + remoteProgram = virNetServerProgramNew(REMOTE_PROGRAM, + REMOTE_PROTOCOL_VERSION, + remoteProcs, + remoteNProcs); if (virNetServerAddProgram(srv, remoteProgram) < 0) { ret = VIR_DAEMON_ERR_INIT; goto cleanup; } - if (!(lxcProgram = virNetServerProgramNew(LXC_PROGRAM, - LXC_PROTOCOL_VERSION, - lxcProcs, - lxcNProcs))) { - ret = VIR_DAEMON_ERR_INIT; - goto cleanup; - } + lxcProgram = virNetServerProgramNew(LXC_PROGRAM, + LXC_PROTOCOL_VERSION, + lxcProcs, + lxcNProcs); if (virNetServerAddProgram(srv, lxcProgram) < 0) { ret = VIR_DAEMON_ERR_INIT; goto cleanup; } - if (!(qemuProgram = virNetServerProgramNew(QEMU_PROGRAM, - QEMU_PROTOCOL_VERSION, - qemuProcs, - qemuNProcs))) { - ret = VIR_DAEMON_ERR_INIT; - goto cleanup; - } + qemuProgram = virNetServerProgramNew(QEMU_PROGRAM, + QEMU_PROTOCOL_VERSION, + qemuProcs, + qemuNProcs); if (virNetServerAddProgram(srv, qemuProgram) < 0) { ret = VIR_DAEMON_ERR_INIT; goto cleanup; @@ -1095,13 +1086,10 @@ int main(int argc, char **argv) { goto cleanup; } - if (!(adminProgram = virNetServerProgramNew(ADMIN_PROGRAM, - ADMIN_PROTOCOL_VERSION, - adminProcs, - adminNProcs))) { - ret = VIR_DAEMON_ERR_INIT; - goto cleanup; - } + adminProgram = virNetServerProgramNew(ADMIN_PROGRAM, + ADMIN_PROTOCOL_VERSION, + adminProcs, + adminNProcs); if (virNetServerAddProgram(srvAdm, adminProgram) < 0) { ret = VIR_DAEMON_ERR_INIT; goto cleanup; @@ -1213,11 +1201,7 @@ int main(int argc, char **argv) { virStateCleanup(); } - virObjectUnref(adminProgram); virObjectUnref(srvAdm); - virObjectUnref(qemuProgram); - virObjectUnref(lxcProgram); - virObjectUnref(remoteProgram); virObjectUnref(srv); virObjectUnref(dmn); diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c index c5506c2e11..c024211ea5 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -150,7 +150,8 @@ remoteEventCallbackFree(void *opaque) daemonClientEventCallbackPtr callback = opaque; if (!callback) return; - virObjectUnref(callback->program); + if (callback->program) + g_object_unref(callback->program); virObjectUnref(callback->client); VIR_FREE(callback); } @@ -4255,7 +4256,7 @@ remoteDispatchConnectDomainEventRegister(virNetServerPtr server G_GNUC_UNUSED, if (VIR_ALLOC(callback) < 0) goto cleanup; callback->client = virObjectRef(client); - callback->program = virObjectRef(remoteProgram); + callback->program = g_object_ref(remoteProgram); callback->eventID = VIR_DOMAIN_EVENT_ID_LIFECYCLE; callback->callbackID = -1; callback->legacy = true; @@ -4484,7 +4485,7 @@ remoteDispatchConnectDomainEventRegisterAny(virNetServerPtr server G_GNUC_UNUSED if (VIR_ALLOC(callback) < 0) goto cleanup; callback->client = virObjectRef(client); - callback->program = virObjectRef(remoteProgram); + callback->program = g_object_ref(remoteProgram); callback->eventID = args->eventID; callback->callbackID = -1; callback->legacy = true; @@ -4560,7 +4561,7 @@ remoteDispatchConnectDomainEventCallbackRegisterAny(virNetServerPtr server G_GNU if (VIR_ALLOC(callback) < 0) goto cleanup; callback->client = virObjectRef(client); - callback->program = virObjectRef(remoteProgram); + callback->program = g_object_ref(remoteProgram); callback->eventID = args->eventID; callback->callbackID = -1; ref = callback; @@ -6043,7 +6044,7 @@ remoteDispatchConnectNetworkEventRegisterAny(virNetServerPtr server G_GNUC_UNUSE if (VIR_ALLOC(callback) < 0) goto cleanup; callback->client = virObjectRef(client); - callback->program = virObjectRef(remoteProgram); + callback->program = g_object_ref(remoteProgram); callback->eventID = args->eventID; callback->callbackID = -1; ref = callback; @@ -6164,7 +6165,7 @@ remoteDispatchConnectStoragePoolEventRegisterAny(virNetServerPtr server G_GNUC_U if (VIR_ALLOC(callback) < 0) goto cleanup; callback->client = virObjectRef(client); - callback->program = virObjectRef(remoteProgram); + callback->program = g_object_ref(remoteProgram); callback->eventID = args->eventID; callback->callbackID = -1; ref = callback; @@ -6284,7 +6285,7 @@ remoteDispatchConnectNodeDeviceEventRegisterAny(virNetServerPtr server G_GNUC_UN if (VIR_ALLOC(callback) < 0) goto cleanup; callback->client = virObjectRef(client); - callback->program = virObjectRef(remoteProgram); + callback->program = g_object_ref(remoteProgram); callback->eventID = args->eventID; callback->callbackID = -1; ref = callback; @@ -6404,7 +6405,7 @@ remoteDispatchConnectSecretEventRegisterAny(virNetServerPtr server G_GNUC_UNUSED if (VIR_ALLOC(callback) < 0) goto cleanup; callback->client = virObjectRef(client); - callback->program = virObjectRef(remoteProgram); + callback->program = g_object_ref(remoteProgram); callback->eventID = args->eventID; callback->callbackID = -1; ref = callback; @@ -6519,7 +6520,7 @@ qemuDispatchConnectDomainMonitorEventRegister(virNetServerPtr server G_GNUC_UNUS if (VIR_ALLOC(callback) < 0) goto cleanup; callback->client = virObjectRef(client); - callback->program = virObjectRef(qemuProgram); + callback->program = g_object_ref(qemuProgram); callback->eventID = -1; callback->callbackID = -1; ref = callback; diff --git a/src/remote/remote_daemon_stream.c b/src/remote/remote_daemon_stream.c index 73e4d7befb..ec9667fe56 100644 --- a/src/remote/remote_daemon_stream.c +++ b/src/remote/remote_daemon_stream.c @@ -367,7 +367,7 @@ daemonCreateClientStream(virNetServerClientPtr client, stream->refs = 1; stream->priv = priv; - stream->prog = virObjectRef(prog); + stream->prog = g_object_ref(prog); stream->procedure = header->proc; stream->serial = header->serial; stream->filterID = -1; @@ -399,7 +399,8 @@ int daemonFreeClientStream(virNetServerClientPtr client, VIR_DEBUG("client=%p, proc=%d, serial=%u", client, stream->procedure, stream->serial); - virObjectUnref(stream->prog); + if (stream->prog) + g_object_unref(stream->prog); msg = stream->rx; while (msg) { diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 242052754f..5e9124c7ee 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -154,13 +154,15 @@ static void virNetServerHandleJob(void *jobOpaque, void *opaque) if (virNetServerProcessMsg(srv, job->client, job->prog, job->msg) < 0) goto error; - virObjectUnref(job->prog); + if (job->prog) + g_object_unref(job->prog); virObjectUnref(job->client); VIR_FREE(job); return; error: - virObjectUnref(job->prog); + if (job->prog) + g_object_unref(job->prog); virNetMessageFree(job->msg); virNetServerClientClose(job->client); virObjectUnref(job->client); @@ -218,14 +220,14 @@ virNetServerDispatchNewMessage(virNetServerClientPtr client, job->msg = msg; if (prog) { - job->prog = virObjectRef(prog); + job->prog = g_object_ref(prog); priority = virNetServerProgramGetPriority(prog, msg->header.proc); } if (virThreadPoolSendJob(srv->workers, priority, job) < 0) { virObjectUnref(client); VIR_FREE(job); - virObjectUnref(prog); + g_object_unref(prog); goto error; } } else { @@ -825,7 +827,7 @@ int virNetServerAddProgram(virNetServerPtr srv, if (VIR_EXPAND_N(srv->programs, srv->nprograms, 1) < 0) goto error; - srv->programs[srv->nprograms-1] = virObjectRef(prog); + srv->programs[srv->nprograms-1] = g_object_ref(prog); virObjectUnlock(srv); return 0; @@ -918,7 +920,7 @@ void virNetServerDispose(void *obj) VIR_FREE(srv->services); for (i = 0; i < srv->nprograms; i++) - virObjectUnref(srv->programs[i]); + g_object_unref(srv->programs[i]); VIR_FREE(srv->programs); for (i = 0; i < srv->nclients; i++) diff --git a/src/rpc/virnetserverprogram.c b/src/rpc/virnetserverprogram.c index 8df92fb8df..56c984ce13 100644 --- a/src/rpc/virnetserverprogram.c +++ b/src/rpc/virnetserverprogram.c @@ -35,7 +35,7 @@ VIR_LOG_INIT("rpc.netserverprogram"); struct _virNetServerProgram { - virObject parent; + GObject parent; unsigned program; unsigned version; @@ -44,32 +44,27 @@ struct _virNetServerProgram { }; -static virClassPtr virNetServerProgramClass; -static void virNetServerProgramDispose(void *obj); +G_DEFINE_TYPE(virNetServerProgram, vir_net_server_program, G_TYPE_OBJECT); +static void virNetServerProgramFinalize(GObject *obj); -static int virNetServerProgramOnceInit(void) +static void vir_net_server_program_init(virNetServerProgram *prog G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(virNetServerProgram, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(virNetServerProgram); +static void vir_net_server_program_class_init(virNetServerProgramClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + obj->finalize = virNetServerProgramFinalize; +} virNetServerProgramPtr virNetServerProgramNew(unsigned program, unsigned version, virNetServerProgramProcPtr procs, size_t nprocs) { - virNetServerProgramPtr prog; - - if (virNetServerProgramInitialize() < 0) - return NULL; - - if (!(prog = virObjectNew(virNetServerProgramClass))) - return NULL; + virNetServerProgramPtr prog = + VIR_NET_SERVER_PROGRAM(g_object_new(VIR_TYPE_NET_SERVER_PROGRAM, NULL)); prog->program = program; prog->version = version; @@ -569,6 +564,7 @@ int virNetServerProgramSendStreamHole(virNetServerProgramPtr prog, } -void virNetServerProgramDispose(void *obj G_GNUC_UNUSED) +void virNetServerProgramFinalize(GObject *obj) { + G_OBJECT_CLASS(vir_net_server_program_parent_class)->finalize(obj); } diff --git a/src/rpc/virnetserverprogram.h b/src/rpc/virnetserverprogram.h index 851bbf0183..bcc10809d4 100644 --- a/src/rpc/virnetserverprogram.h +++ b/src/rpc/virnetserverprogram.h @@ -23,7 +23,8 @@ #include "virnetmessage.h" #include "virnetserverclient.h" -#include "virobject.h" +#include "internal.h" +#include <glib-object.h> typedef struct _virNetDaemon virNetDaemon; typedef virNetDaemon *virNetDaemonPtr; @@ -31,7 +32,12 @@ typedef virNetDaemon *virNetDaemonPtr; typedef struct _virNetServerService virNetServerService; typedef virNetServerService *virNetServerServicePtr; -typedef struct _virNetServerProgram virNetServerProgram; +#define VIR_TYPE_NET_SERVER_PROGRAM vir_net_server_program_get_type() +G_DECLARE_FINAL_TYPE(virNetServerProgram, + vir_net_server_program, + VIR, + NET_SERVER_PROGRAM, + GObject); typedef virNetServerProgram *virNetServerProgramPtr; typedef struct _virNetServerProgramProc virNetServerProgramProc; -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/bhyve/bhyve_driver.c | 3 ++- src/conf/domain_conf.c | 29 +++++++++++++++++++---------- src/conf/domain_conf.h | 9 +++++++++ src/esx/esx_driver.c | 3 ++- src/libxl/libxl_driver.c | 3 ++- src/lxc/lxc_controller.c | 3 ++- src/lxc/lxc_driver.c | 3 ++- src/openvz/openvz_conf.c | 3 ++- src/qemu/qemu_driver.c | 3 ++- src/qemu/qemu_process.c | 15 +++++---------- src/security/virt-aa-helper.c | 3 ++- src/test/test_driver.c | 3 ++- src/vbox/vbox_common.c | 3 ++- src/vmware/vmware_conf.c | 3 ++- src/vz/vz_driver.c | 3 ++- tests/bhyveargv2xmltest.c | 2 +- tests/bhyvexml2argvtest.c | 2 +- tests/bhyvexml2xmltest.c | 2 +- tests/domainconftest.c | 3 ++- tests/genericxml2xmltest.c | 3 ++- tests/openvzutilstest.c | 2 +- tests/testutilslxc.c | 3 ++- tests/testutilsqemu.c | 3 ++- tests/testutilsxen.c | 3 ++- tests/vmx2xmltest.c | 3 ++- tests/xml2vmxtest.c | 6 ++++-- 26 files changed, 77 insertions(+), 44 deletions(-) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 4ca3666700..2224395128 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -1183,7 +1183,8 @@ bhyveStateCleanup(void) virObjectUnref(bhyve_driver->domains); if (bhyve_driver->caps) g_object_unref(bhyve_driver->caps); - virObjectUnref(bhyve_driver->xmlopt); + if (bhyve_driver->xmlopt) + g_object_unref(bhyve_driver->xmlopt); virSysinfoDefFree(bhyve_driver->hostsysinfo); virObjectUnref(bhyve_driver->closeCallbacks); virObjectUnref(bhyve_driver->domainEventState); diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 425a6bccb6..38a0c04c1f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -71,7 +71,7 @@ VIR_LOG_INIT("conf.domain_conf"); /* This structure holds various callbacks and data needed * while parsing and creating domain XMLs */ struct _virDomainXMLOption { - virObject parent; + GObject parent; /* XML parser callbacks and defaults */ virDomainDefParserConfig config; @@ -1273,18 +1273,26 @@ VIR_ENUM_IMPL(virDomainLaunchSecurity, ); static virClassPtr virDomainObjClass; -static virClassPtr virDomainXMLOptionClass; static void virDomainObjDispose(void *obj); -static void virDomainXMLOptionDispose(void *obj); +G_DEFINE_TYPE(virDomainXMLOption, vir_domain_xml_option, G_TYPE_OBJECT); +static void virDomainXMLOptionFinalize(GObject *obj); + +static void vir_domain_xml_option_init(virDomainXMLOption *option G_GNUC_UNUSED) +{ +} + +static void vir_domain_xml_option_class_init(virDomainXMLOptionClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virDomainXMLOptionFinalize; +} static int virDomainObjOnceInit(void) { if (!VIR_CLASS_NEW(virDomainObj, virClassForObjectLockable())) return -1; - if (!VIR_CLASS_NEW(virDomainXMLOption, virClassForObject())) - return -1; - return 0; } @@ -1292,12 +1300,14 @@ VIR_ONCE_GLOBAL_INIT(virDomainObj); static void -virDomainXMLOptionDispose(void *obj) +virDomainXMLOptionFinalize(GObject *obj) { - virDomainXMLOptionPtr xmlopt = obj; + virDomainXMLOptionPtr xmlopt = VIR_DOMAIN_XML_OPTION(obj); if (xmlopt->config.privFree) (xmlopt->config.privFree)(xmlopt->config.priv); + + G_OBJECT_CLASS(vir_domain_xml_option_parent_class)->finalize(obj); } /** @@ -1424,8 +1434,7 @@ virDomainXMLOptionNew(virDomainDefParserConfigPtr config, if (virDomainObjInitialize() < 0) return NULL; - if (!(xmlopt = virObjectNew(virDomainXMLOptionClass))) - return NULL; + xmlopt = VIR_DOMAIN_XML_OPTION(g_object_new(VIR_TYPE_DOMAIN_XML_OPTION, NULL)); if (priv) xmlopt->privateData = *priv; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 33875d942f..7e2792ae62 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -58,6 +58,8 @@ #include "virresctrl.h" #include "virenum.h" +#include <glib-object.h> + /* Flags for the 'type' field in virDomainDeviceDef */ typedef enum { VIR_DOMAIN_DEVICE_NONE = 0, @@ -2800,6 +2802,13 @@ struct _virDomainABIStability { virDomainABIStabilityDomain domain; }; +#define VIR_TYPE_DOMAIN_XML_OPTION vir_domain_xml_option_get_type() +G_DECLARE_FINAL_TYPE(virDomainXMLOption, + vir_domain_xml_option, + VIR, + DOMAIN_XML_OPTION, + GObject); + virDomainXMLOptionPtr virDomainXMLOptionNew(virDomainDefParserConfigPtr config, virDomainXMLPrivateDataCallbacksPtr priv, virXMLNamespacePtr xmlns, diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index f893d112d0..354f5cbe69 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -71,7 +71,8 @@ esxFreePrivate(esxPrivate **priv) esxUtil_FreeParsedUri(&(*priv)->parsedUri); if ((*priv)->caps) g_object_unref((*priv)->caps); - virObjectUnref((*priv)->xmlopt); + if ((*priv)->xmlopt) + g_object_unref((*priv)->xmlopt); VIR_FREE(*priv); } diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 7ec4fcc3d1..6564b45ee4 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -507,7 +507,8 @@ libxlStateCleanup(void) return -1; virObjectUnref(libxl_driver->hostdevMgr); - virObjectUnref(libxl_driver->xmlopt); + if (libxl_driver->xmlopt) + g_object_unref(libxl_driver->xmlopt); virObjectUnref(libxl_driver->domains); virPortAllocatorRangeFree(libxl_driver->reservedGraphicsPorts); virPortAllocatorRangeFree(libxl_driver->migrationPorts); diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index 2369704ac6..4c038c6228 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -180,7 +180,8 @@ virLXCControllerDriverFree(virLXCDriverPtr driver) { if (!driver) return; - virObjectUnref(driver->xmlopt); + if (driver->xmlopt) + g_object_unref(driver->xmlopt); if (driver->caps) g_object_unref(driver->caps); virMutexDestroy(&driver->lock); diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 1c59ddef6d..5da9ec7c58 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -1614,7 +1614,8 @@ static int lxcStateCleanup(void) if (lxc_driver->caps) g_object_unref(lxc_driver->caps); virObjectUnref(lxc_driver->securityManager); - virObjectUnref(lxc_driver->xmlopt); + if (lxc_driver->xmlopt) + g_object_unref(lxc_driver->xmlopt); if (lxc_driver->lockFD != -1) virPidFileRelease(lxc_driver->config->stateDir, "driver", lxc_driver->lockFD); diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index 1f70bfc3d9..a62e536aa0 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -479,7 +479,8 @@ openvzFreeDriver(struct openvz_driver *driver) if (!driver) return; - virObjectUnref(driver->xmlopt); + if (driver->xmlopt) + g_object_unref(driver->xmlopt); virObjectUnref(driver->domains); if (driver->caps) g_object_unref(driver->caps); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 99a5058033..73f1037e8a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1131,7 +1131,8 @@ qemuStateCleanup(void) virObjectUnref(qemu_driver->securityManager); virObjectUnref(qemu_driver->domainEventState); virObjectUnref(qemu_driver->qemuCapsCache); - virObjectUnref(qemu_driver->xmlopt); + if (qemu_driver->xmlopt) + g_object_unref(qemu_driver->xmlopt); virCPUDefFree(qemu_driver->hostcpu); virCapabilitiesHostNUMAUnref(qemu_driver->hostnuma); if (qemu_driver->caps) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 3f28c5245c..ef34dd8cfd 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -8567,9 +8567,8 @@ qemuProcessQMPInitMonitor(qemuMonitorPtr mon) static int qemuProcessQMPConnectMonitor(qemuProcessQMPPtr proc) { - virDomainXMLOptionPtr xmlopt = NULL; + g_autoptr(virDomainXMLOption) xmlopt = NULL; virDomainChrSourceDef monConfig; - int ret = -1; VIR_DEBUG("proc=%p, emulator=%s, proc->pid=%lld", proc, proc->binary, (long long)proc->pid); @@ -8581,25 +8580,21 @@ qemuProcessQMPConnectMonitor(qemuProcessQMPPtr proc) if (!(xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL, NULL, NULL)) || !(proc->vm = virDomainObjNew(xmlopt)) || !(proc->vm->def = virDomainDefNew())) - goto cleanup; + return -1; proc->vm->pid = proc->pid; if (!(proc->mon = qemuMonitorOpen(proc->vm, &monConfig, true, 0, virEventThreadGetContext(proc->eventThread), &callbacks, NULL))) - goto cleanup; + return -1; virObjectLock(proc->mon); if (qemuProcessQMPInitMonitor(proc->mon) < 0) - goto cleanup; - - ret = 0; + return -1; - cleanup: - virObjectUnref(xmlopt); - return ret; + return 0; } diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index 7b0ae6acad..cbf4a567d5 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -81,7 +81,8 @@ vahDeinit(vahControl * ctl) VIR_FREE(ctl->def); if (ctl->caps) g_object_unref(ctl->caps); - virObjectUnref(ctl->xmlopt); + if (ctl->xmlopt) + g_object_unref(ctl->xmlopt); VIR_FREE(ctl->files); VIR_FREE(ctl->virtType); VIR_FREE(ctl->os); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 00c3d34a81..1696b956fe 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -160,7 +160,8 @@ testDriverDispose(void *obj) if (driver->caps) g_object_unref(driver->caps); - virObjectUnref(driver->xmlopt); + if (driver->xmlopt) + g_object_unref(driver->xmlopt); virObjectUnref(driver->domains); virNodeDeviceObjListFree(driver->devs); virObjectUnref(driver->networks); diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 0e009a5739..60018668ca 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -124,7 +124,8 @@ vboxDriverDispose(void *obj) if (driver->caps) g_object_unref(driver->caps); - virObjectUnref(driver->xmlopt); + if (driver->xmlopt) + g_object_unref(driver->xmlopt); } static int diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index ee21e96971..e5e3ee33a5 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -56,7 +56,8 @@ vmwareFreeDriver(struct vmware_driver *driver) virObjectUnref(driver->domains); if (driver->caps) g_object_unref(driver->caps); - virObjectUnref(driver->xmlopt); + if (driver->xmlopt) + g_object_unref(driver->xmlopt); VIR_FREE(driver->vmrun); VIR_FREE(driver); } diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 517259131d..ab06071731 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -150,7 +150,8 @@ static void vzDriverDispose(void * obj) virObjectUnref(driver->domains); if (driver->caps) g_object_unref(driver->caps); - virObjectUnref(driver->xmlopt); + if (driver->xmlopt) + g_object_unref(driver->xmlopt); virObjectUnref(driver->domainEventState); virSysinfoDefFree(driver->hostsysinfo); } diff --git a/tests/bhyveargv2xmltest.c b/tests/bhyveargv2xmltest.c index 5de5b48a8e..3cc6ca8b38 100644 --- a/tests/bhyveargv2xmltest.c +++ b/tests/bhyveargv2xmltest.c @@ -196,7 +196,7 @@ mymain(void) DO_TEST_FAIL("extraargs"); g_object_unref(driver.caps); - virObjectUnref(driver.xmlopt); + g_object_unref(driver.xmlopt); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index 9ea0d76f06..48abb436d0 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -250,7 +250,7 @@ mymain(void) DO_TEST_FAILURE("cputopology"); g_object_unref(driver.caps); - virObjectUnref(driver.xmlopt); + g_object_unref(driver.xmlopt); virPortAllocatorRangeFree(driver.remotePorts); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/bhyvexml2xmltest.c b/tests/bhyvexml2xmltest.c index cb0f6022c3..add96d4859 100644 --- a/tests/bhyvexml2xmltest.c +++ b/tests/bhyvexml2xmltest.c @@ -128,7 +128,7 @@ mymain(void) DO_TEST_DIFFERENT("input-xhci-tablet"); g_object_unref(driver.caps); - virObjectUnref(driver.xmlopt); + g_object_unref(driver.xmlopt); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/domainconftest.c b/tests/domainconftest.c index ada397b925..c19da1ae97 100644 --- a/tests/domainconftest.c +++ b/tests/domainconftest.c @@ -105,7 +105,8 @@ mymain(void) if (caps) g_object_unref(caps); - virObjectUnref(xmlopt); + if (xmlopt) + g_object_unref(xmlopt); cleanup: return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c index 0659ca1b28..339d1478a3 100644 --- a/tests/genericxml2xmltest.c +++ b/tests/genericxml2xmltest.c @@ -197,7 +197,8 @@ mymain(void) if (caps) g_object_unref(caps); - virObjectUnref(xmlopt); + if (xmlopt) + g_object_unref(xmlopt); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/openvzutilstest.c b/tests/openvzutilstest.c index 48de2d1c7d..2fd21fc718 100644 --- a/tests/openvzutilstest.c +++ b/tests/openvzutilstest.c @@ -131,7 +131,7 @@ testReadNetworkConf(const void *data G_GNUC_UNUSED) result = 0; cleanup: - virObjectUnref(driver.xmlopt); + g_object_unref(driver.xmlopt); g_object_unref(driver.caps); VIR_FREE(actual); virDomainDefFree(def); diff --git a/tests/testutilslxc.c b/tests/testutilslxc.c index 2f28975332..ad2afdd683 100644 --- a/tests/testutilslxc.c +++ b/tests/testutilslxc.c @@ -76,7 +76,8 @@ testLXCDriverInit(void) void testLXCDriverFree(virLXCDriverPtr driver) { - virObjectUnref(driver->xmlopt); + if (driver->xmlopt) + g_object_unref(driver->xmlopt); if (driver->caps) g_object_unref(driver->caps); virMutexDestroy(&driver->lock); diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index dd8143ff55..a37865bc14 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -307,7 +307,8 @@ void qemuTestDriverFree(virQEMUDriver *driver) virFileDeleteTree(driver->config->configDir); } virObjectUnref(driver->qemuCapsCache); - virObjectUnref(driver->xmlopt); + if (driver->xmlopt) + g_object_unref(driver->xmlopt); if (driver->caps) g_object_unref(driver->caps); virObjectUnref(driver->config); diff --git a/tests/testutilsxen.c b/tests/testutilsxen.c index 7da90cdd1e..6b6b0bf038 100644 --- a/tests/testutilsxen.c +++ b/tests/testutilsxen.c @@ -112,7 +112,8 @@ libxlDriverPrivatePtr testXLInitDriver(void) void testXLFreeDriver(libxlDriverPrivatePtr driver) { virObjectUnref(driver->config); - virObjectUnref(driver->xmlopt); + if (driver->xmlopt) + g_object_unref(driver->xmlopt); virMutexDestroy(&driver->lock); g_free(driver); } diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c index b5c557fe33..c87b60fc78 100644 --- a/tests/vmx2xmltest.c +++ b/tests/vmx2xmltest.c @@ -282,7 +282,8 @@ mymain(void) DO_TEST("datacenterpath", "datacenterpath"); g_object_unref(caps); - virObjectUnref(xmlopt); + if (xmlopt) + g_object_unref(xmlopt); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c index d6c7eb4f53..735df01e56 100644 --- a/tests/xml2vmxtest.c +++ b/tests/xml2vmxtest.c @@ -61,7 +61,8 @@ testCapsInit(void) failure: if (caps) g_clear_object(&caps); - virObjectUnref(xmlopt); + if (xmlopt) + g_object_unref(xmlopt); } static int @@ -292,7 +293,8 @@ mymain(void) DO_TEST("datacenterpath", "datacenterpath", 4); g_object_unref(caps); - virObjectUnref(xmlopt); + if (xmlopt) + g_object_unref(xmlopt); return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/bhyve/bhyve_monitor.c | 35 +++++++++++++++++++---------------- src/bhyve/bhyve_monitor.h | 3 ++- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/bhyve/bhyve_monitor.c b/src/bhyve/bhyve_monitor.c index e5cd39a086..4609e3c53a 100644 --- a/src/bhyve/bhyve_monitor.c +++ b/src/bhyve/bhyve_monitor.c @@ -39,7 +39,7 @@ VIR_LOG_INIT("bhyve.bhyve_monitor"); struct _bhyveMonitor { - virObject parent; + GObject parent; bhyveConnPtr driver; virDomainObjPtr vm; @@ -48,34 +48,38 @@ struct _bhyveMonitor { bool reboot; }; -static virClassPtr bhyveMonitorClass; +G_DEFINE_TYPE(bhyveMonitor, bhyve_monitor, G_TYPE_OBJECT); static void -bhyveMonitorDispose(void *obj) +bhyveMonitorFinalize(GObject *obj) { - bhyveMonitorPtr mon = obj; + bhyveMonitorPtr mon = BHYVE_MONITOR(obj); VIR_FORCE_CLOSE(mon->kq); virObjectUnref(mon->vm); + + G_OBJECT_CLASS(bhyve_monitor_parent_class)->finalize(obj); } -static int -bhyveMonitorOnceInit(void) +static void +bhyve_monitor_init(bhyveMonitor *mon G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(bhyveMonitor, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(bhyveMonitor); +static void +bhyve_monitor_class_init(bhyveMonitorClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = bhyveMonitorFinalize; +} static void bhyveMonitorIO(int, int, int, void *); static bool bhyveMonitorRegister(bhyveMonitorPtr mon) { - virObjectRef(mon); + g_object_ref(mon); mon->watch = virEventAddHandle(mon->kq, VIR_EVENT_HANDLE_READABLE | VIR_EVENT_HANDLE_ERROR | @@ -85,7 +89,7 @@ bhyveMonitorRegister(bhyveMonitorPtr mon) virObjectFreeCallback); if (mon->watch < 0) { VIR_DEBUG("failed to add event handle for mon %p", mon); - virObjectUnref(mon); + g_object_unref(mon); return false; } return true; @@ -181,8 +185,7 @@ bhyveMonitorOpenImpl(virDomainObjPtr vm, bhyveConnPtr driver) if (bhyveMonitorInitialize() < 0) return NULL; - if (!(mon = virObjectNew(bhyveMonitorClass))) - return NULL; + mon = BHYVE_MONITOR(g_object_new(BHYVE_TYPE_MONITOR, NULL)); mon->driver = driver; mon->reboot = false; @@ -238,5 +241,5 @@ bhyveMonitorClose(bhyveMonitorPtr mon) VIR_DEBUG("cleaning up bhyveMonitor %p", mon); bhyveMonitorUnregister(mon); - virObjectUnref(mon); + g_object_unref(mon); } diff --git a/src/bhyve/bhyve_monitor.h b/src/bhyve/bhyve_monitor.h index 175cc87192..dcc6929696 100644 --- a/src/bhyve/bhyve_monitor.h +++ b/src/bhyve/bhyve_monitor.h @@ -24,7 +24,8 @@ #include "domain_conf.h" #include "bhyve_utils.h" -typedef struct _bhyveMonitor bhyveMonitor; +#define BHYVE_TYPE_MONITOR bhyve_monitor_get_type() +G_DECLARE_FINAL_TYPE(bhyveMonitor, bhyve_monitor, BHYVE, MONITOR, GObject); typedef bhyveMonitor *bhyveMonitorPtr; bhyveMonitorPtr bhyveMonitorOpen(virDomainObjPtr vm, bhyveConnPtr driver); -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/bhyve/bhyve_capabilities.c | 3 +-- src/bhyve/bhyve_conf.c | 34 +++++++++++++++++----------------- src/bhyve/bhyve_driver.c | 3 ++- src/bhyve/bhyve_utils.h | 11 +++++++++-- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index 66442e50ba..00f7613594 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -131,7 +131,7 @@ virBhyveDomainCapsBuild(bhyveConnPtr conn, DIR *dir; struct dirent *entry; size_t firmwares_alloc = 0; - virBhyveDriverConfigPtr cfg = virBhyveDriverGetConfig(conn); + g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(conn); const char *firmware_dir = cfg->firmwareDir; virDomainCapsStringValuesPtr firmwares = NULL; @@ -167,7 +167,6 @@ virBhyveDomainCapsBuild(bhyveConnPtr conn, cleanup: VIR_FREE(firmwares); VIR_DIR_CLOSE(dir); - virObjectUnref(cfg); return caps; } diff --git a/src/bhyve/bhyve_conf.c b/src/bhyve/bhyve_conf.c index f3e2ebf7c7..19ea5c5a03 100644 --- a/src/bhyve/bhyve_conf.c +++ b/src/bhyve/bhyve_conf.c @@ -32,29 +32,27 @@ VIR_LOG_INIT("bhyve.bhyve_conf"); -static virClassPtr virBhyveDriverConfigClass; -static void virBhyveDriverConfigDispose(void *obj); +G_DEFINE_TYPE(virBhyveDriverConfig, vir_bhyve_driver_config, G_TYPE_OBJECT); +static void virBhyveDriverConfigFinalize(GObject *obj); -static int virBhyveConfigOnceInit(void) +static void +vir_bhyve_driver_config_init(virBhyveDriverConfig *cfg G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(virBhyveDriverConfig, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(virBhyveConfig); +static void +vir_bhyve_driver_config_class_init(virBhyveDriverConfigClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virBhyveDriverConfigFinalize; +} virBhyveDriverConfigPtr virBhyveDriverConfigNew(void) { - virBhyveDriverConfigPtr cfg; - - if (virBhyveConfigInitialize() < 0) - return NULL; - - if (!(cfg = virObjectNew(virBhyveDriverConfigClass))) - return NULL; + virBhyveDriverConfigPtr cfg = + VIR_BHYVE_DRIVER_CONFIG(g_object_new(VIR_TYPE_BHYVE_DRIVER_CONFIG, NULL)); cfg->firmwareDir = g_strdup(DATADIR "/uefi-firmware"); @@ -93,11 +91,13 @@ virBhyveDriverGetConfig(bhyveConnPtr driver) } static void -virBhyveDriverConfigDispose(void *obj) +virBhyveDriverConfigFinalize(GObject *obj) { - virBhyveDriverConfigPtr cfg = obj; + virBhyveDriverConfigPtr cfg = VIR_BHYVE_DRIVER_CONFIG(obj); VIR_FREE(cfg->firmwareDir); + + G_OBJECT_CLASS(vir_bhyve_driver_config_parent_class)->finalize(obj); } void diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 2224395128..275c095b20 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -1188,7 +1188,8 @@ bhyveStateCleanup(void) virSysinfoDefFree(bhyve_driver->hostsysinfo); virObjectUnref(bhyve_driver->closeCallbacks); virObjectUnref(bhyve_driver->domainEventState); - virObjectUnref(bhyve_driver->config); + if (bhyve_driver->config) + g_object_unref(bhyve_driver->config); virPortAllocatorRangeFree(bhyve_driver->remotePorts); if (bhyve_driver->lockFD != -1) diff --git a/src/bhyve/bhyve_utils.h b/src/bhyve/bhyve_utils.h index f3e80b6121..675b859098 100644 --- a/src/bhyve/bhyve_utils.h +++ b/src/bhyve/bhyve_utils.h @@ -29,16 +29,23 @@ #include "hypervisor/virclosecallbacks.h" #include "virportallocator.h" +#include <glib-object.h> + #define BHYVE_AUTOSTART_DIR SYSCONFDIR "/libvirt/bhyve/autostart" #define BHYVE_CONFIG_DIR SYSCONFDIR "/libvirt/bhyve" #define BHYVE_STATE_DIR RUNSTATEDIR "/libvirt/bhyve" #define BHYVE_LOG_DIR LOCALSTATEDIR "/log/libvirt/bhyve" -typedef struct _virBhyveDriverConfig virBhyveDriverConfig; +#define VIR_TYPE_BHYVE_DRIVER_CONFIG vir_bhyve_driver_config_get_type() +G_DECLARE_FINAL_TYPE(virBhyveDriverConfig, + vir_bhyve_driver_config, + VIR, + BHYVE_DRIVER_CONFIG, + GObject); typedef struct _virBhyveDriverConfig *virBhyveDriverConfigPtr; struct _virBhyveDriverConfig { - virObject parent; + GObject parent; char *firmwareDir; }; -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/lxc/lxc_controller.c | 6 +-- src/rpc/virnetserver.c | 4 +- src/rpc/virnetserverprogram.h | 7 ++- src/rpc/virnetserverservice.c | 87 +++++++++++++++-------------------- tests/virnetdaemontest.c | 4 +- 5 files changed, 48 insertions(+), 60 deletions(-) diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index 4c038c6228..ea03f5a452 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -992,8 +992,7 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl) if (virNetServerAddService(srv, svc) < 0) goto error; - virObjectUnref(svc); - svc = NULL; + g_clear_object(&svc); ctrl->prog = virNetServerProgramNew(VIR_LXC_MONITOR_PROGRAM, VIR_LXC_MONITOR_PROGRAM_VERSION, @@ -1015,7 +1014,8 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl) virObjectUnref(srv); virObjectUnref(ctrl->daemon); ctrl->daemon = NULL; - virObjectUnref(svc); + if (svc) + g_object_unref(svc); return -1; } diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 5e9124c7ee..f5a59b11af 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -660,7 +660,7 @@ int virNetServerAddService(virNetServerPtr srv, if (VIR_EXPAND_N(srv->services, srv->nservices, 1) < 0) goto error; - srv->services[srv->nservices-1] = virObjectRef(svc); + srv->services[srv->nservices-1] = g_object_ref(svc); virNetServerServiceSetDispatcher(svc, virNetServerDispatchNewClient, @@ -916,7 +916,7 @@ void virNetServerDispose(void *obj) virThreadPoolFree(srv->workers); for (i = 0; i < srv->nservices; i++) - virObjectUnref(srv->services[i]); + g_object_unref(srv->services[i]); VIR_FREE(srv->services); for (i = 0; i < srv->nprograms; i++) diff --git a/src/rpc/virnetserverprogram.h b/src/rpc/virnetserverprogram.h index bcc10809d4..72dff3b9cb 100644 --- a/src/rpc/virnetserverprogram.h +++ b/src/rpc/virnetserverprogram.h @@ -29,7 +29,12 @@ typedef struct _virNetDaemon virNetDaemon; typedef virNetDaemon *virNetDaemonPtr; -typedef struct _virNetServerService virNetServerService; +#define VIR_TYPE_NET_SERVER_SERVICE vir_net_server_service_get_type() +G_DECLARE_FINAL_TYPE(virNetServerService, + vir_net_server_service, + VIR, + NET_SERVER_SERVICE, + GObject); typedef virNetServerService *virNetServerServicePtr; #define VIR_TYPE_NET_SERVER_PROGRAM vir_net_server_program_get_type() diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c index 9d5df456a8..781e414461 100644 --- a/src/rpc/virnetserverservice.c +++ b/src/rpc/virnetserverservice.c @@ -35,7 +35,7 @@ VIR_LOG_INIT("rpc.netserverservice"); struct _virNetServerService { - virObject parent; + GObject parent; size_t nsocks; virNetSocketPtr *socks; @@ -51,19 +51,19 @@ struct _virNetServerService { }; -static virClassPtr virNetServerServiceClass; -static void virNetServerServiceDispose(void *obj); +G_DEFINE_TYPE(virNetServerService, vir_net_server_service, G_TYPE_OBJECT); +static void virNetServerServiceFinalize(GObject *obj); -static int virNetServerServiceOnceInit(void) +static void vir_net_server_service_init(virNetServerService *svc G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(virNetServerService, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(virNetServerService); +static void vir_net_server_service_class_init(virNetServerServiceClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + obj->finalize = virNetServerServiceFinalize; +} static void virNetServerServiceAccept(virNetSocketPtr sock, int events G_GNUC_UNUSED, @@ -97,17 +97,13 @@ virNetServerServiceNewSocket(virNetSocketPtr *socks, size_t max_queued_clients, size_t nrequests_client_max) { - virNetServerServicePtr svc; + g_autoptr(virNetServerService) svc = NULL; size_t i; - if (virNetServerServiceInitialize() < 0) - return NULL; - - if (!(svc = virObjectNew(virNetServerServiceClass))) - return NULL; + svc = VIR_NET_SERVER_SERVICE(g_object_new(VIR_TYPE_NET_SERVER_SERVICE, NULL)); if (VIR_ALLOC_N(svc->socks, nsocks) < 0) - goto error; + return NULL; svc->nsocks = nsocks; for (i = 0; i < svc->nsocks; i++) { svc->socks[i] = socks[i]; @@ -120,27 +116,22 @@ virNetServerServiceNewSocket(virNetSocketPtr *socks, for (i = 0; i < svc->nsocks; i++) { if (virNetSocketListen(svc->socks[i], max_queued_clients) < 0) - goto error; + return NULL; /* IO callback is initially disabled, until we're ready * to deal with incoming clients */ - virObjectRef(svc); + g_object_ref(svc); if (virNetSocketAddIOCallback(svc->socks[i], 0, virNetServerServiceAccept, svc, - virObjectFreeCallback) < 0) { - virObjectUnref(svc); - goto error; + g_object_unref) < 0) { + g_object_unref(svc); + return NULL; } } - - return svc; - - error: - virObjectUnref(svc); - return NULL; + return g_steal_pointer(&svc); } @@ -258,51 +249,47 @@ virNetServerServicePtr virNetServerServiceNewFDs(int *fds, virNetServerServicePtr virNetServerServiceNewPostExecRestart(virJSONValuePtr object) { - virNetServerServicePtr svc; + g_autoptr(virNetServerService) svc = NULL; virJSONValuePtr socks; size_t i; size_t n; unsigned int max; - if (virNetServerServiceInitialize() < 0) - return NULL; - - if (!(svc = virObjectNew(virNetServerServiceClass))) - return NULL; + svc = VIR_NET_SERVER_SERVICE(g_object_new(VIR_TYPE_NET_SERVER_SERVICE, NULL)); if (virJSONValueObjectGetNumberInt(object, "auth", &svc->auth) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing auth field in JSON state document")); - goto error; + return NULL; } if (virJSONValueObjectGetBoolean(object, "readonly", &svc->readonly) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing readonly field in JSON state document")); - goto error; + return NULL; } if (virJSONValueObjectGetNumberUint(object, "nrequests_client_max", &max) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing nrequests_client_max field in JSON state document")); - goto error; + return NULL; } svc->nrequests_client_max = max; if (!(socks = virJSONValueObjectGet(object, "socks"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing socks field in JSON state document")); - goto error; + return NULL; } if (!virJSONValueIsArray(socks)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Malformed socks array")); - goto error; + return NULL; } n = virJSONValueArraySize(socks); if (VIR_ALLOC_N(svc->socks, n) < 0) - goto error; + return NULL; svc->nsocks = n; for (i = 0; i < svc->nsocks; i++) { @@ -311,29 +298,25 @@ virNetServerServicePtr virNetServerServiceNewPostExecRestart(virJSONValuePtr obj if (!(sock = virNetSocketNewPostExecRestart(child))) { virObjectUnref(sock); - goto error; + return NULL; } svc->socks[i] = sock; /* IO callback is initially disabled, until we're ready * to deal with incoming clients */ - virObjectRef(svc); + g_object_ref(svc); if (virNetSocketAddIOCallback(sock, 0, virNetServerServiceAccept, svc, - virObjectFreeCallback) < 0) { - virObjectUnref(svc); - goto error; + g_object_unref) < 0) { + g_object_unref(svc); + return NULL; } } - return svc; - - error: - virObjectUnref(svc); - return NULL; + return g_steal_pointer(&svc); } @@ -415,9 +398,9 @@ void virNetServerServiceSetDispatcher(virNetServerServicePtr svc, } -void virNetServerServiceDispose(void *obj) +void virNetServerServiceFinalize(GObject *obj) { - virNetServerServicePtr svc = obj; + virNetServerServicePtr svc = VIR_NET_SERVER_SERVICE(obj); size_t i; for (i = 0; i < svc->nsocks; i++) @@ -425,6 +408,8 @@ void virNetServerServiceDispose(void *obj) VIR_FREE(svc->socks); virObjectUnref(svc->tls); + + G_OBJECT_CLASS(vir_net_server_service_parent_class)->finalize(obj); } void virNetServerServiceToggle(virNetServerServicePtr svc, diff --git a/tests/virnetdaemontest.c b/tests/virnetdaemontest.c index 09d268627c..3107fb6747 100644 --- a/tests/virnetdaemontest.c +++ b/tests/virnetdaemontest.c @@ -85,7 +85,7 @@ static virNetServerPtr testCreateServer(const char *server_name, const char *host, int family) { virNetServerPtr srv = NULL; - virNetServerServicePtr svc1 = NULL, svc2 = NULL; + g_autoptr(virNetServerService) svc1 = NULL, svc2 = NULL; virNetServerClientPtr cln1 = NULL, cln2 = NULL; virNetSocketPtr sk1 = NULL, sk2 = NULL; int fdclient[2]; @@ -170,8 +170,6 @@ testCreateServer(const char *server_name, const char *host, int family) virDispatchError(NULL); virObjectUnref(cln1); virObjectUnref(cln2); - virObjectUnref(svc1); - virObjectUnref(svc2); virObjectUnref(sk1); virObjectUnref(sk2); return srv; -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/domain_capabilities.c | 48 ++++++++++++++++++---------------- src/conf/domain_capabilities.h | 10 ++++--- tests/cputest.c | 35 ++++++++----------------- 3 files changed, 43 insertions(+), 50 deletions(-) diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index 921d795630..bc0a505cb9 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -45,19 +45,27 @@ VIR_ENUM_IMPL(virDomainCapsFeature, ); static virClassPtr virDomainCapsClass; -static virClassPtr virDomainCapsCPUModelsClass; +G_DEFINE_TYPE(virDomainCapsCPUModels, vir_domain_caps_cpu_models, G_TYPE_OBJECT); static void virDomainCapsDispose(void *obj); -static void virDomainCapsCPUModelsDispose(void *obj); +static void virDomainCapsCPUModelsFinalize(GObject *obj); + +static void vir_domain_caps_cpu_models_init(virDomainCapsCPUModels *mod G_GNUC_UNUSED) +{ +} + +static void vir_domain_caps_cpu_models_class_init(virDomainCapsCPUModelsClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virDomainCapsCPUModelsFinalize; +} static int virDomainCapsOnceInit(void) { if (!VIR_CLASS_NEW(virDomainCaps, virClassForObjectLockable())) return -1; - if (!VIR_CLASS_NEW(virDomainCapsCPUModels, virClassForObject())) - return -1; - return 0; } @@ -107,9 +115,9 @@ virDomainCapsDispose(void *obj) static void -virDomainCapsCPUModelsDispose(void *obj) +virDomainCapsCPUModelsFinalize(GObject *obj) { - virDomainCapsCPUModelsPtr cpuModels = obj; + virDomainCapsCPUModelsPtr cpuModels = VIR_DOMAIN_CAPS_CPU_MODELS(obj); size_t i; for (i = 0; i < cpuModels->nmodels; i++) { @@ -118,6 +126,8 @@ virDomainCapsCPUModelsDispose(void *obj) } VIR_FREE(cpuModels->models); + + G_OBJECT_CLASS(vir_domain_caps_cpu_models_parent_class)->finalize(obj); } @@ -147,30 +157,26 @@ virDomainCapsNew(const char *path, virDomainCapsCPUModelsPtr virDomainCapsCPUModelsNew(size_t nmodels) { - virDomainCapsCPUModelsPtr cpuModels = NULL; + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; if (virDomainCapsInitialize() < 0) return NULL; - if (!(cpuModels = virObjectNew(virDomainCapsCPUModelsClass))) - return NULL; + cpuModels = VIR_DOMAIN_CAPS_CPU_MODELS( + g_object_new(VIR_TYPE_DOMAIN_CAPS_CPU_MODELS, NULL)); if (VIR_ALLOC_N(cpuModels->models, nmodels) < 0) - goto error; + return NULL; cpuModels->nmodels_max = nmodels; - return cpuModels; - - error: - virObjectUnref(cpuModels); - return NULL; + return g_steal_pointer(&cpuModels); } virDomainCapsCPUModelsPtr virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old) { - virDomainCapsCPUModelsPtr cpuModels; + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; size_t i; if (!(cpuModels = virDomainCapsCPUModelsNew(old->nmodels))) @@ -181,14 +187,10 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old) old->models[i].name, old->models[i].usable, old->models[i].blockers) < 0) - goto error; + return NULL; } - return cpuModels; - - error: - virObjectUnref(cpuModels); - return NULL; + return g_steal_pointer(&cpuModels); } diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index 9f4a23d015..88673ffe35 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -129,17 +129,21 @@ struct _virDomainCapsCPUModel { char **blockers; /* NULL-terminated list of usability blockers */ }; -typedef struct _virDomainCapsCPUModels virDomainCapsCPUModels; +#define VIR_TYPE_DOMAIN_CAPS_CPU_MODELS vir_domain_caps_cpu_models_get_type() +G_DECLARE_FINAL_TYPE(virDomainCapsCPUModels, + vir_domain_caps_cpu_models, + VIR, + DOMAIN_CAPS_CPU_MODELS, + GObject); typedef virDomainCapsCPUModels *virDomainCapsCPUModelsPtr; struct _virDomainCapsCPUModels { - virObject parent; + GObject parent; size_t nmodels_max; size_t nmodels; virDomainCapsCPUModelPtr models; }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainCapsCPUModels, virObjectUnref); typedef struct _virDomainCapsCPU virDomainCapsCPU; typedef virDomainCapsCPU *virDomainCapsCPUPtr; diff --git a/tests/cputest.c b/tests/cputest.c index 4590bfacee..6ae35227b9 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -572,7 +572,7 @@ cpuTestCPUID(bool guest, const void *arg) char *host = NULL; virCPUDefPtr cpu = NULL; char *result = NULL; - virDomainCapsCPUModelsPtr models = NULL; + g_autoptr(virDomainCapsCPUModels) models = NULL; hostFile = g_strdup_printf("%s/cputestdata/%s-cpuid-%s.xml", abs_srcdir, virArchToString(data->arch), data->host); @@ -614,7 +614,6 @@ cpuTestCPUID(bool guest, const void *arg) virCPUDataFree(hostData); virCPUDefFree(cpu); VIR_FREE(result); - virObjectUnref(models); return ret; } @@ -786,8 +785,8 @@ cpuTestUpdateLive(const void *arg) virCPUDataPtr disabledData = NULL; char *expectedFile = NULL; virCPUDefPtr expected = NULL; - virDomainCapsCPUModelsPtr hvModels = NULL; - virDomainCapsCPUModelsPtr models = NULL; + g_autoptr(virDomainCapsCPUModels) hvModels = NULL; + g_autoptr(virDomainCapsCPUModels) models = NULL; int ret = -1; cpuFile = g_strdup_printf("cpuid-%s-guest", data->host); @@ -863,8 +862,6 @@ cpuTestUpdateLive(const void *arg) virCPUDataFree(disabledData); VIR_FREE(expectedFile); virCPUDefFree(expected); - virObjectUnref(hvModels); - virObjectUnref(models); return ret; } @@ -936,7 +933,7 @@ static const char *ppc_models_list[] = { "POWER6", "POWER7", "POWER8", NULL }; static virDomainCapsCPUModelsPtr cpuTestInitModels(const char **list) { - virDomainCapsCPUModelsPtr cpus; + g_autoptr(virDomainCapsCPUModels) cpus = NULL; const char **model; if (!(cpus = virDomainCapsCPUModelsNew(0))) @@ -945,25 +942,21 @@ cpuTestInitModels(const char **list) for (model = list; *model; model++) { if (virDomainCapsCPUModelsAdd(cpus, *model, VIR_DOMCAPS_CPU_USABLE_UNKNOWN, NULL) < 0) - goto error; + return NULL; } - return cpus; - - error: - virObjectUnref(cpus); - return NULL; + return g_steal_pointer(&cpus); } static int mymain(void) { - virDomainCapsCPUModelsPtr model486 = NULL; - virDomainCapsCPUModelsPtr nomodel = NULL; - virDomainCapsCPUModelsPtr models = NULL; - virDomainCapsCPUModelsPtr haswell = NULL; - virDomainCapsCPUModelsPtr ppc_models = NULL; + g_autoptr(virDomainCapsCPUModels) model486 = NULL; + g_autoptr(virDomainCapsCPUModels) nomodel = NULL; + g_autoptr(virDomainCapsCPUModels) models = NULL; + g_autoptr(virDomainCapsCPUModels) haswell = NULL; + g_autoptr(virDomainCapsCPUModels) ppc_models = NULL; int ret = 0; #if WITH_QEMU @@ -1272,12 +1265,6 @@ mymain(void) qemuTestDriverFree(&driver); #endif - virObjectUnref(model486); - virObjectUnref(nomodel); - virObjectUnref(models); - virObjectUnref(haswell); - virObjectUnref(ppc_models); - return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/network/bridge_driver.c | 21 ++++++-------- src/util/virdnsmasq.c | 56 +++++++++++++++++-------------------- src/util/virdnsmasq.h | 6 ++-- tests/networkxml2conftest.c | 10 ++----- 4 files changed, 41 insertions(+), 52 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index f06099297a..6148bf6a7e 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -117,7 +117,7 @@ networkGetDnsmasqCaps(virNetworkDriverStatePtr driver) { dnsmasqCapsPtr ret; networkDriverLock(driver); - ret = virObjectRef(driver->dnsmasqCaps); + ret = g_object_ref(driver->dnsmasqCaps); networkDriverUnlock(driver); return ret; } @@ -132,7 +132,8 @@ networkDnsmasqCapsRefresh(virNetworkDriverStatePtr driver) return -1; networkDriverLock(driver); - virObjectUnref(driver->dnsmasqCaps); + if (driver->dnsmasqCaps) + g_object_unref(driver->dnsmasqCaps); driver->dnsmasqCaps = caps; networkDriverUnlock(driver); return 0; @@ -543,7 +544,7 @@ networkUpdateState(virNetworkObjPtr obj, { virNetworkDefPtr def; virNetworkDriverStatePtr driver = opaque; - dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver); + g_autoptr(dnsmasqCaps) dnsmasq_caps = networkGetDnsmasqCaps(driver); virMacMapPtr macmap; char *macMapFile = NULL; int ret = -1; @@ -629,7 +630,6 @@ networkUpdateState(virNetworkObjPtr obj, ret = 0; cleanup: virObjectUnlock(obj); - virObjectUnref(dnsmasq_caps); VIR_FREE(macMapFile); return ret; } @@ -905,7 +905,8 @@ networkStateCleanup(void) VIR_FREE(network_driver->dnsmasqStateDir); VIR_FREE(network_driver->radvdStateDir); - virObjectUnref(network_driver->dnsmasqCaps); + if (network_driver->dnsmasqCaps) + g_object_unref(network_driver->dnsmasqCaps); virMutexDestroy(&network_driver->lock); @@ -1544,7 +1545,7 @@ networkBuildDhcpDaemonCommandLine(virNetworkDriverStatePtr driver, dnsmasqContext *dctx) { virNetworkDefPtr def = virNetworkObjGetDef(obj); - dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver); + g_autoptr(dnsmasqCaps) dnsmasq_caps = networkGetDnsmasqCaps(driver); virCommandPtr cmd = NULL; int ret = -1; char *configfile = NULL; @@ -1587,7 +1588,6 @@ networkBuildDhcpDaemonCommandLine(virNetworkDriverStatePtr driver, *cmdout = cmd; ret = 0; cleanup: - virObjectUnref(dnsmasq_caps); VIR_FREE(configfile); VIR_FREE(configstr); VIR_FREE(leaseshelper_path); @@ -1911,7 +1911,7 @@ networkStartRadvd(virNetworkDriverStatePtr driver, virNetworkObjPtr obj) { virNetworkDefPtr def = virNetworkObjGetDef(obj); - dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver); + g_autoptr(dnsmasqCaps) dnsmasq_caps = networkGetDnsmasqCaps(driver); pid_t radvdPid; char *pidfile = NULL; char *radvdpidbase = NULL; @@ -1989,7 +1989,6 @@ networkStartRadvd(virNetworkDriverStatePtr driver, ret = 0; cleanup: - virObjectUnref(dnsmasq_caps); virCommandFree(cmd); VIR_FREE(configfile); VIR_FREE(radvdpidbase); @@ -2003,14 +2002,13 @@ networkRefreshRadvd(virNetworkDriverStatePtr driver, virNetworkObjPtr obj) { virNetworkDefPtr def = virNetworkObjGetDef(obj); - dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver); + g_autoptr(dnsmasqCaps) dnsmasq_caps = networkGetDnsmasqCaps(driver); g_autofree char *radvdpidbase = NULL; g_autofree char *pidfile = NULL; pid_t radvdPid; /* Is dnsmasq handling RA? */ if (DNSMASQ_RA_SUPPORT(dnsmasq_caps)) { - virObjectUnref(dnsmasq_caps); if ((radvdpidbase = networkRadvdPidfileBasename(def->name)) && (pidfile = virPidFileBuildPath(driver->pidDir, radvdpidbase))) { /* radvd should not be running but in case it is */ @@ -2019,7 +2017,6 @@ networkRefreshRadvd(virNetworkDriverStatePtr driver, } return 0; } - virObjectUnref(dnsmasq_caps); /* if there's no running radvd, just start it */ radvdPid = virNetworkObjGetRadvdPid(obj); diff --git a/src/util/virdnsmasq.c b/src/util/virdnsmasq.c index adc6f96bb6..a8fb22a368 100644 --- a/src/util/virdnsmasq.c +++ b/src/util/virdnsmasq.c @@ -598,7 +598,7 @@ dnsmasqReload(pid_t pid G_GNUC_UNUSED) * */ struct _dnsmasqCaps { - virObject parent; + GObject parent; char *binaryPath; bool noRefresh; time_t mtime; @@ -606,26 +606,31 @@ struct _dnsmasqCaps { unsigned long version; }; -static virClassPtr dnsmasqCapsClass; +G_DEFINE_TYPE(dnsmasqCaps, dnsmasq_caps, G_TYPE_OBJECT); static void -dnsmasqCapsDispose(void *obj) +dnsmasqCapsFinalize(GObject *obj) { - dnsmasqCapsPtr caps = obj; + dnsmasqCapsPtr caps = DNSMASQ_CAPS(obj); virBitmapFree(caps->flags); VIR_FREE(caps->binaryPath); + + G_OBJECT_CLASS(dnsmasq_caps_parent_class)->finalize(obj); } -static int dnsmasqCapsOnceInit(void) +static void +dnsmasq_caps_init(dnsmasqCaps *caps G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(dnsmasqCaps, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(dnsmasqCaps); +static void +dnsmasq_caps_class_init(dnsmasqCapsClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = dnsmasqCapsFinalize; +} static void dnsmasqCapsSet(dnsmasqCapsPtr caps, @@ -764,65 +769,54 @@ dnsmasqCapsRefreshInternal(dnsmasqCapsPtr caps, bool force) static dnsmasqCapsPtr dnsmasqCapsNewEmpty(const char *binaryPath) { - dnsmasqCapsPtr caps; - - if (dnsmasqCapsInitialize() < 0) - return NULL; - if (!(caps = virObjectNew(dnsmasqCapsClass))) - return NULL; + g_autoptr(dnsmasqCaps) caps = + DNSMASQ_CAPS(g_object_new(DNSMASQ_TYPE_CAPS, NULL)); if (!(caps->flags = virBitmapNew(DNSMASQ_CAPS_LAST))) - goto error; + return NULL; caps->binaryPath = g_strdup(binaryPath ? binaryPath : DNSMASQ); - return caps; - - error: - virObjectUnref(caps); - return NULL; + return g_steal_pointer(&caps); } dnsmasqCapsPtr dnsmasqCapsNewFromBuffer(const char *buf, const char *binaryPath) { - dnsmasqCapsPtr caps = dnsmasqCapsNewEmpty(binaryPath); + g_autoptr(dnsmasqCaps) caps = dnsmasqCapsNewEmpty(binaryPath); if (!caps) return NULL; if (dnsmasqCapsSetFromBuffer(caps, buf) < 0) { - virObjectUnref(caps); return NULL; } - return caps; + return g_steal_pointer(&caps); } dnsmasqCapsPtr dnsmasqCapsNewFromFile(const char *dataPath, const char *binaryPath) { - dnsmasqCapsPtr caps = dnsmasqCapsNewEmpty(binaryPath); + g_autoptr(dnsmasqCaps) caps = dnsmasqCapsNewEmpty(binaryPath); if (!caps) return NULL; if (dnsmasqCapsSetFromFile(caps, dataPath) < 0) { - virObjectUnref(caps); return NULL; } - return caps; + return g_steal_pointer(&caps); } dnsmasqCapsPtr dnsmasqCapsNewFromBinary(const char *binaryPath) { - dnsmasqCapsPtr caps = dnsmasqCapsNewEmpty(binaryPath); + g_autoptr(dnsmasqCaps) caps = dnsmasqCapsNewEmpty(binaryPath); if (!caps) return NULL; if (dnsmasqCapsRefreshInternal(caps, true) < 0) { - virObjectUnref(caps); return NULL; } - return caps; + return g_steal_pointer(&caps); } /** dnsmasqCapsRefresh: diff --git a/src/util/virdnsmasq.h b/src/util/virdnsmasq.h index ff0e56d635..9cbbd5562d 100644 --- a/src/util/virdnsmasq.h +++ b/src/util/virdnsmasq.h @@ -23,7 +23,8 @@ #pragma once -#include "virobject.h" +#include "internal.h" +#include <glib-object.h> #include "virsocketaddr.h" typedef struct @@ -75,7 +76,8 @@ typedef enum { DNSMASQ_CAPS_LAST, /* this must always be the last item */ } dnsmasqCapsFlags; -typedef struct _dnsmasqCaps dnsmasqCaps; +#define DNSMASQ_TYPE_CAPS dnsmasq_caps_get_type() +G_DECLARE_FINAL_TYPE(dnsmasqCaps, dnsmasq_caps, DNSMASQ, CAPS, GObject); typedef dnsmasqCaps *dnsmasqCapsPtr; diff --git a/tests/networkxml2conftest.c b/tests/networkxml2conftest.c index a8355272b9..ed3a2cf6ae 100644 --- a/tests/networkxml2conftest.c +++ b/tests/networkxml2conftest.c @@ -101,11 +101,11 @@ static int mymain(void) { int ret = 0; - dnsmasqCapsPtr restricted + g_autoptr(dnsmasqCaps) restricted = dnsmasqCapsNewFromBuffer("Dnsmasq version 2.48", DNSMASQ); - dnsmasqCapsPtr full + g_autoptr(dnsmasqCaps) full = dnsmasqCapsNewFromBuffer("Dnsmasq version 2.63\n--bind-dynamic", DNSMASQ); - dnsmasqCapsPtr dhcpv6 + g_autoptr(dnsmasqCaps) dhcpv6 = dnsmasqCapsNewFromBuffer("Dnsmasq version 2.64\n--bind-dynamic", DNSMASQ); #define DO_TEST(xname, xcaps) \ @@ -143,10 +143,6 @@ mymain(void) DO_TEST("ptr-domains-auto", dhcpv6); DO_TEST("dnsmasq-options", dhcpv6); - virObjectUnref(dhcpv6); - virObjectUnref(full); - virObjectUnref(restricted); - return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/domain_conf.c | 35 ++++++++++++++++------------------- src/conf/domain_conf.h | 9 ++++++++- src/qemu/qemu_domain.c | 7 ++++--- src/qemu/qemu_process.c | 3 +-- src/qemu/qemu_virtiofs.c | 12 +++++------- 5 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 38a0c04c1f..a29e6681a5 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2421,8 +2421,7 @@ virDomainNetDefClear(virDomainNetDefPtr def) switch (def->type) { case VIR_DOMAIN_NET_TYPE_VHOSTUSER: - virObjectUnref(def->data.vhostuser); - def->data.vhostuser = NULL; + g_clear_object(&def->data.vhostuser); break; case VIR_DOMAIN_NET_TYPE_SERVER: @@ -2497,6 +2496,7 @@ virDomainNetDefFree(virDomainNetDefPtr def) VIR_FREE(def); } +G_DEFINE_TYPE(virDomainChrSourceDef, vir_domain_chr_source_def, G_TYPE_OBJECT); const char * virDomainChrSourceDefGetPath(virDomainChrSourceDefPtr chr) @@ -2629,9 +2629,9 @@ virDomainChrSourceDefCopy(virDomainChrSourceDefPtr dest, } static void -virDomainChrSourceDefDispose(void *obj) +virDomainChrSourceDefFinalize(GObject *obj) { - virDomainChrSourceDefPtr def = obj; + virDomainChrSourceDefPtr def = VIR_DOMAIN_CHR_SOURCE_DEF(obj); size_t i; virDomainChrSourceDefClear(def); @@ -2642,6 +2642,8 @@ virDomainChrSourceDefDispose(void *obj) virSecurityDeviceLabelDefFree(def->seclabels[i]); VIR_FREE(def->seclabels); } + + G_OBJECT_CLASS(vir_domain_chr_source_def_parent_class)->finalize(obj); } @@ -13215,34 +13217,29 @@ virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def, } -static virClassPtr virDomainChrSourceDefClass; +static void +vir_domain_chr_source_def_init(virDomainChrSourceDef *def G_GNUC_UNUSED) +{ +} -static int -virDomainChrSourceDefOnceInit(void) +static void +vir_domain_chr_source_def_class_init(virDomainChrSourceDefClass *klass) { - if (!VIR_CLASS_NEW(virDomainChrSourceDef, virClassForObject())) - return -1; + GObjectClass *obj = G_OBJECT_CLASS(klass); - return 0; + obj->finalize = virDomainChrSourceDefFinalize; } -VIR_ONCE_GLOBAL_INIT(virDomainChrSourceDef); - virDomainChrSourceDefPtr virDomainChrSourceDefNew(virDomainXMLOptionPtr xmlopt) { virDomainChrSourceDefPtr def = NULL; - if (virDomainChrSourceDefInitialize() < 0) - return NULL; - - if (!(def = virObjectNew(virDomainChrSourceDefClass))) - return NULL; + def = VIR_DOMAIN_CHR_SOURCE_DEF(g_object_new(VIR_TYPE_DOMAIN_CHR_SOURCE_DEF, NULL)); if (xmlopt && xmlopt->privateData.chrSourceNew && !(def->privateData = xmlopt->privateData.chrSourceNew())) { - virObjectUnref(def); - def = NULL; + g_clear_object(&def); } return def; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 7e2792ae62..b6b2a72dd4 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1173,7 +1173,7 @@ struct _virDomainChrSourceReconnectDef { /* The host side information for a character device. */ struct _virDomainChrSourceDef { - virObject parent; + GObject parent; int type; /* virDomainChrType */ virObjectPtr privateData; union { @@ -1219,6 +1219,13 @@ struct _virDomainChrSourceDef { virSecurityDeviceLabelDefPtr *seclabels; }; +#define VIR_TYPE_DOMAIN_CHR_SOURCE_DEF vir_domain_chr_source_def_get_type() +G_DECLARE_FINAL_TYPE(virDomainChrSourceDef, + vir_domain_chr_source_def, + VIR, + DOMAIN_CHR_SOURCE_DEF, + GObject); + /* A complete character device, both host and domain views. */ struct _virDomainChrDef { int deviceType; /* enum virDomainChrDeviceType */ diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 32dd69892a..2506fa2eea 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2315,7 +2315,8 @@ qemuDomainObjPrivateFree(void *data) qemuDomainObjPrivateDataClear(priv); - virObjectUnref(priv->monConfig); + if (priv->monConfig) + g_object_unref(priv->monConfig); qemuDomainObjFreeJob(priv); VIR_FREE(priv->lockState); VIR_FREE(priv->origname); @@ -3934,8 +3935,8 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, error: virBitmapFree(priv->namespaces); priv->namespaces = NULL; - virObjectUnref(priv->monConfig); - priv->monConfig = NULL; + if (priv->monConfig) + g_clear_object(&priv->monConfig); virStringListFree(priv->qemuDevices); priv->qemuDevices = NULL; return -1; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index ef34dd8cfd..817e858ac2 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7390,8 +7390,7 @@ void qemuProcessStop(virQEMUDriverPtr driver, if (priv->monConfig) { if (priv->monConfig->type == VIR_DOMAIN_CHR_TYPE_UNIX) unlink(priv->monConfig->data.nix.path); - virObjectUnref(priv->monConfig); - priv->monConfig = NULL; + g_clear_object(&priv->monConfig); } qemuDomainObjStopWorker(vm); diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c index 2e239cad66..483af5c798 100644 --- a/src/qemu/qemu_virtiofs.c +++ b/src/qemu/qemu_virtiofs.c @@ -80,7 +80,7 @@ qemuVirtioFSOpenChardev(virQEMUDriverPtr driver, virDomainObjPtr vm, const char *socket_path) { - virDomainChrSourceDefPtr chrdev = virDomainChrSourceDefNew(NULL); + g_autoptr(virDomainChrSourceDef) chrdev = virDomainChrSourceDefNew(NULL); virDomainChrDef chr = { .source = chrdev }; VIR_AUTOCLOSE fd = -1; int ret = -1; @@ -90,23 +90,21 @@ qemuVirtioFSOpenChardev(virQEMUDriverPtr driver, chrdev->data.nix.path = g_strdup(socket_path); if (qemuSecuritySetDaemonSocketLabel(driver->securityManager, vm->def) < 0) - goto cleanup; + return ret; fd = qemuOpenChrChardevUNIXSocket(chrdev); if (fd < 0) { ignore_value(qemuSecurityClearSocketLabel(driver->securityManager, vm->def)); - goto cleanup; + return ret; } if (qemuSecurityClearSocketLabel(driver->securityManager, vm->def) < 0) - goto cleanup; + return ret; if (qemuSecuritySetChardevLabel(driver, vm, &chr) < 0) - goto cleanup; + return ret; ret = fd; fd = -1; - cleanup: - virObjectUnref(chrdev); return ret; } -- 2.25.1

On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/domain_conf.c | 35 ++++++++++++++++------------------- src/conf/domain_conf.h | 9 ++++++++- src/qemu/qemu_domain.c | 7 ++++--- src/qemu/qemu_process.c | 3 +-- src/qemu/qemu_virtiofs.c | 12 +++++------- 5 files changed, 34 insertions(+), 32 deletions(-)
[snip]
-VIR_ONCE_GLOBAL_INIT(virDomainChrSourceDef); - virDomainChrSourceDefPtr virDomainChrSourceDefNew(virDomainXMLOptionPtr xmlopt) { virDomainChrSourceDefPtr def = NULL;
In analogous *New() functions in previous patches you've used the g_autoptr/g_steal_pointer approach. Consider using it here as well.
- if (virDomainChrSourceDefInitialize() < 0) - return NULL; - - if (!(def = virObjectNew(virDomainChrSourceDefClass))) - return NULL; + def = VIR_DOMAIN_CHR_SOURCE_DEF(g_object_new(VIR_TYPE_DOMAIN_CHR_SOURCE_DEF , NULL));
if (xmlopt && xmlopt->privateData.chrSourceNew && !(def->privateData = xmlopt->privateData.chrSourceNew())) { - virObjectUnref(def); - def = NULL; + g_clear_object(&def);
Then you could just directly return NULL here.
}
return def;
Jonathon

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/admin/libvirt-admin.c | 2 +- src/admin/libvirt_admin_private.syms | 1 - src/datatypes.c | 42 ++++++++++++++++++---------- src/datatypes.h | 20 +++++++------ 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/admin/libvirt-admin.c b/src/admin/libvirt-admin.c index 835b5560d2..ed7a57cbbb 100644 --- a/src/admin/libvirt-admin.c +++ b/src/admin/libvirt-admin.c @@ -586,7 +586,7 @@ int virAdmServerFree(virAdmServerPtr srv) virCheckAdmServerReturn(srv, -1); - virObjectUnref(srv); + g_object_unref(srv); return 0; } diff --git a/src/admin/libvirt_admin_private.syms b/src/admin/libvirt_admin_private.syms index 157a45341e..270fa43995 100644 --- a/src/admin/libvirt_admin_private.syms +++ b/src/admin/libvirt_admin_private.syms @@ -40,7 +40,6 @@ virAdmConnectCloseCallbackDataRegister; virAdmConnectCloseCallbackDataReset; virAdmConnectCloseCallbackDataUnregister; virAdmGetServer; -virAdmServerClass; # Let emacs know we want case-insensitive sorting # Local Variables: diff --git a/src/datatypes.c b/src/datatypes.c index 552115c7a3..d6afaf89ad 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -71,11 +71,25 @@ virClassPtr virAdmConnectCloseCallbackDataClass; static void virAdmConnectDispose(void *obj); static void virAdmConnectCloseCallbackDataDispose(void *obj); -virClassPtr virAdmServerClass; virClassPtr virAdmClientClass; -static void virAdmServerDispose(void *obj); static void virAdmClientDispose(void *obj); +G_DEFINE_TYPE(virAdmServer, vir_adm_server, G_TYPE_OBJECT); +static void virAdmServerFinalize(GObject *obj); + +static void +vir_adm_server_init(virAdmServer *srv G_GNUC_UNUSED) +{ +} + +static void +vir_adm_server_class_init(virAdmServerClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virAdmServerFinalize; +} + static int virDataTypesOnceInit(void) { @@ -105,7 +119,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virAdmConnect); DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData); - DECLARE_CLASS(virAdmServer); DECLARE_CLASS(virAdmClient); #undef DECLARE_CLASS_COMMON @@ -1173,31 +1186,30 @@ virAdmConnectCloseCallbackDataRegister(virAdmConnectCloseCallbackDataPtr cbdata, virAdmServerPtr virAdmGetServer(virAdmConnectPtr conn, const char *name) { - virAdmServerPtr ret = NULL; + g_autoptr(virAdmServer) ret = NULL; if (virDataTypesInitialize() < 0) - goto error; + return NULL; + + ret = VIR_ADM_SERVER(g_object_new(VIR_TYPE_ADM_SERVER, NULL)); - if (!(ret = virObjectNew(virAdmServerClass))) - goto error; ret->name = g_strdup(name); ret->conn = virObjectRef(conn); - return ret; - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } static void -virAdmServerDispose(void *obj) +virAdmServerFinalize(GObject *obj) { - virAdmServerPtr srv = obj; + virAdmServerPtr srv = VIR_ADM_SERVER(obj); VIR_DEBUG("release server srv=%p name=%s", srv, srv->name); VIR_FREE(srv->name); virObjectUnref(srv->conn); + + G_OBJECT_CLASS(vir_adm_server_parent_class)->finalize(obj); } virAdmClientPtr @@ -1215,7 +1227,7 @@ virAdmGetClient(virAdmServerPtr srv, const unsigned long long id, ret->id = id; ret->timestamp = timestamp; ret->transport = transport; - ret->srv = virObjectRef(srv); + ret->srv = g_object_ref(srv); return ret; error: @@ -1229,5 +1241,5 @@ virAdmClientDispose(void *obj) virAdmClientPtr clt = obj; VIR_DEBUG("release client clt=%p, id=%llu", clt, clt->id); - virObjectUnref(clt->srv); + g_object_unref(clt->srv); } diff --git a/src/datatypes.h b/src/datatypes.h index 2d0407f7ec..20b64ca788 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -28,6 +28,8 @@ #include "virobject.h" #include "viruuid.h" +#include <glib-object.h> + extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; extern virClassPtr virDomainCheckpointClass; @@ -44,9 +46,11 @@ extern virClassPtr virStorageVolClass; extern virClassPtr virStoragePoolClass; extern virClassPtr virAdmConnectClass; -extern virClassPtr virAdmServerClass; extern virClassPtr virAdmClientClass; +#define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() +G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, ADM_SERVER, GObject); + #define virCheckConnectReturn(obj, retval) \ do { \ if (!virObjectIsClass(obj, virConnectClass)) { \ @@ -419,8 +423,8 @@ extern virClassPtr virAdmClientClass; #define virCheckAdmServerReturn(obj, retval) \ do { \ - virAdmServerPtr _srv = (obj); \ - if (!virObjectIsClass(_srv, virAdmServerClass) || \ + virAdmServerPtr _srv = VIR_ADM_SERVER(obj); \ + if (!G_IS_OBJECT(_srv) || !(G_OBJECT_TYPE(_srv) == VIR_TYPE_ADM_SERVER) || \ !virObjectIsClass(_srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -431,8 +435,8 @@ extern virClassPtr virAdmClientClass; } while (0) #define virCheckAdmServerGoto(obj, label) \ do { \ - virAdmServerPtr _srv = (obj); \ - if (!virObjectIsClass(_srv, virAdmServerClass) || \ + virAdmServerPtr _srv = VIR_ADM_SERVER(obj); \ + if (!G_IS_OBJECT(_srv) || !(G_OBJECT_TYPE(_srv) == VIR_TYPE_ADM_SERVER) || \ !virObjectIsClass(_srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -445,7 +449,7 @@ extern virClassPtr virAdmClientClass; do { \ virAdmClientPtr _clt = (obj); \ if (!virObjectIsClass(_clt, virAdmClientClass) || \ - !virObjectIsClass(_clt->srv, virAdmServerClass) || \ + !G_IS_OBJECT(_clt->srv) || !(G_OBJECT_TYPE(_clt->srv) == VIR_TYPE_ADM_SERVER) || \ !virObjectIsClass(_clt->srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -458,7 +462,7 @@ extern virClassPtr virAdmClientClass; do { \ virAdmClientPtr _clt = (obj); \ if (!virObjectIsClass(_clt, virAdmClientClass) || \ - !virObjectIsClass(_clt->srv, virAdmServerClass) || \ + !G_IS_OBJECT(_clt->srv) || !(G_OBJECT_TYPE(_clt->srv) == VIR_TYPE_ADM_SERVER) || \ !virObjectIsClass(_clt->srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -573,7 +577,7 @@ struct _virAdmConnect { * Internal structure associated to a daemon server */ struct _virAdmServer { - virObject parent; + GObject parent; virAdmConnectPtr conn; /* pointer back to the admin connection */ char *name; /* the server external name */ }; -- 2.25.1

On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/admin/libvirt-admin.c | 2 +- src/admin/libvirt_admin_private.syms | 1 - src/datatypes.c | 42 ++++++++++++++++++------ ---- src/datatypes.h | 20 +++++++------ 4 files changed, 40 insertions(+), 25 deletions(-)
[snip]
@@ -44,9 +46,11 @@ extern virClassPtr virStorageVolClass; extern virClassPtr virStoragePoolClass;
extern virClassPtr virAdmConnectClass; -extern virClassPtr virAdmServerClass; extern virClassPtr virAdmClientClass;
+#define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() +G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, ADM_SERVER, GObject); + #define virCheckConnectReturn(obj, retval) \ do { \ if (!virObjectIsClass(obj, virConnectClass)) { \ @@ -419,8 +423,8 @@ extern virClassPtr virAdmClientClass;
#define virCheckAdmServerReturn(obj, retval) \ do { \ - virAdmServerPtr _srv = (obj); \ - if (!virObjectIsClass(_srv, virAdmServerClass) || \ + virAdmServerPtr _srv = VIR_ADM_SERVER(obj); \ + if (!G_IS_OBJECT(_srv) || !(G_OBJECT_TYPE(_srv) == VIR_TYPE_ADM_SERVER) || \
This additional check is unnecessary with GObject. The VIR_ADM_SERVER() casting macro that is provided by G_DECLARE_FINAL_TYPE() does this internally. This function already checks that the type of obj is correct and castable. If the pointer is not castable to the type, it emits a warning and returns NULL. So you can just check for (_srv == NULL).
!virObjectIsClass(_srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -431,8 +435,8 @@ extern virClassPtr virAdmClientClass; } while (0) #define virCheckAdmServerGoto(obj, label) \ do { \ - virAdmServerPtr _srv = (obj); \ - if (!virObjectIsClass(_srv, virAdmServerClass) || \ + virAdmServerPtr _srv = VIR_ADM_SERVER(obj); \ + if (!G_IS_OBJECT(_srv) || !(G_OBJECT_TYPE(_srv) == VIR_TYPE_ADM_SERVER) || \
same here
!virObjectIsClass(_srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -445,7 +449,7 @@ extern virClassPtr virAdmClientClass; do { \ virAdmClientPtr _clt = (obj); \ if (!virObjectIsClass(_clt, virAdmClientClass) || \ - !virObjectIsClass(_clt->srv, virAdmServerClass) || \ + !G_IS_OBJECT(_clt->srv) || !(G_OBJECT_TYPE(_clt->srv) == VIR_TYPE_ADM_SERVER) || \
Here you should be able to use the macro VIR_IS_ADM_SERVER() that is automatically provided by G_DECLARE_FINAL_TYPE().
!virObjectIsClass(_clt->srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -458,7 +462,7 @@ extern virClassPtr virAdmClientClass; do { \ virAdmClientPtr _clt = (obj); \ if (!virObjectIsClass(_clt, virAdmClientClass) || \ - !virObjectIsClass(_clt->srv, virAdmServerClass) || \ + !G_IS_OBJECT(_clt->srv) || !(G_OBJECT_TYPE(_clt->srv) == VIR_TYPE_ADM_SERVER) || \
same here
!virObjectIsClass(_clt->srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -573,7 +577,7 @@ struct _virAdmConnect { * Internal structure associated to a daemon server */ struct _virAdmServer { - virObject parent; + GObject parent; virAdmConnectPtr conn; /* pointer back to the admin connection */ char *name; /* the server external name */ };

On Wed, Apr 8, 2020 at 10:47 PM Jonathon Jongsma <jjongsma@redhat.com> wrote:
On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
#define virCheckAdmServerReturn(obj, retval) \ do { \ - virAdmServerPtr _srv = (obj); \ - if (!virObjectIsClass(_srv, virAdmServerClass) || \ + virAdmServerPtr _srv = VIR_ADM_SERVER(obj); \ + if (!G_IS_OBJECT(_srv) || !(G_OBJECT_TYPE(_srv) == VIR_TYPE_ADM_SERVER) || \
This additional check is unnecessary with GObject. The VIR_ADM_SERVER() casting macro that is provided by G_DECLARE_FINAL_TYPE() does this internally. This function already checks that the type of obj is correct and castable. If the pointer is not castable to the type, it emits a warning and returns NULL. So you can just check for (_srv == NULL).
Thank you for the reviews and comments! I'm afraid all the patches related to `datatypes.c` will have this same problem. They'll be fixed in v2. Att. -- Rafael Fonseca

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/admin/libvirt-admin.c | 2 +- src/admin/libvirt_admin_private.syms | 1 - src/datatypes.c | 36 ++++++++++++++++++---------- src/datatypes.h | 13 +++++----- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/admin/libvirt-admin.c b/src/admin/libvirt-admin.c index ed7a57cbbb..6f86de4360 100644 --- a/src/admin/libvirt-admin.c +++ b/src/admin/libvirt-admin.c @@ -676,7 +676,7 @@ int virAdmClientFree(virAdmClientPtr client) virCheckAdmClientReturn(client, -1); - virObjectUnref(client); + g_object_unref(client); return 0; } diff --git a/src/admin/libvirt_admin_private.syms b/src/admin/libvirt_admin_private.syms index 270fa43995..9ba4b68932 100644 --- a/src/admin/libvirt_admin_private.syms +++ b/src/admin/libvirt_admin_private.syms @@ -34,7 +34,6 @@ xdr_admin_server_set_threadpool_parameters_args; xdr_admin_server_update_tls_files_args; # datatypes.h -virAdmClientClass; virAdmConnectClass; virAdmConnectCloseCallbackDataRegister; virAdmConnectCloseCallbackDataReset; diff --git a/src/datatypes.c b/src/datatypes.c index d6afaf89ad..68fc216ffa 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -71,8 +71,21 @@ virClassPtr virAdmConnectCloseCallbackDataClass; static void virAdmConnectDispose(void *obj); static void virAdmConnectCloseCallbackDataDispose(void *obj); -virClassPtr virAdmClientClass; -static void virAdmClientDispose(void *obj); +G_DEFINE_TYPE(virAdmClient, vir_adm_client, G_TYPE_OBJECT); +static void virAdmClientFinalize(GObject *obj); + +static void +vir_adm_client_init(virAdmClient *clt G_GNUC_UNUSED) +{ +} + +static void +vir_adm_client_class_init(virAdmClientClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virAdmClientFinalize; +} G_DEFINE_TYPE(virAdmServer, vir_adm_server, G_TYPE_OBJECT); static void virAdmServerFinalize(GObject *obj); @@ -119,7 +132,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virAdmConnect); DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData); - DECLARE_CLASS(virAdmClient); #undef DECLARE_CLASS_COMMON #undef DECLARE_CLASS_LOCKABLE @@ -1216,30 +1228,28 @@ virAdmClientPtr virAdmGetClient(virAdmServerPtr srv, const unsigned long long id, unsigned long long timestamp, unsigned int transport) { - virAdmClientPtr ret = NULL; + g_autoptr(virAdmClient) ret = NULL; if (virDataTypesInitialize() < 0) - goto error; + return NULL; - if (!(ret = virObjectNew(virAdmClientClass))) - goto error; + ret = VIR_ADM_CLIENT(g_object_new(VIR_TYPE_ADM_CLIENT, NULL)); ret->id = id; ret->timestamp = timestamp; ret->transport = transport; ret->srv = g_object_ref(srv); - return ret; - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } static void -virAdmClientDispose(void *obj) +virAdmClientFinalize(GObject *obj) { - virAdmClientPtr clt = obj; + virAdmClientPtr clt = VIR_ADM_CLIENT(obj); VIR_DEBUG("release client clt=%p, id=%llu", clt, clt->id); g_object_unref(clt->srv); + + G_OBJECT_CLASS(vir_adm_client_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index 20b64ca788..4e9f338f8b 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -46,10 +46,11 @@ extern virClassPtr virStorageVolClass; extern virClassPtr virStoragePoolClass; extern virClassPtr virAdmConnectClass; -extern virClassPtr virAdmClientClass; #define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, ADM_SERVER, GObject); +#define VIR_TYPE_ADM_CLIENT vir_adm_client_get_type() +G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckConnectReturn(obj, retval) \ do { \ @@ -447,8 +448,8 @@ G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, ADM_SERVER, GObject); #define virCheckAdmClientReturn(obj, retval) \ do { \ - virAdmClientPtr _clt = (obj); \ - if (!virObjectIsClass(_clt, virAdmClientClass) || \ + virAdmClientPtr _clt = VIR_ADM_CLIENT(obj); \ + if (!G_IS_OBJECT(_clt) || !(G_OBJECT_TYPE(_clt) == VIR_TYPE_ADM_CLIENT) || \ !G_IS_OBJECT(_clt->srv) || !(G_OBJECT_TYPE(_clt->srv) == VIR_TYPE_ADM_SERVER) || \ !virObjectIsClass(_clt->srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ @@ -460,8 +461,8 @@ G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, ADM_SERVER, GObject); } while (0) #define virCheckAdmClientGoto(obj, label) \ do { \ - virAdmClientPtr _clt = (obj); \ - if (!virObjectIsClass(_clt, virAdmClientClass) || \ + virAdmClientPtr _clt = VIR_ADM_CLIENT(obj); \ + if (!G_IS_OBJECT(_clt) || !(G_OBJECT_TYPE(_clt) == VIR_TYPE_ADM_CLIENT) || \ !G_IS_OBJECT(_clt->srv) || !(G_OBJECT_TYPE(_clt->srv) == VIR_TYPE_ADM_SERVER) || \ !virObjectIsClass(_clt->srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ @@ -588,7 +589,7 @@ struct _virAdmServer { * Internal structure associated to a client connected to daemon */ struct _virAdmClient { - virObject parent; + GObject parent; virAdmServerPtr srv; /* pointer to the server client is * connected to, which also holds a * reference back to the admin connection -- 2.25.1

On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/admin/libvirt-admin.c | 2 +- src/admin/libvirt_admin_private.syms | 1 - src/datatypes.c | 36 ++++++++++++++++++------ ---- src/datatypes.h | 13 +++++----- 4 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/src/admin/libvirt-admin.c b/src/admin/libvirt-admin.c index ed7a57cbbb..6f86de4360 100644 --- a/src/admin/libvirt-admin.c +++ b/src/admin/libvirt-admin.c @@ -676,7 +676,7 @@ int virAdmClientFree(virAdmClientPtr client)
virCheckAdmClientReturn(client, -1);
- virObjectUnref(client); + g_object_unref(client); return 0; }
diff --git a/src/admin/libvirt_admin_private.syms b/src/admin/libvirt_admin_private.syms index 270fa43995..9ba4b68932 100644 --- a/src/admin/libvirt_admin_private.syms +++ b/src/admin/libvirt_admin_private.syms @@ -34,7 +34,6 @@ xdr_admin_server_set_threadpool_parameters_args; xdr_admin_server_update_tls_files_args;
# datatypes.h -virAdmClientClass; virAdmConnectClass; virAdmConnectCloseCallbackDataRegister; virAdmConnectCloseCallbackDataReset; diff --git a/src/datatypes.c b/src/datatypes.c index d6afaf89ad..68fc216ffa 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -71,8 +71,21 @@ virClassPtr virAdmConnectCloseCallbackDataClass; static void virAdmConnectDispose(void *obj); static void virAdmConnectCloseCallbackDataDispose(void *obj);
-virClassPtr virAdmClientClass; -static void virAdmClientDispose(void *obj); +G_DEFINE_TYPE(virAdmClient, vir_adm_client, G_TYPE_OBJECT); +static void virAdmClientFinalize(GObject *obj); + +static void +vir_adm_client_init(virAdmClient *clt G_GNUC_UNUSED) +{ +} + +static void +vir_adm_client_class_init(virAdmClientClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virAdmClientFinalize; +}
G_DEFINE_TYPE(virAdmServer, vir_adm_server, G_TYPE_OBJECT); static void virAdmServerFinalize(GObject *obj); @@ -119,7 +132,6 @@ virDataTypesOnceInit(void)
DECLARE_CLASS_LOCKABLE(virAdmConnect); DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData); - DECLARE_CLASS(virAdmClient);
#undef DECLARE_CLASS_COMMON #undef DECLARE_CLASS_LOCKABLE @@ -1216,30 +1228,28 @@ virAdmClientPtr virAdmGetClient(virAdmServerPtr srv, const unsigned long long id, unsigned long long timestamp, unsigned int transport) { - virAdmClientPtr ret = NULL; + g_autoptr(virAdmClient) ret = NULL;
if (virDataTypesInitialize() < 0) - goto error; + return NULL;
- if (!(ret = virObjectNew(virAdmClientClass))) - goto error; + ret = VIR_ADM_CLIENT(g_object_new(VIR_TYPE_ADM_CLIENT, NULL));
ret->id = id; ret->timestamp = timestamp; ret->transport = transport; ret->srv = g_object_ref(srv);
- return ret; - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); }
static void -virAdmClientDispose(void *obj) +virAdmClientFinalize(GObject *obj) { - virAdmClientPtr clt = obj; + virAdmClientPtr clt = VIR_ADM_CLIENT(obj); VIR_DEBUG("release client clt=%p, id=%llu", clt, clt->id);
g_object_unref(clt->srv); + + G_OBJECT_CLASS(vir_adm_client_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index 20b64ca788..4e9f338f8b 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -46,10 +46,11 @@ extern virClassPtr virStorageVolClass; extern virClassPtr virStoragePoolClass;
extern virClassPtr virAdmConnectClass; -extern virClassPtr virAdmClientClass;
#define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, ADM_SERVER, GObject); +#define VIR_TYPE_ADM_CLIENT vir_adm_client_get_type() +G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject);
#define virCheckConnectReturn(obj, retval) \ do { \ @@ -447,8 +448,8 @@ G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, ADM_SERVER, GObject);
#define virCheckAdmClientReturn(obj, retval) \ do { \ - virAdmClientPtr _clt = (obj); \ - if (!virObjectIsClass(_clt, virAdmClientClass) || \ + virAdmClientPtr _clt = VIR_ADM_CLIENT(obj); \ + if (!G_IS_OBJECT(_clt) || !(G_OBJECT_TYPE(_clt) == VIR_TYPE_ADM_CLIENT) || \
Same comments here about the casting macro as in the previous patch.
!G_IS_OBJECT(_clt->srv) || !(G_OBJECT_TYPE(_clt->srv) == VIR_TYPE_ADM_SERVER) || \ !virObjectIsClass(_clt->srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ @@ -460,8 +461,8 @@ G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, ADM_SERVER, GObject); } while (0) #define virCheckAdmClientGoto(obj, label) \ do { \ - virAdmClientPtr _clt = (obj); \ - if (!virObjectIsClass(_clt, virAdmClientClass) || \ + virAdmClientPtr _clt = VIR_ADM_CLIENT(obj); \ + if (!G_IS_OBJECT(_clt) || !(G_OBJECT_TYPE(_clt) == VIR_TYPE_ADM_CLIENT) || \ !G_IS_OBJECT(_clt->srv) || !(G_OBJECT_TYPE(_clt->srv) == VIR_TYPE_ADM_SERVER) || \ !virObjectIsClass(_clt->srv->conn, virAdmConnectClass)) { \ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \ @@ -588,7 +589,7 @@ struct _virAdmServer { * Internal structure associated to a client connected to daemon */ struct _virAdmClient { - virObject parent; + GObject parent; virAdmServerPtr srv; /* pointer to the server client is * connected to, which also holds a * reference back to the admin connection

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/virdomaincheckpointobjlist.c | 6 ++-- src/datatypes.c | 44 ++++++++++++++++----------- src/datatypes.h | 14 ++++++--- src/libvirt-domain-checkpoint.c | 7 ++--- src/libvirt_private.syms | 1 - 5 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/conf/virdomaincheckpointobjlist.c b/src/conf/virdomaincheckpointobjlist.c index a4942ea706..5c457dc876 100644 --- a/src/conf/virdomaincheckpointobjlist.c +++ b/src/conf/virdomaincheckpointobjlist.c @@ -235,8 +235,10 @@ virDomainListCheckpoints(virDomainCheckpointObjListPtr checkpoints, VIR_FREE(names[i]); VIR_FREE(names); if (ret < 0 && list) { - for (i = 0; i < count; i++) - virObjectUnref(list[i]); + for (i = 0; i < count; i++) { + if (list[i]) + g_object_unref(list[i]); + } VIR_FREE(list); } return ret; diff --git a/src/datatypes.c b/src/datatypes.c index 68fc216ffa..1e0861aa5f 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -36,7 +36,6 @@ VIR_LOG_INIT("datatypes"); virClassPtr virConnectClass; virClassPtr virConnectCloseCallbackDataClass; virClassPtr virDomainClass; -virClassPtr virDomainCheckpointClass; virClassPtr virDomainSnapshotClass; virClassPtr virInterfaceClass; virClassPtr virNetworkClass; @@ -52,7 +51,6 @@ virClassPtr virStoragePoolClass; static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); static void virDomainDispose(void *obj); -static void virDomainCheckpointDispose(void *obj); static void virDomainSnapshotDispose(void *obj); static void virInterfaceDispose(void *obj); static void virNetworkDispose(void *obj); @@ -65,6 +63,22 @@ static void virStreamDispose(void *obj); static void virStorageVolDispose(void *obj); static void virStoragePoolDispose(void *obj); +G_DEFINE_TYPE(virDomainCheckpoint, vir_domain_checkpoint, G_TYPE_OBJECT); +static void virDomainCheckpointFinalize(GObject *obj); + +static void +vir_domain_checkpoint_init(virDomainCheckpoint *dc G_GNUC_UNUSED) +{ +} + +static void +vir_domain_checkpoint_class_init(virDomainCheckpointClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virDomainCheckpointFinalize; +} + virClassPtr virAdmConnectClass; virClassPtr virAdmConnectCloseCallbackDataClass; @@ -117,7 +131,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virConnect); DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData); DECLARE_CLASS(virDomain); - DECLARE_CLASS(virDomainCheckpoint); DECLARE_CLASS(virDomainSnapshot); DECLARE_CLASS(virInterface); DECLARE_CLASS(virNetwork); @@ -984,7 +997,7 @@ virNWFilterBindingDispose(void *obj) * @name: pointer to the domain checkpoint name * * Allocates a new domain checkpoint object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the domain checkpoint object, or NULL on error. */ @@ -992,30 +1005,25 @@ virDomainCheckpointPtr virGetDomainCheckpoint(virDomainPtr domain, const char *name) { - virDomainCheckpointPtr ret = NULL; + g_autoptr(virDomainCheckpoint) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; - virCheckDomainGoto(domain, error); - virCheckNonNullArgGoto(name, error); + virCheckDomainReturn(domain, NULL); + virCheckNonNullArgReturn(name, NULL); - if (!(ret = virObjectNew(virDomainCheckpointClass))) - goto error; + ret = VIR_DOMAIN_CHECKPOINT(g_object_new(VIR_TYPE_DOMAIN_CHECKPOINT, NULL)); ret->name = g_strdup(name); ret->domain = virObjectRef(domain); - return ret; - - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } /** - * virDomainCheckpointDispose: + * virDomainCheckpointFinalize: * @obj: the domain checkpoint to release * * Unconditionally release all memory associated with a checkpoint. @@ -1025,13 +1033,15 @@ virGetDomainCheckpoint(virDomainPtr domain, * which may also be released if its ref count hits zero. */ static void -virDomainCheckpointDispose(void *obj) +virDomainCheckpointFinalize(GObject *obj) { - virDomainCheckpointPtr checkpoint = obj; + virDomainCheckpointPtr checkpoint = VIR_DOMAIN_CHECKPOINT(obj); VIR_DEBUG("release checkpoint %p %s", checkpoint, checkpoint->name); VIR_FREE(checkpoint->name); virObjectUnref(checkpoint->domain); + + G_OBJECT_CLASS(vir_domain_checkpoint_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index 4e9f338f8b..13ad044126 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -32,7 +32,6 @@ extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; -extern virClassPtr virDomainCheckpointClass; extern virClassPtr virDomainSnapshotClass; extern virClassPtr virInterfaceClass; extern virClassPtr virNetworkClass; @@ -45,6 +44,13 @@ extern virClassPtr virStreamClass; extern virClassPtr virStorageVolClass; extern virClassPtr virStoragePoolClass; +#define VIR_TYPE_DOMAIN_CHECKPOINT vir_domain_checkpoint_get_type() +G_DECLARE_FINAL_TYPE(virDomainCheckpoint, + vir_domain_checkpoint, + VIR, + DOMAIN_CHECKPOINT, + GObject); + extern virClassPtr virAdmConnectClass; #define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -327,8 +333,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckDomainCheckpointReturn(obj, retval) \ do { \ - virDomainCheckpointPtr _check = (obj); \ - if (!virObjectIsClass(_check, virDomainCheckpointClass) || \ + virDomainCheckpointPtr _check = VIR_DOMAIN_CHECKPOINT(obj); \ + if (!G_IS_OBJECT(_check) || !(G_OBJECT_TYPE(_check) == VIR_TYPE_DOMAIN_CHECKPOINT) || \ !virObjectIsClass(_check->domain, virDomainClass) || \ !virObjectIsClass(_check->domain->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_DOMAIN_CHECKPOINT, \ @@ -749,7 +755,7 @@ struct _virStream { * Internal structure associated with a domain checkpoint */ struct _virDomainCheckpoint { - virObject parent; + GObject parent; char *name; virDomainPtr domain; }; diff --git a/src/libvirt-domain-checkpoint.c b/src/libvirt-domain-checkpoint.c index 432c2d5a52..77ef434d30 100644 --- a/src/libvirt-domain-checkpoint.c +++ b/src/libvirt-domain-checkpoint.c @@ -535,14 +535,13 @@ virDomainCheckpointDelete(virDomainCheckpointPtr checkpoint, int virDomainCheckpointRef(virDomainCheckpointPtr checkpoint) { - VIR_DEBUG("checkpoint=%p, refs=%d", checkpoint, - checkpoint ? checkpoint->parent.u.s.refs : 0); + VIR_DEBUG("checkpoint=%p", checkpoint); virResetLastError(); virCheckDomainCheckpointReturn(checkpoint, -1); - virObjectRef(checkpoint); + g_object_ref(checkpoint); return 0; } @@ -565,6 +564,6 @@ virDomainCheckpointFree(virDomainCheckpointPtr checkpoint) virCheckDomainCheckpointReturn(checkpoint, -1); - virObjectUnref(checkpoint); + g_object_unref(checkpoint); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index e276f55bb1..008d4fa08f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1349,7 +1349,6 @@ virConnectCloseCallbackDataClass; virConnectCloseCallbackDataGetCallback; virConnectCloseCallbackDataRegister; virConnectCloseCallbackDataUnregister; -virDomainCheckpointClass; virDomainClass; virDomainSnapshotClass; virGetConnect; -- 2.25.1

On Fri, Apr 3, 2020 at 5:16 PM Rafael Fonseca <r4f4rfs@gmail.com> wrote:
+#define VIR_TYPE_DOMAIN_CHECKPOINT vir_domain_checkpoint_get_type() +G_DECLARE_FINAL_TYPE(virDomainCheckpoint, + vir_domain_checkpoint, + VIR, + DOMAIN_CHECKPOINT, + GObject); + extern virClassPtr virAdmConnectClass;
#define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -327,8 +333,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject);
#define virCheckDomainCheckpointReturn(obj, retval) \ do { \ - virDomainCheckpointPtr _check = (obj); \ - if (!virObjectIsClass(_check, virDomainCheckpointClass) || \ + virDomainCheckpointPtr _check = VIR_DOMAIN_CHECKPOINT(obj); \ + if (!G_IS_OBJECT(_check) || !(G_OBJECT_TYPE(_check) == VIR_TYPE_DOMAIN_CHECKPOINT) || \
I guess `VIR_IS_DOMAIN_CHECKPOINT` created by `G_DECLARE_FINAL_TYPE` is enough here for this check? Att -- Rafael Fonseca

On Mon, Apr 06, 2020 at 09:50:59AM +0200, Rafael Fonseca wrote:
On Fri, Apr 3, 2020 at 5:16 PM Rafael Fonseca <r4f4rfs@gmail.com> wrote:
+#define VIR_TYPE_DOMAIN_CHECKPOINT vir_domain_checkpoint_get_type() +G_DECLARE_FINAL_TYPE(virDomainCheckpoint, + vir_domain_checkpoint, + VIR, + DOMAIN_CHECKPOINT, + GObject); + extern virClassPtr virAdmConnectClass;
#define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -327,8 +333,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject);
#define virCheckDomainCheckpointReturn(obj, retval) \ do { \ - virDomainCheckpointPtr _check = (obj); \ - if (!virObjectIsClass(_check, virDomainCheckpointClass) || \ + virDomainCheckpointPtr _check = VIR_DOMAIN_CHECKPOINT(obj); \ + if (!G_IS_OBJECT(_check) || !(G_OBJECT_TYPE(_check) == VIR_TYPE_DOMAIN_CHECKPOINT) || \
I guess `VIR_IS_DOMAIN_CHECKPOINT` created by `G_DECLARE_FINAL_TYPE` is enough here for this check?
Yes, we can slim this right now and avoid the casts / intermediate variable entirely, to just this I think: #define virCheckDomainCheckpointReturn(obj, retval) \ if (!VIR_IS_DOMAIN_CHECKPOINT(obj)) { \ return retval; \ } Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Mon, Apr 6, 2020 at 11:05 AM Daniel P. Berrangé <berrange@redhat.com> wrote:
On Mon, Apr 06, 2020 at 09:50:59AM +0200, Rafael Fonseca wrote:
On Fri, Apr 3, 2020 at 5:16 PM Rafael Fonseca <r4f4rfs@gmail.com> wrote:
+#define VIR_TYPE_DOMAIN_CHECKPOINT vir_domain_checkpoint_get_type() +G_DECLARE_FINAL_TYPE(virDomainCheckpoint, + vir_domain_checkpoint, + VIR, + DOMAIN_CHECKPOINT, + GObject); + extern virClassPtr virAdmConnectClass;
#define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -327,8 +333,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject);
#define virCheckDomainCheckpointReturn(obj, retval) \ do { \ - virDomainCheckpointPtr _check = (obj); \ - if (!virObjectIsClass(_check, virDomainCheckpointClass) || \ + virDomainCheckpointPtr _check = VIR_DOMAIN_CHECKPOINT(obj); \ + if (!G_IS_OBJECT(_check) || !(G_OBJECT_TYPE(_check) == VIR_TYPE_DOMAIN_CHECKPOINT) || \
I guess `VIR_IS_DOMAIN_CHECKPOINT` created by `G_DECLARE_FINAL_TYPE` is enough here for this check?
Yes, we can slim this right now and avoid the casts / intermediate variable entirely, to just this I think:
#define virCheckDomainCheckpointReturn(obj, retval) \ if (!VIR_IS_DOMAIN_CHECKPOINT(obj)) { \ return retval; \ }
That's much better. I'll do it for v2. Another issue with the changes in datatypes.c is that by converting the types separately, then `gendispatch.pl` generates wrong code (virObjectUnref for GObject). Is it acceptable to have them all changed in a single patch? Att. -- Rafael Fonseca

On Mon, Apr 06, 2020 at 01:32:39PM +0200, Rafael Fonseca wrote:
On Mon, Apr 6, 2020 at 11:05 AM Daniel P. Berrangé <berrange@redhat.com> wrote:
On Mon, Apr 06, 2020 at 09:50:59AM +0200, Rafael Fonseca wrote:
On Fri, Apr 3, 2020 at 5:16 PM Rafael Fonseca <r4f4rfs@gmail.com> wrote:
+#define VIR_TYPE_DOMAIN_CHECKPOINT vir_domain_checkpoint_get_type() +G_DECLARE_FINAL_TYPE(virDomainCheckpoint, + vir_domain_checkpoint, + VIR, + DOMAIN_CHECKPOINT, + GObject); + extern virClassPtr virAdmConnectClass;
#define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -327,8 +333,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject);
#define virCheckDomainCheckpointReturn(obj, retval) \ do { \ - virDomainCheckpointPtr _check = (obj); \ - if (!virObjectIsClass(_check, virDomainCheckpointClass) || \ + virDomainCheckpointPtr _check = VIR_DOMAIN_CHECKPOINT(obj); \ + if (!G_IS_OBJECT(_check) || !(G_OBJECT_TYPE(_check) == VIR_TYPE_DOMAIN_CHECKPOINT) || \
I guess `VIR_IS_DOMAIN_CHECKPOINT` created by `G_DECLARE_FINAL_TYPE` is enough here for this check?
Yes, we can slim this right now and avoid the casts / intermediate variable entirely, to just this I think:
#define virCheckDomainCheckpointReturn(obj, retval) \ if (!VIR_IS_DOMAIN_CHECKPOINT(obj)) { \ return retval; \ }
That's much better. I'll do it for v2.
Another issue with the changes in datatypes.c is that by converting the types separately, then `gendispatch.pl` generates wrong code (virObjectUnref for GObject). Is it acceptable to have them all changed in a single patch?
I think having one patch will be too large. We'll need to update gendispatch.pl so it knows how to generate a different method name depending on object type. This shouldn't be too hard - eg have a global hash my %unrefimpl = ( "virDomain" => "virObjectUnref", "virNetwork" => "virObjectUnref", "virStoragePool" => "virObjectUnref", etc ) when just change them one at a time. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/virdomainsnapshotobjlist.c | 6 ++-- src/datatypes.c | 44 ++++++++++++++++++----------- src/datatypes.h | 13 +++++++-- src/libvirt-domain-snapshot.c | 7 ++--- src/libvirt_private.syms | 1 - src/qemu/qemu_driver.c | 3 +- 6 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapshotobjlist.c index 910b0714c7..7641aa98ff 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -286,8 +286,10 @@ virDomainListSnapshots(virDomainSnapshotObjListPtr snapshots, VIR_FREE(names[i]); VIR_FREE(names); if (ret < 0 && list) { - for (i = 0; i < count; i++) - virObjectUnref(list[i]); + for (i = 0; i < count; i++) { + if (list[i]) + g_object_unref(list[i]); + } VIR_FREE(list); } return ret; diff --git a/src/datatypes.c b/src/datatypes.c index 1e0861aa5f..fd39c96b31 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -36,7 +36,6 @@ VIR_LOG_INIT("datatypes"); virClassPtr virConnectClass; virClassPtr virConnectCloseCallbackDataClass; virClassPtr virDomainClass; -virClassPtr virDomainSnapshotClass; virClassPtr virInterfaceClass; virClassPtr virNetworkClass; virClassPtr virNetworkPortClass; @@ -51,7 +50,6 @@ virClassPtr virStoragePoolClass; static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); static void virDomainDispose(void *obj); -static void virDomainSnapshotDispose(void *obj); static void virInterfaceDispose(void *obj); static void virNetworkDispose(void *obj); static void virNetworkPortDispose(void *obj); @@ -79,6 +77,22 @@ vir_domain_checkpoint_class_init(virDomainCheckpointClass *klass) obj->finalize = virDomainCheckpointFinalize; } +G_DEFINE_TYPE(virDomainSnapshot, vir_domain_snapshot, G_TYPE_OBJECT); +static void virDomainSnapshotFinalize(GObject *obj); + +static void +vir_domain_snapshot_init(virDomainSnapshot *ds G_GNUC_UNUSED) +{ +} + +static void +vir_domain_snapshot_class_init(virDomainSnapshotClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virDomainSnapshotFinalize; +} + virClassPtr virAdmConnectClass; virClassPtr virAdmConnectCloseCallbackDataClass; @@ -131,7 +145,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virConnect); DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData); DECLARE_CLASS(virDomain); - DECLARE_CLASS(virDomainSnapshot); DECLARE_CLASS(virInterface); DECLARE_CLASS(virNetwork); DECLARE_CLASS(virNetworkPort); @@ -1051,37 +1064,32 @@ virDomainCheckpointFinalize(GObject *obj) * @name: pointer to the domain snapshot name * * Allocates a new domain snapshot object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the domain snapshot object, or NULL on error. */ virDomainSnapshotPtr virGetDomainSnapshot(virDomainPtr domain, const char *name) { - virDomainSnapshotPtr ret = NULL; + g_autoptr(virDomainSnapshot) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; - virCheckDomainGoto(domain, error); - virCheckNonNullArgGoto(name, error); + virCheckDomainReturn(domain, NULL); + virCheckNonNullArgReturn(name, NULL); - if (!(ret = virObjectNew(virDomainSnapshotClass))) - goto error; + ret = VIR_DOMAIN_SNAPSHOT(g_object_new(VIR_TYPE_DOMAIN_SNAPSHOT, NULL)); ret->name = g_strdup(name); ret->domain = virObjectRef(domain); - return ret; - - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } /** - * virDomainSnapshotDispose: + * virDomainSnapshotFinalize: * @obj: the domain snapshot to release * * Unconditionally release all memory associated with a snapshot. @@ -1091,13 +1099,15 @@ virGetDomainSnapshot(virDomainPtr domain, const char *name) * which may also be released if its ref count hits zero. */ static void -virDomainSnapshotDispose(void *obj) +virDomainSnapshotFinalize(GObject *obj) { - virDomainSnapshotPtr snapshot = obj; + virDomainSnapshotPtr snapshot = VIR_DOMAIN_SNAPSHOT(obj); VIR_DEBUG("release snapshot %p %s", snapshot, snapshot->name); VIR_FREE(snapshot->name); virObjectUnref(snapshot->domain); + + G_OBJECT_CLASS(vir_domain_snapshot_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index 13ad044126..296196523b 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -32,7 +32,6 @@ extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; -extern virClassPtr virDomainSnapshotClass; extern virClassPtr virInterfaceClass; extern virClassPtr virNetworkClass; extern virClassPtr virNetworkPortClass; @@ -44,6 +43,7 @@ extern virClassPtr virStreamClass; extern virClassPtr virStorageVolClass; extern virClassPtr virStoragePoolClass; + #define VIR_TYPE_DOMAIN_CHECKPOINT vir_domain_checkpoint_get_type() G_DECLARE_FINAL_TYPE(virDomainCheckpoint, vir_domain_checkpoint, @@ -51,6 +51,13 @@ G_DECLARE_FINAL_TYPE(virDomainCheckpoint, DOMAIN_CHECKPOINT, GObject); +#define VIR_TYPE_DOMAIN_SNAPSHOT vir_domain_snapshot_get_type() +G_DECLARE_FINAL_TYPE(virDomainSnapshot, + vir_domain_snapshot, + VIR, + DOMAIN_SNAPSHOT, + GObject); + extern virClassPtr virAdmConnectClass; #define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -349,7 +356,7 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckDomainSnapshotReturn(obj, retval) \ do { \ virDomainSnapshotPtr _snap = (obj); \ - if (!virObjectIsClass(_snap, virDomainSnapshotClass) || \ + if (!G_IS_OBJECT(_snap) || !(G_OBJECT_TYPE(_snap) == VIR_TYPE_DOMAIN_SNAPSHOT) || \ !virObjectIsClass(_snap->domain, virDomainClass) || \ !virObjectIsClass(_snap->domain->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_DOMAIN_SNAPSHOT, \ @@ -767,7 +774,7 @@ struct _virDomainCheckpoint { * Internal structure associated with a domain snapshot */ struct _virDomainSnapshot { - virObject parent; + GObject parent; char *name; virDomainPtr domain; }; diff --git a/src/libvirt-domain-snapshot.c b/src/libvirt-domain-snapshot.c index 33593e11e9..ce870de712 100644 --- a/src/libvirt-domain-snapshot.c +++ b/src/libvirt-domain-snapshot.c @@ -1080,14 +1080,13 @@ virDomainSnapshotDelete(virDomainSnapshotPtr snapshot, int virDomainSnapshotRef(virDomainSnapshotPtr snapshot) { - VIR_DEBUG("snapshot=%p, refs=%d", snapshot, - snapshot ? snapshot->parent.u.s.refs : 0); + VIR_DEBUG("snapshot=%p", snapshot); virResetLastError(); virCheckDomainSnapshotReturn(snapshot, -1); - virObjectRef(snapshot); + g_object_ref(snapshot); return 0; } @@ -1110,6 +1109,6 @@ virDomainSnapshotFree(virDomainSnapshotPtr snapshot) virCheckDomainSnapshotReturn(snapshot, -1); - virObjectUnref(snapshot); + g_object_unref(snapshot); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 008d4fa08f..7528779127 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1350,7 +1350,6 @@ virConnectCloseCallbackDataGetCallback; virConnectCloseCallbackDataRegister; virConnectCloseCallbackDataUnregister; virDomainClass; -virDomainSnapshotClass; virGetConnect; virGetDomain; virGetDomainCheckpoint; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 73f1037e8a..864158fd9d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -15853,8 +15853,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, cfg->snapshotDir) < 0) { /* if writing of metadata fails, error out rather than trying * to silently carry on without completing the snapshot */ - virObjectUnref(snapshot); - snapshot = NULL; + g_clear_object(&snapshot); virReportError(VIR_ERR_INTERNAL_ERROR, _("unable to save metadata for snapshot %s"), snap->def->name); -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/virnwfilterobj.c | 6 +++-- src/datatypes.c | 46 ++++++++++++++++++++++++--------------- src/datatypes.h | 10 +++++---- src/libvirt-nwfilter.c | 7 +++--- src/libvirt_private.syms | 1 - 5 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/conf/virnwfilterobj.c b/src/conf/virnwfilterobj.c index c9e224061d..6d89701199 100644 --- a/src/conf/virnwfilterobj.c +++ b/src/conf/virnwfilterobj.c @@ -473,8 +473,10 @@ virNWFilterObjListExport(virConnectPtr conn, cleanup: if (tmp_filters) { - for (i = 0; i < nfilters; i ++) - virObjectUnref(tmp_filters[i]); + for (i = 0; i < nfilters; i ++) { + if (tmp_filters[i]) + g_object_unref(tmp_filters[i]); + } } VIR_FREE(tmp_filters); diff --git a/src/datatypes.c b/src/datatypes.c index fd39c96b31..d4f60db2be 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -40,7 +40,6 @@ virClassPtr virInterfaceClass; virClassPtr virNetworkClass; virClassPtr virNetworkPortClass; virClassPtr virNodeDeviceClass; -virClassPtr virNWFilterClass; virClassPtr virNWFilterBindingClass; virClassPtr virSecretClass; virClassPtr virStreamClass; @@ -54,7 +53,6 @@ static void virInterfaceDispose(void *obj); static void virNetworkDispose(void *obj); static void virNetworkPortDispose(void *obj); static void virNodeDeviceDispose(void *obj); -static void virNWFilterDispose(void *obj); static void virNWFilterBindingDispose(void *obj); static void virSecretDispose(void *obj); static void virStreamDispose(void *obj); @@ -93,6 +91,22 @@ vir_domain_snapshot_class_init(virDomainSnapshotClass *klass) obj->finalize = virDomainSnapshotFinalize; } +G_DEFINE_TYPE(virNWFilter, vir_nw_filter, G_TYPE_OBJECT); +static void virNWFilterFinalize(GObject *obj); + +static void +vir_nw_filter_init(virNWFilter *filter G_GNUC_UNUSED) +{ +} + +static void +vir_nw_filter_class_init(virNWFilterClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virNWFilterFinalize; +} + virClassPtr virAdmConnectClass; virClassPtr virAdmConnectCloseCallbackDataClass; @@ -149,7 +163,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS(virNetwork); DECLARE_CLASS(virNetworkPort); DECLARE_CLASS(virNodeDevice); - DECLARE_CLASS(virNWFilter); DECLARE_CLASS(virNWFilterBinding); DECLARE_CLASS(virSecret); DECLARE_CLASS(virStream); @@ -883,7 +896,7 @@ virStreamDispose(void *obj) * @uuid: pointer to the uuid * * Allocates a new network filter object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the network filter object, or NULL on error. */ @@ -891,17 +904,16 @@ virNWFilterPtr virGetNWFilter(virConnectPtr conn, const char *name, const unsigned char *uuid) { - virNWFilterPtr ret = NULL; + g_autoptr(virNWFilter) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; - virCheckConnectGoto(conn, error); - virCheckNonNullArgGoto(name, error); - virCheckNonNullArgGoto(uuid, error); + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgReturn(name, NULL); + virCheckNonNullArgReturn(uuid, NULL); - if (!(ret = virObjectNew(virNWFilterClass))) - goto error; + ret = VIR_NW_FILTER(g_object_new(VIR_TYPE_NW_FILTER, NULL)); ret->name = g_strdup(name); @@ -909,16 +921,12 @@ virGetNWFilter(virConnectPtr conn, const char *name, ret->conn = virObjectRef(conn); - return ret; - - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } /** - * virNWFilterDispose: + * virNWFilterFinalize: * @obj: the network filter to release * * Unconditionally release all memory associated with a nwfilter. @@ -928,9 +936,9 @@ virGetNWFilter(virConnectPtr conn, const char *name, * which may also be released if its ref count hits zero. */ static void -virNWFilterDispose(void *obj) +virNWFilterFinalize(GObject *obj) { - virNWFilterPtr nwfilter = obj; + virNWFilterPtr nwfilter = VIR_NW_FILTER(obj); char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(nwfilter->uuid, uuidstr); @@ -938,6 +946,8 @@ virNWFilterDispose(void *obj) VIR_FREE(nwfilter->name); virObjectUnref(nwfilter->conn); + + G_OBJECT_CLASS(vir_nw_filter_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index 296196523b..e8bd9bf1e5 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -36,7 +36,6 @@ extern virClassPtr virInterfaceClass; extern virClassPtr virNetworkClass; extern virClassPtr virNetworkPortClass; extern virClassPtr virNodeDeviceClass; -extern virClassPtr virNWFilterClass; extern virClassPtr virNWFilterBindingClass; extern virClassPtr virSecretClass; extern virClassPtr virStreamClass; @@ -58,6 +57,9 @@ G_DECLARE_FINAL_TYPE(virDomainSnapshot, DOMAIN_SNAPSHOT, GObject); +#define VIR_TYPE_NW_FILTER vir_nw_filter_get_type() +G_DECLARE_FINAL_TYPE(virNWFilter, vir_nw_filter, VIR, NW_FILTER, GObject); + extern virClassPtr virAdmConnectClass; #define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -312,8 +314,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckNWFilterReturn(obj, retval) \ do { \ - virNWFilterPtr _nw = (obj); \ - if (!virObjectIsClass(_nw, virNWFilterClass) || \ + virNWFilterPtr _nw = VIR_NW_FILTER(obj); \ + if (!G_IS_OBJECT(_nw) || !(G_OBJECT_TYPE(_nw) == VIR_TYPE_NW_FILTER) || \ !virObjectIsClass(_nw->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_NWFILTER, \ VIR_ERR_INVALID_NWFILTER, \ @@ -785,7 +787,7 @@ struct _virDomainSnapshot { * Internal structure associated to a network filter */ struct _virNWFilter { - virObject parent; + GObject parent; virConnectPtr conn; /* pointer back to the connection */ char *name; /* the network filter external name */ unsigned char uuid[VIR_UUID_BUFLEN]; /* the network filter unique identifier */ diff --git a/src/libvirt-nwfilter.c b/src/libvirt-nwfilter.c index d28220db8a..cd3f5759b7 100644 --- a/src/libvirt-nwfilter.c +++ b/src/libvirt-nwfilter.c @@ -281,7 +281,7 @@ virNWFilterFree(virNWFilterPtr nwfilter) virCheckNWFilterReturn(nwfilter, -1); - virObjectUnref(nwfilter); + g_object_unref(nwfilter); return 0; } @@ -503,14 +503,13 @@ virNWFilterGetXMLDesc(virNWFilterPtr nwfilter, unsigned int flags) int virNWFilterRef(virNWFilterPtr nwfilter) { - VIR_DEBUG("nwfilter=%p refs=%d", nwfilter, - nwfilter ? nwfilter->parent.u.s.refs : 0); + VIR_DEBUG("nwfilter=%p", nwfilter); virResetLastError(); virCheckNWFilterReturn(nwfilter, -1); - virObjectRef(nwfilter); + g_object_ref(nwfilter); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 7528779127..aff0688548 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1369,7 +1369,6 @@ virNetworkClass; virNetworkPortClass; virNewConnectCloseCallbackData; virNodeDeviceClass; -virNWFilterClass; virSecretClass; virStoragePoolClass; virStorageVolClass; -- 2.25.1

On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
@@ -503,14 +503,13 @@ virNWFilterGetXMLDesc(virNWFilterPtr nwfilter, unsigned int flags) int virNWFilterRef(virNWFilterPtr nwfilter) { - VIR_DEBUG("nwfilter=%p refs=%d", nwfilter, - nwfilter ? nwfilter->parent.u.s.refs : 0); + VIR_DEBUG("nwfilter=%p", nwfilter);
I wonder about this change. If it doesn't include the ref count in the debug message, is it actually still useful to anyone? I've never used it, so I don't know. If we want to keep it, we could of course access the GObject ref_count member variable.
virResetLastError();
virCheckNWFilterReturn(nwfilter, -1);
- virObjectRef(nwfilter); + g_object_ref(nwfilter); return 0; }

On Wed, Apr 8, 2020 at 11:12 PM Jonathon Jongsma <jjongsma@redhat.com> wrote:
On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
@@ -503,14 +503,13 @@ virNWFilterGetXMLDesc(virNWFilterPtr nwfilter, unsigned int flags) int virNWFilterRef(virNWFilterPtr nwfilter) { - VIR_DEBUG("nwfilter=%p refs=%d", nwfilter, - nwfilter ? nwfilter->parent.u.s.refs : 0); + VIR_DEBUG("nwfilter=%p", nwfilter);
I wonder about this change. If it doesn't include the ref count in the debug message, is it actually still useful to anyone? I've never used it, so I don't know. If we want to keep it, we could of course access the GObject ref_count member variable.
I was looking for ways to do this in glib and this is what the doc says: "All the fields in the GObject structure are private to the GObject implementation and should never be accessed directly." [1] And it seems there is no alternative other than using a weak reference to have a callback called. [1] https://developer.gnome.org/gobject/stable/gobject-The-Base-Object-Type.html... Att. -- Rafael Fonseca

On Wed, Apr 08, 2020 at 04:12:04PM -0500, Jonathon Jongsma wrote:
On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
@@ -503,14 +503,13 @@ virNWFilterGetXMLDesc(virNWFilterPtr nwfilter, unsigned int flags) int virNWFilterRef(virNWFilterPtr nwfilter) { - VIR_DEBUG("nwfilter=%p refs=%d", nwfilter, - nwfilter ? nwfilter->parent.u.s.refs : 0); + VIR_DEBUG("nwfilter=%p", nwfilter);
I wonder about this change. If it doesn't include the ref count in the debug message, is it actually still useful to anyone? I've never used it, so I don't know. If we want to keep it, we could of course access the GObject ref_count member variable.
I think just drop the ref count is fine. I wouldn't want us to be accessing private fields in GObject Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/virnwfilterbindingobjlist.c | 6 +++- src/datatypes.c | 44 +++++++++++++++++----------- src/datatypes.h | 14 ++++++--- src/libvirt-nwfilter.c | 7 ++--- src/nwfilter/nwfilter_driver.c | 3 +- 5 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/conf/virnwfilterbindingobjlist.c b/src/conf/virnwfilterbindingobjlist.c index 97e4d3c49b..110403bfcc 100644 --- a/src/conf/virnwfilterbindingobjlist.c +++ b/src/conf/virnwfilterbindingobjlist.c @@ -489,7 +489,11 @@ virNWFilterBindingObjListExport(virNWFilterBindingObjListPtr bindings, cleanup: virObjectListFreeCount(bindingobjs, nbindings); if (ret < 0) { - virObjectListFreeCount(*bindinglist, nbindings); + for (i = 0; i < nbindings; i++) { + if ((*bindinglist)[i]) + g_object_unref((*bindinglist)[i]); + } + VIR_FREE(*bindinglist); *bindinglist = NULL; } return ret; diff --git a/src/datatypes.c b/src/datatypes.c index d4f60db2be..b9879cfb9e 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -40,7 +40,6 @@ virClassPtr virInterfaceClass; virClassPtr virNetworkClass; virClassPtr virNetworkPortClass; virClassPtr virNodeDeviceClass; -virClassPtr virNWFilterBindingClass; virClassPtr virSecretClass; virClassPtr virStreamClass; virClassPtr virStorageVolClass; @@ -53,7 +52,6 @@ static void virInterfaceDispose(void *obj); static void virNetworkDispose(void *obj); static void virNetworkPortDispose(void *obj); static void virNodeDeviceDispose(void *obj); -static void virNWFilterBindingDispose(void *obj); static void virSecretDispose(void *obj); static void virStreamDispose(void *obj); static void virStorageVolDispose(void *obj); @@ -107,6 +105,22 @@ vir_nw_filter_class_init(virNWFilterClass *klass) obj->finalize = virNWFilterFinalize; } +G_DEFINE_TYPE(virNWFilterBinding, vir_nw_filter_binding, G_TYPE_OBJECT); +static void virNWFilterBindingFinalize(GObject *obj); + +static void +vir_nw_filter_binding_init(virNWFilterBinding *bdg G_GNUC_UNUSED) +{ +} + +static void +vir_nw_filter_binding_class_init(virNWFilterBindingClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virNWFilterBindingFinalize; +} + virClassPtr virAdmConnectClass; virClassPtr virAdmConnectCloseCallbackDataClass; @@ -163,7 +177,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS(virNetwork); DECLARE_CLASS(virNetworkPort); DECLARE_CLASS(virNodeDevice); - DECLARE_CLASS(virNWFilterBinding); DECLARE_CLASS(virSecret); DECLARE_CLASS(virStream); DECLARE_CLASS(virStorageVol); @@ -958,7 +971,7 @@ virNWFilterFinalize(GObject *obj) * @filtername: name of the network filter * * Allocates a new network filter binding object. When the object is no longer - * needed, virObjectUnref() must be called in order to not leak data. + * needed, g_object_unref() must be called in order to not leak data. * * Returns a pointer to the network filter binding object, or NULL on error. */ @@ -966,16 +979,15 @@ virNWFilterBindingPtr virGetNWFilterBinding(virConnectPtr conn, const char *portdev, const char *filtername) { - virNWFilterBindingPtr ret = NULL; + g_autoptr(virNWFilterBinding) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; - virCheckConnectGoto(conn, error); - virCheckNonNullArgGoto(portdev, error); + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgReturn(portdev, NULL); - if (!(ret = virObjectNew(virNWFilterBindingClass))) - goto error; + ret = VIR_NW_FILTER_BINDING(g_object_new(VIR_TYPE_NW_FILTER_BINDING, NULL)); ret->portdev = g_strdup(portdev); @@ -983,16 +995,12 @@ virGetNWFilterBinding(virConnectPtr conn, const char *portdev, ret->conn = virObjectRef(conn); - return ret; - - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } /** - * virNWFilterBindingDispose: + * virNWFilterBindingFinalize: * @obj: the network filter binding to release * * Unconditionally release all memory associated with a nwfilter binding. @@ -1002,15 +1010,17 @@ virGetNWFilterBinding(virConnectPtr conn, const char *portdev, * which may also be released if its ref count hits zero. */ static void -virNWFilterBindingDispose(void *obj) +virNWFilterBindingFinalize(GObject *obj) { - virNWFilterBindingPtr binding = obj; + virNWFilterBindingPtr binding = VIR_NW_FILTER_BINDING(obj); VIR_DEBUG("release binding %p %s", binding, binding->portdev); VIR_FREE(binding->portdev); VIR_FREE(binding->filtername); virObjectUnref(binding->conn); + + G_OBJECT_CLASS(vir_nw_filter_binding_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index e8bd9bf1e5..87c6a1366e 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -36,7 +36,6 @@ extern virClassPtr virInterfaceClass; extern virClassPtr virNetworkClass; extern virClassPtr virNetworkPortClass; extern virClassPtr virNodeDeviceClass; -extern virClassPtr virNWFilterBindingClass; extern virClassPtr virSecretClass; extern virClassPtr virStreamClass; extern virClassPtr virStorageVolClass; @@ -50,6 +49,13 @@ G_DECLARE_FINAL_TYPE(virDomainCheckpoint, DOMAIN_CHECKPOINT, GObject); +#define VIR_TYPE_NW_FILTER_BINDING vir_nw_filter_binding_get_type() +G_DECLARE_FINAL_TYPE(virNWFilterBinding, + vir_nw_filter_binding, + VIR, + NW_FILTER_BINDING, + GObject); + #define VIR_TYPE_DOMAIN_SNAPSHOT vir_domain_snapshot_get_type() G_DECLARE_FINAL_TYPE(virDomainSnapshot, vir_domain_snapshot, @@ -328,8 +334,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckNWFilterBindingReturn(obj, retval) \ do { \ - virNWFilterBindingPtr _nw = (obj); \ - if (!virObjectIsClass(_nw, virNWFilterBindingClass) || \ + virNWFilterBindingPtr _nw = VIR_NW_FILTER_BINDING(obj); \ + if (!G_IS_OBJECT(_nw) || !(G_OBJECT_TYPE(_nw) == VIR_TYPE_NW_FILTER_BINDING) || \ !virObjectIsClass(_nw->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_NWFILTER, \ VIR_ERR_INVALID_NWFILTER_BINDING, \ @@ -800,7 +806,7 @@ struct _virNWFilter { * Internal structure associated to a network filter port binding */ struct _virNWFilterBinding { - virObject parent; + GObject parent; virConnectPtr conn; /* pointer back to the connection */ char *portdev; /* the network filter port device name */ char *filtername; /* the network filter name */ diff --git a/src/libvirt-nwfilter.c b/src/libvirt-nwfilter.c index cd3f5759b7..ac34d1fea0 100644 --- a/src/libvirt-nwfilter.c +++ b/src/libvirt-nwfilter.c @@ -621,7 +621,7 @@ virNWFilterBindingFree(virNWFilterBindingPtr binding) virCheckNWFilterBindingReturn(binding, -1); - virObjectUnref(binding); + g_object_unref(binding); return 0; } @@ -819,13 +819,12 @@ virNWFilterBindingGetXMLDesc(virNWFilterBindingPtr binding, unsigned int flags) int virNWFilterBindingRef(virNWFilterBindingPtr binding) { - VIR_DEBUG("binding=%p refs=%d", binding, - binding ? binding->parent.u.s.refs : 0); + VIR_DEBUG("binding=%p", binding); virResetLastError(); virCheckNWFilterBindingReturn(binding, -1); - virObjectRef(binding); + g_object_ref(binding); return 0; } diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c index 1c407727db..cbf396342e 100644 --- a/src/nwfilter/nwfilter_driver.c +++ b/src/nwfilter/nwfilter_driver.c @@ -785,8 +785,7 @@ nwfilterBindingCreateXML(virConnectPtr conn, if (virNWFilterInstantiateFilter(driver, def) < 0) { virNWFilterBindingObjListRemove(driver->bindings, obj); - virObjectUnref(ret); - ret = NULL; + g_clear_object(&ret); goto cleanup; } virNWFilterBindingObjSave(obj, driver->bindingDir); -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/domain_conf.c | 6 ++-- src/conf/network_event.c | 2 +- src/conf/virnetworkobj.c | 7 ++-- src/datatypes.c | 50 +++++++++++++++++------------ src/datatypes.h | 33 ++++++++++--------- src/libvirt-network.c | 7 ++-- src/libvirt_private.syms | 1 - src/libxl/libxl_conf.c | 3 +- src/libxl/xen_common.c | 2 +- src/remote/remote_daemon_dispatch.c | 6 ++-- src/remote/remote_driver.c | 4 +-- 11 files changed, 64 insertions(+), 57 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a29e6681a5..772d9ae0a8 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -31540,7 +31540,7 @@ virDomainNetReleaseActualDevice(virConnectPtr conn, virDomainDefPtr dom G_GNUC_UNUSED, virDomainNetDefPtr iface) { - virNetworkPtr net = NULL; + g_autoptr(virNetwork) net = NULL; virNetworkPortPtr port = NULL; int ret = -1; @@ -31561,7 +31561,6 @@ virDomainNetReleaseActualDevice(virConnectPtr conn, cleanup: virObjectUnref(port); - virObjectUnref(net); return ret; } @@ -31614,7 +31613,7 @@ int virDomainNetBandwidthUpdate(virDomainNetDefPtr iface, virNetDevBandwidthPtr newBandwidth) { - virNetworkPtr net = NULL; + g_autoptr(virNetwork) net = NULL; virNetworkPortPtr port = NULL; virTypedParameterPtr params = NULL; int nparams = 0; @@ -31641,7 +31640,6 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface, virObjectUnref(conn); virTypedParamsFree(params, nparams); virObjectUnref(port); - virObjectUnref(net); return ret; } diff --git a/src/conf/network_event.c b/src/conf/network_event.c index 41cabe340a..5a8f138dfd 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -111,7 +111,7 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn, VIR_WARN("Unexpected event ID %d", event->eventID); cleanup: - virObjectUnref(net); + g_object_unref(net); } diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c index b2affaacd3..762c9d9159 100644 --- a/src/conf/virnetworkobj.c +++ b/src/conf/virnetworkobj.c @@ -1429,9 +1429,10 @@ virNetworkObjListExport(virConnectPtr conn, ret = data.nnets; cleanup: virObjectRWUnlock(netobjs); - while (data.nets && data.nnets) - virObjectUnref(data.nets[--data.nnets]); - + while (data.nets && data.nnets) { + if (data.nets[--data.nnets]) + g_object_unref(data.nets[data.nnets]); + } VIR_FREE(data.nets); return ret; } diff --git a/src/datatypes.c b/src/datatypes.c index b9879cfb9e..15130ca0fa 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -37,7 +37,6 @@ virClassPtr virConnectClass; virClassPtr virConnectCloseCallbackDataClass; virClassPtr virDomainClass; virClassPtr virInterfaceClass; -virClassPtr virNetworkClass; virClassPtr virNetworkPortClass; virClassPtr virNodeDeviceClass; virClassPtr virSecretClass; @@ -49,7 +48,6 @@ static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); static void virDomainDispose(void *obj); static void virInterfaceDispose(void *obj); -static void virNetworkDispose(void *obj); static void virNetworkPortDispose(void *obj); static void virNodeDeviceDispose(void *obj); static void virSecretDispose(void *obj); @@ -89,6 +87,22 @@ vir_domain_snapshot_class_init(virDomainSnapshotClass *klass) obj->finalize = virDomainSnapshotFinalize; } +G_DEFINE_TYPE(virNetwork, vir_network, G_TYPE_OBJECT); +static void virNetworkFinalize(GObject *obj); + +static void +vir_network_init(virNetwork *net G_GNUC_UNUSED) +{ +} + +static void +vir_network_class_init(virNetworkClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virNetworkFinalize; +} + G_DEFINE_TYPE(virNWFilter, vir_nw_filter, G_TYPE_OBJECT); static void virNWFilterFinalize(GObject *obj); @@ -174,7 +188,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData); DECLARE_CLASS(virDomain); DECLARE_CLASS(virInterface); - DECLARE_CLASS(virNetwork); DECLARE_CLASS(virNetworkPort); DECLARE_CLASS(virNodeDevice); DECLARE_CLASS(virSecret); @@ -411,39 +424,34 @@ virDomainDispose(void *obj) * @uuid: pointer to the uuid * * Allocates a new network object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the network object, or NULL on error. */ virNetworkPtr virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid) { - virNetworkPtr ret = NULL; + g_autoptr(virNetwork) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; - virCheckConnectGoto(conn, error); - virCheckNonNullArgGoto(name, error); - virCheckNonNullArgGoto(uuid, error); + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgReturn(name, NULL); + virCheckNonNullArgReturn(uuid, NULL); - if (!(ret = virObjectNew(virNetworkClass))) - goto error; + ret = VIR_NETWORK(g_object_new(VIR_TYPE_NETWORK, NULL)); ret->name = g_strdup(name); ret->conn = virObjectRef(conn); memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN); - return ret; - - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } /** - * virNetworkDispose: + * virNetworkFinalize: * @obj: the network to release * * Unconditionally release all memory associated with a network. @@ -453,9 +461,9 @@ virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid) * which may also be released if its ref count hits zero. */ static void -virNetworkDispose(void *obj) +virNetworkFinalize(GObject *obj) { - virNetworkPtr network = obj; + virNetworkPtr network = VIR_NETWORK(obj); char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(network->uuid, uuidstr); @@ -463,6 +471,8 @@ virNetworkDispose(void *obj) VIR_FREE(network->name); virObjectUnref(network->conn); + + G_OBJECT_CLASS(vir_network_parent_class)->finalize(obj); } @@ -490,7 +500,7 @@ virGetNetworkPort(virNetworkPtr net, const unsigned char *uuid) if (!(ret = virObjectNew(virNetworkPortClass))) goto error; - ret->net = virObjectRef(net); + ret->net = g_object_ref(net); memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN); return ret; @@ -519,7 +529,7 @@ virNetworkPortDispose(void *obj) virUUIDFormat(port->uuid, uuidstr); VIR_DEBUG("release network port %p %s", port, uuidstr); - virObjectUnref(port->net); + g_object_unref(port->net); } diff --git a/src/datatypes.h b/src/datatypes.h index 87c6a1366e..e91a6c71f4 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -33,7 +33,6 @@ extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; extern virClassPtr virInterfaceClass; -extern virClassPtr virNetworkClass; extern virClassPtr virNetworkPortClass; extern virClassPtr virNodeDeviceClass; extern virClassPtr virSecretClass; @@ -49,13 +48,6 @@ G_DECLARE_FINAL_TYPE(virDomainCheckpoint, DOMAIN_CHECKPOINT, GObject); -#define VIR_TYPE_NW_FILTER_BINDING vir_nw_filter_binding_get_type() -G_DECLARE_FINAL_TYPE(virNWFilterBinding, - vir_nw_filter_binding, - VIR, - NW_FILTER_BINDING, - GObject); - #define VIR_TYPE_DOMAIN_SNAPSHOT vir_domain_snapshot_get_type() G_DECLARE_FINAL_TYPE(virDomainSnapshot, vir_domain_snapshot, @@ -63,9 +55,19 @@ G_DECLARE_FINAL_TYPE(virDomainSnapshot, DOMAIN_SNAPSHOT, GObject); +#define VIR_TYPE_NETWORK vir_network_get_type() +G_DECLARE_FINAL_TYPE(virNetwork, vir_network, VIR, NETWORK, GObject); + #define VIR_TYPE_NW_FILTER vir_nw_filter_get_type() G_DECLARE_FINAL_TYPE(virNWFilter, vir_nw_filter, VIR, NW_FILTER, GObject); +#define VIR_TYPE_NW_FILTER_BINDING vir_nw_filter_binding_get_type() +G_DECLARE_FINAL_TYPE(virNWFilterBinding, + vir_nw_filter_binding, + VIR, + NW_FILTER_BINDING, + GObject); + extern virClassPtr virAdmConnectClass; #define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -119,8 +121,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckNetworkReturn(obj, retval) \ do { \ - virNetworkPtr _net = (obj); \ - if (!virObjectIsClass(_net, virNetworkClass) || \ + virNetworkPtr _net = VIR_NETWORK(obj); \ + if (!G_IS_OBJECT(_net) || !(G_OBJECT_TYPE(_net) == VIR_TYPE_NETWORK) || \ !virObjectIsClass(_net->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_NETWORK, \ VIR_ERR_INVALID_NETWORK, \ @@ -132,8 +134,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); } while (0) #define virCheckNetworkGoto(obj, label) \ do { \ - virNetworkPtr _net = (obj); \ - if (!virObjectIsClass(_net, virNetworkClass) || \ + virNetworkPtr _net = VIR_NETWORK(obj); \ + if (!G_IS_OBJECT(_net) || !(G_OBJECT_TYPE(_net) == VIR_TYPE_NETWORK) || \ !virObjectIsClass(_net->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_NETWORK, \ VIR_ERR_INVALID_NETWORK, \ @@ -147,7 +149,7 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); do { \ virNetworkPortPtr _port = (obj); \ if (!virObjectIsClass(_port, virNetworkPortClass) || \ - !virObjectIsClass(_port->net, virNetworkClass)) { \ + !G_IS_OBJECT(_port->net) || !(G_OBJECT_TYPE(_port->net) == VIR_TYPE_NETWORK)) { \ virReportErrorHelper(VIR_FROM_NETWORK, \ VIR_ERR_INVALID_NETWORK_PORT, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -161,7 +163,7 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); do { \ virNetworkPortPtr _port = (obj); \ if (!virObjectIsClass(_port, virNetworkPortClass) || \ - !virObjectIsClass(_port->net, virNetworkClass)) { \ + !G_IS_OBJECT(_port->net) || !(G_OBJECT_TYPE(_port->net) == VIR_TYPE_NETWORK)) { \ virReportErrorHelper(VIR_FROM_NETWORK, \ VIR_ERR_INVALID_NETWORK_PORT, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -639,13 +641,12 @@ struct _virDomain { * Internal structure associated to a network */ struct _virNetwork { - virObject parent; + GObject parent; virConnectPtr conn; /* pointer back to the connection */ char *name; /* the network external name */ unsigned char uuid[VIR_UUID_BUFLEN]; /* the network unique identifier */ }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virNetwork, virObjectUnref); /** diff --git a/src/libvirt-network.c b/src/libvirt-network.c index 09e24fb0a8..3847617d4d 100644 --- a/src/libvirt-network.c +++ b/src/libvirt-network.c @@ -654,7 +654,7 @@ virNetworkFree(virNetworkPtr network) virCheckNetworkReturn(network, -1); - virObjectUnref(network); + g_object_unref(network); return 0; } @@ -679,14 +679,13 @@ virNetworkFree(virNetworkPtr network) int virNetworkRef(virNetworkPtr network) { - VIR_DEBUG("network=%p refs=%d", network, - network ? network->parent.u.s.refs : 0); + VIR_DEBUG("network=%p", network); virResetLastError(); virCheckNetworkReturn(network, -1); - virObjectRef(network); + g_object_ref(network); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index aff0688548..8293a5e88d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1365,7 +1365,6 @@ virGetStoragePool; virGetStorageVol; virGetStream; virInterfaceClass; -virNetworkClass; virNetworkPortClass; virNewConnectCloseCallbackData; virNodeDeviceClass; diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 21089c33d7..d9377438d9 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1198,7 +1198,7 @@ libxlMakeNic(virDomainDefPtr def, bool attach) { virDomainNetType actual_type = virDomainNetGetActualType(l_nic); - virNetworkPtr network = NULL; + g_autoptr(virNetwork) network = NULL; virConnectPtr conn = NULL; const virNetDevBandwidth *actual_bw; const virNetDevVPortProfile *port_profile; @@ -1397,7 +1397,6 @@ libxlMakeNic(virDomainDefPtr def, cleanup: virBufferFreeAndReset(&buf); - virObjectUnref(network); virObjectUnref(conn); return ret; diff --git a/src/libxl/xen_common.c b/src/libxl/xen_common.c index 9a385eba0d..94863245fe 100644 --- a/src/libxl/xen_common.c +++ b/src/libxl/xen_common.c @@ -1717,7 +1717,7 @@ xenFormatNet(virConnectPtr conn, return -1; } bridge = virNetworkGetBridgeName(network); - virObjectUnref(network); + g_object_unref(network); if (!bridge) { virReportError(VIR_ERR_INTERNAL_ERROR, _("network %s is not active"), diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c index c024211ea5..ee6bbb24d0 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -6075,7 +6075,7 @@ remoteDispatchConnectNetworkEventRegisterAny(virNetServerPtr server G_GNUC_UNUSE remoteEventCallbackFree(callback); if (rv < 0) virNetMessageSaveError(rerr); - virObjectUnref(net); + g_object_unref(net); return rv; } @@ -6807,7 +6807,7 @@ remoteDispatchNetworkGetDHCPLeases(virNetServerPtr server G_GNUC_UNUSED, for (i = 0; i < nleases; i++) virNetworkDHCPLeaseFree(leases[i]); VIR_FREE(leases); - virObjectUnref(net); + g_object_unref(net); return rv; } @@ -7234,7 +7234,7 @@ get_nonnull_network_port(virConnectPtr conn, remote_nonnull_network_port port) if (!net) return NULL; ret = virGetNetworkPort(net, BAD_CAST port.uuid); - virObjectUnref(net); + g_object_unref(net); return ret; } diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 5051c583d7..f19061200c 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -5471,7 +5471,7 @@ remoteNetworkBuildEventLifecycle(virNetClientProgramPtr prog G_GNUC_UNUSED, event = virNetworkEventLifecycleNew(net->name, net->uuid, msg->event, msg->detail); - virObjectUnref(net); + g_object_unref(net); virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackID); } @@ -8281,7 +8281,7 @@ get_nonnull_network_port(virConnectPtr conn, remote_nonnull_network_port port) if (!net) return NULL; ret = virGetNetworkPort(net, BAD_CAST port.uuid); - virObjectUnref(net); + g_object_unref(net); return ret; } -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/domain_conf.c | 6 ++--- src/conf/virnetworkobj.c | 7 +++--- src/datatypes.c | 37 +++++++++++++++++++---------- src/datatypes.h | 15 ++++++------ src/libvirt-network.c | 7 +++--- src/libvirt_private.syms | 1 - src/remote/remote_daemon_dispatch.c | 2 +- 7 files changed, 43 insertions(+), 32 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 772d9ae0a8..f3a8a36eb2 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -31541,7 +31541,7 @@ virDomainNetReleaseActualDevice(virConnectPtr conn, virDomainNetDefPtr iface) { g_autoptr(virNetwork) net = NULL; - virNetworkPortPtr port = NULL; + g_autoptr(virNetworkPort) port = NULL; int ret = -1; /* Port might not exist if a failure occurred during VM startup */ @@ -31560,7 +31560,6 @@ virDomainNetReleaseActualDevice(virConnectPtr conn, goto cleanup; cleanup: - virObjectUnref(port); return ret; } @@ -31614,7 +31613,7 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface, virNetDevBandwidthPtr newBandwidth) { g_autoptr(virNetwork) net = NULL; - virNetworkPortPtr port = NULL; + g_autoptr(virNetworkPort) port = NULL; virTypedParameterPtr params = NULL; int nparams = 0; virConnectPtr conn = NULL; @@ -31639,7 +31638,6 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface, cleanup: virObjectUnref(conn); virTypedParamsFree(params, nparams); - virObjectUnref(port); return ret; } diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c index 762c9d9159..fba2587fd8 100644 --- a/src/conf/virnetworkobj.c +++ b/src/conf/virnetworkobj.c @@ -1825,9 +1825,10 @@ virNetworkObjPortListExport(virNetworkPtr net, ret = data.nports; cleanup: - while (data.ports && data.nports) - virObjectUnref(data.ports[--data.nports]); - + while (data.ports && data.nports) { + if (data.ports[--data.nports]) + g_object_unref(data.ports[data.nports]); + } VIR_FREE(data.ports); return ret; } diff --git a/src/datatypes.c b/src/datatypes.c index 15130ca0fa..e715c37306 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -37,7 +37,6 @@ virClassPtr virConnectClass; virClassPtr virConnectCloseCallbackDataClass; virClassPtr virDomainClass; virClassPtr virInterfaceClass; -virClassPtr virNetworkPortClass; virClassPtr virNodeDeviceClass; virClassPtr virSecretClass; virClassPtr virStreamClass; @@ -48,7 +47,6 @@ static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); static void virDomainDispose(void *obj); static void virInterfaceDispose(void *obj); -static void virNetworkPortDispose(void *obj); static void virNodeDeviceDispose(void *obj); static void virSecretDispose(void *obj); static void virStreamDispose(void *obj); @@ -103,6 +101,22 @@ vir_network_class_init(virNetworkClass *klass) obj->finalize = virNetworkFinalize; } +G_DEFINE_TYPE(virNetworkPort, vir_network_port, G_TYPE_OBJECT); +static void virNetworkPortFinalize(GObject *obj); + +static void +vir_network_port_init(virNetworkPort *np G_GNUC_UNUSED) +{ +} + +static void +vir_network_port_class_init(virNetworkPortClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virNetworkPortFinalize; +} + G_DEFINE_TYPE(virNWFilter, vir_nw_filter, G_TYPE_OBJECT); static void virNWFilterFinalize(GObject *obj); @@ -188,7 +202,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData); DECLARE_CLASS(virDomain); DECLARE_CLASS(virInterface); - DECLARE_CLASS(virNetworkPort); DECLARE_CLASS(virNodeDevice); DECLARE_CLASS(virSecret); DECLARE_CLASS(virStream); @@ -482,14 +495,14 @@ virNetworkFinalize(GObject *obj) * @uuid: pointer to the uuid * * Allocates a new network port object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the network port object, or NULL on error. */ virNetworkPortPtr virGetNetworkPort(virNetworkPtr net, const unsigned char *uuid) { - virNetworkPortPtr ret = NULL; + g_autoptr(virNetworkPort) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; @@ -497,21 +510,19 @@ virGetNetworkPort(virNetworkPtr net, const unsigned char *uuid) virCheckNetworkGoto(net, error); virCheckNonNullArgGoto(uuid, error); - if (!(ret = virObjectNew(virNetworkPortClass))) - goto error; + ret = VIR_NETWORK_PORT(g_object_new(VIR_TYPE_NETWORK_PORT, NULL)); ret->net = g_object_ref(net); memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN); - return ret; + return g_steal_pointer(&ret); error: - virObjectUnref(ret); return NULL; } /** - * virNetworkPortDispose: + * virNetworkPortFinalize: * @obj: the network port to release * * Unconditionally release all memory associated with a network port. @@ -521,15 +532,17 @@ virGetNetworkPort(virNetworkPtr net, const unsigned char *uuid) * which may also be released if its ref count hits zero. */ static void -virNetworkPortDispose(void *obj) +virNetworkPortFinalize(GObject *obj) { - virNetworkPortPtr port = obj; + virNetworkPortPtr port = VIR_NETWORK_PORT(obj); char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(port->uuid, uuidstr); VIR_DEBUG("release network port %p %s", port, uuidstr); g_object_unref(port->net); + + G_OBJECT_CLASS(vir_network_port_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index e91a6c71f4..a544a7a347 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -33,7 +33,6 @@ extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; extern virClassPtr virInterfaceClass; -extern virClassPtr virNetworkPortClass; extern virClassPtr virNodeDeviceClass; extern virClassPtr virSecretClass; extern virClassPtr virStreamClass; @@ -58,6 +57,9 @@ G_DECLARE_FINAL_TYPE(virDomainSnapshot, #define VIR_TYPE_NETWORK vir_network_get_type() G_DECLARE_FINAL_TYPE(virNetwork, vir_network, VIR, NETWORK, GObject); +#define VIR_TYPE_NETWORK_PORT vir_network_port_get_type() +G_DECLARE_FINAL_TYPE(virNetworkPort, vir_network_port, VIR, NETWORK_PORT, GObject); + #define VIR_TYPE_NW_FILTER vir_nw_filter_get_type() G_DECLARE_FINAL_TYPE(virNWFilter, vir_nw_filter, VIR, NW_FILTER, GObject); @@ -147,8 +149,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckNetworkPortReturn(obj, retval) \ do { \ - virNetworkPortPtr _port = (obj); \ - if (!virObjectIsClass(_port, virNetworkPortClass) || \ + virNetworkPortPtr _port = VIR_NETWORK_PORT(obj); \ + if (!G_IS_OBJECT(_port) || !(G_OBJECT_TYPE(_port) == VIR_TYPE_NETWORK_PORT) || \ !G_IS_OBJECT(_port->net) || !(G_OBJECT_TYPE(_port->net) == VIR_TYPE_NETWORK)) { \ virReportErrorHelper(VIR_FROM_NETWORK, \ VIR_ERR_INVALID_NETWORK_PORT, \ @@ -161,8 +163,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckNetworkPortGoto(obj, label) \ do { \ - virNetworkPortPtr _port = (obj); \ - if (!virObjectIsClass(_port, virNetworkPortClass) || \ + virNetworkPortPtr _port = VIR_NETWORK_PORT(obj); \ + if (!G_IS_OBJECT(_port) || !(G_OBJECT_TYPE(_port) == VIR_TYPE_NETWORK_PORT) || \ !G_IS_OBJECT(_port->net) || !(G_OBJECT_TYPE(_port->net) == VIR_TYPE_NETWORK)) { \ virReportErrorHelper(VIR_FROM_NETWORK, \ VIR_ERR_INVALID_NETWORK_PORT, \ @@ -655,12 +657,11 @@ struct _virNetwork { * Internal structure associated to a network port */ struct _virNetworkPort { - virObject parent; + GObject parent; virNetworkPtr net; /* pointer back to the connection */ unsigned char uuid[VIR_UUID_BUFLEN]; /* the network unique identifier */ }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virNetworkPort, virObjectUnref); /** diff --git a/src/libvirt-network.c b/src/libvirt-network.c index 3847617d4d..1ab499fb18 100644 --- a/src/libvirt-network.c +++ b/src/libvirt-network.c @@ -1688,7 +1688,7 @@ virNetworkPortFree(virNetworkPortPtr port) virCheckNetworkPortReturn(port, -1); - virObjectUnref(port); + g_object_unref(port); return 0; } @@ -1713,13 +1713,12 @@ virNetworkPortFree(virNetworkPortPtr port) int virNetworkPortRef(virNetworkPortPtr port) { - VIR_DEBUG("port=%p refs=%d", port, - port ? port->parent.u.s.refs : 0); + VIR_DEBUG("port=%p", port); virResetLastError(); virCheckNetworkPortReturn(port, -1); - virObjectRef(port); + g_object_ref(port); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8293a5e88d..9530b7a254 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1365,7 +1365,6 @@ virGetStoragePool; virGetStorageVol; virGetStream; virInterfaceClass; -virNetworkPortClass; virNewConnectCloseCallbackData; virNodeDeviceClass; virSecretClass; diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c index ee6bbb24d0..9f5aee07cd 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -7199,7 +7199,7 @@ remoteDispatchNetworkPortGetParameters(virNetServerPtr server G_GNUC_UNUSED, cleanup: if (rv < 0) virNetMessageSaveError(rerr); - virObjectUnref(port); + g_object_unref(port); virTypedParamsFree(params, nparams); return rv; } -- 2.25.1

On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
@@ -482,14 +495,14 @@ virNetworkFinalize(GObject *obj) * @uuid: pointer to the uuid * * Allocates a new network port object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the network port object, or NULL on error. */ virNetworkPortPtr virGetNetworkPort(virNetworkPtr net, const unsigned char *uuid) { - virNetworkPortPtr ret = NULL; + g_autoptr(virNetworkPort) ret = NULL;
if (virDataTypesInitialize() < 0) return NULL; @@ -497,21 +510,19 @@ virGetNetworkPort(virNetworkPtr net, const unsigned char *uuid) virCheckNetworkGoto(net, error); virCheckNonNullArgGoto(uuid, error);
- if (!(ret = virObjectNew(virNetworkPortClass))) - goto error; + ret = VIR_NETWORK_PORT(g_object_new(VIR_TYPE_NETWORK_PORT, NULL));
ret->net = g_object_ref(net); memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
- return ret; + return g_steal_pointer(&ret);
error: - virObjectUnref(ret); return NULL; }
As far as I can tell, you removed the only 'goto error' statement from this function, so the error: label can be removed completely.

On Wed, Apr 8, 2020 at 11:37 PM Jonathon Jongsma <jjongsma@redhat.com> wrote:
On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
@@ -482,14 +495,14 @@ virNetworkFinalize(GObject *obj) * @uuid: pointer to the uuid * * Allocates a new network port object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the network port object, or NULL on error. */ virNetworkPortPtr virGetNetworkPort(virNetworkPtr net, const unsigned char *uuid) { - virNetworkPortPtr ret = NULL; + g_autoptr(virNetworkPort) ret = NULL;
if (virDataTypesInitialize() < 0) return NULL; @@ -497,21 +510,19 @@ virGetNetworkPort(virNetworkPtr net, const unsigned char *uuid) virCheckNetworkGoto(net, error); virCheckNonNullArgGoto(uuid, error);
- if (!(ret = virObjectNew(virNetworkPortClass))) - goto error; + ret = VIR_NETWORK_PORT(g_object_new(VIR_TYPE_NETWORK_PORT, NULL));
ret->net = g_object_ref(net); memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
- return ret; + return g_steal_pointer(&ret);
error: - virObjectUnref(ret); return NULL; }
As far as I can tell, you removed the only 'goto error' statement from this function, so the error: label can be removed completely.
Not really because of the virCheckNetworkGoto and virCheckNonNullArgGoto macros. However, I can change them 's/Goto/Return/' so thanks for pointing that out. Att. -- Rafael Fonseca

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/virinterfaceobj.c | 7 ++-- src/datatypes.c | 44 +++++++++++++++---------- src/datatypes.h | 10 +++--- src/interface/interface_backend_netcf.c | 2 +- src/interface/interface_backend_udev.c | 2 +- src/libvirt-interface.c | 6 ++-- src/libvirt_private.syms | 1 - 7 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c index 43ba395d2b..da6c56862b 100644 --- a/src/conf/virinterfaceobj.c +++ b/src/conf/virinterfaceobj.c @@ -338,9 +338,10 @@ virInterfaceObjListExport(virConnectPtr conn, ret = data.nifaces; cleanup: virObjectRWUnlock(ifaceobjs); - while (data.ifaces && data.nifaces) - virObjectUnref(data.ifaces[--data.nifaces]); - + while (data.ifaces && data.nifaces) { + if (data.ifaces[--data.nifaces]) + g_object_unref(data.ifaces[data.nifaces]); + } VIR_FREE(data.ifaces); return ret; } diff --git a/src/datatypes.c b/src/datatypes.c index e715c37306..f1bcca44f1 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -36,7 +36,6 @@ VIR_LOG_INIT("datatypes"); virClassPtr virConnectClass; virClassPtr virConnectCloseCallbackDataClass; virClassPtr virDomainClass; -virClassPtr virInterfaceClass; virClassPtr virNodeDeviceClass; virClassPtr virSecretClass; virClassPtr virStreamClass; @@ -46,7 +45,6 @@ virClassPtr virStoragePoolClass; static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); static void virDomainDispose(void *obj); -static void virInterfaceDispose(void *obj); static void virNodeDeviceDispose(void *obj); static void virSecretDispose(void *obj); static void virStreamDispose(void *obj); @@ -85,6 +83,22 @@ vir_domain_snapshot_class_init(virDomainSnapshotClass *klass) obj->finalize = virDomainSnapshotFinalize; } +G_DEFINE_TYPE(virInterface, vir_interface, G_TYPE_OBJECT); +static void virInterfaceFinalize(GObject *obj); + +static void +vir_interface_init(virInterface *iface G_GNUC_UNUSED) +{ +} + +static void +vir_interface_class_init(virInterfaceClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virInterfaceFinalize; +} + G_DEFINE_TYPE(virNetwork, vir_network, G_TYPE_OBJECT); static void virNetworkFinalize(GObject *obj); @@ -201,7 +215,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virConnect); DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData); DECLARE_CLASS(virDomain); - DECLARE_CLASS(virInterface); DECLARE_CLASS(virNodeDevice); DECLARE_CLASS(virSecret); DECLARE_CLASS(virStream); @@ -553,42 +566,37 @@ virNetworkPortFinalize(GObject *obj) * @mac: pointer to the mac * * Allocates a new interface object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the interface object, or NULL on error. */ virInterfacePtr virGetInterface(virConnectPtr conn, const char *name, const char *mac) { - virInterfacePtr ret = NULL; + g_autoptr(virInterface) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; - virCheckConnectGoto(conn, error); - virCheckNonNullArgGoto(name, error); + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgReturn(name, NULL); /* a NULL mac from caller is okay. Treat it as blank */ if (mac == NULL) mac = ""; - if (!(ret = virObjectNew(virInterfaceClass))) - goto error; + ret = VIR_INTERFACE(g_object_new(VIR_TYPE_INTERFACE, NULL)); ret->name = g_strdup(name); ret->mac = g_strdup(mac); ret->conn = virObjectRef(conn); - return ret; - - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } /** - * virInterfaceDispose: + * virInterfaceFinalize: * @obj: the interface to release * * Unconditionally release all memory associated with an interface. @@ -598,14 +606,16 @@ virGetInterface(virConnectPtr conn, const char *name, const char *mac) * which may also be released if its ref count hits zero. */ static void -virInterfaceDispose(void *obj) +virInterfaceFinalize(GObject *obj) { - virInterfacePtr iface = obj; + virInterfacePtr iface = VIR_INTERFACE(obj); VIR_DEBUG("release interface %p %s", iface, iface->name); VIR_FREE(iface->name); VIR_FREE(iface->mac); virObjectUnref(iface->conn); + + G_OBJECT_CLASS(vir_interface_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index a544a7a347..c68a0e9265 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -32,7 +32,6 @@ extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; -extern virClassPtr virInterfaceClass; extern virClassPtr virNodeDeviceClass; extern virClassPtr virSecretClass; extern virClassPtr virStreamClass; @@ -54,6 +53,9 @@ G_DECLARE_FINAL_TYPE(virDomainSnapshot, DOMAIN_SNAPSHOT, GObject); +#define VIR_TYPE_INTERFACE vir_interface_get_type() +G_DECLARE_FINAL_TYPE(virInterface, vir_interface, VIR, INTERFACE, GObject); + #define VIR_TYPE_NETWORK vir_network_get_type() G_DECLARE_FINAL_TYPE(virNetwork, vir_network, VIR, NETWORK, GObject); @@ -176,8 +178,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckInterfaceReturn(obj, retval) \ do { \ - virInterfacePtr _iface = (obj); \ - if (!virObjectIsClass(_iface, virInterfaceClass) || \ + virInterfacePtr _iface = VIR_INTERFACE(obj); \ + if (!G_IS_OBJECT(_iface) || !(G_OBJECT_TYPE(_iface) == VIR_TYPE_INTERFACE) || \ !virObjectIsClass(_iface->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_INTERFACE, \ VIR_ERR_INVALID_INTERFACE, \ @@ -670,7 +672,7 @@ struct _virNetworkPort { * Internal structure associated to a physical host interface */ struct _virInterface { - virObject parent; + GObject parent; virConnectPtr conn; /* pointer back to the connection */ char *name; /* the network external name */ char *mac; /* the interface MAC address */ diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c index dd0c1481d9..dbf21088fd 100644 --- a/src/interface/interface_backend_netcf.c +++ b/src/interface/interface_backend_netcf.c @@ -740,7 +740,7 @@ netcfConnectListAllInterfaces(virConnectPtr conn, if (tmp_iface_objs) { for (i = 0; i < niface_objs; i++) - virObjectUnref(tmp_iface_objs[i]); + g_object_unref(tmp_iface_objs[i]); VIR_FREE(tmp_iface_objs); } diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c index e388f98536..6fc9ca840e 100644 --- a/src/interface/interface_backend_udev.c +++ b/src/interface/interface_backend_udev.c @@ -421,7 +421,7 @@ udevConnectListAllInterfaces(virConnectPtr conn, if (ifaces) { for (tmp_count = 0; tmp_count < count; tmp_count++) - virObjectUnref(ifaces_list[tmp_count]); + g_object_unref(ifaces_list[tmp_count]); } VIR_FREE(ifaces_list); diff --git a/src/libvirt-interface.c b/src/libvirt-interface.c index 2d2df68131..0fd0ce7154 100644 --- a/src/libvirt-interface.c +++ b/src/libvirt-interface.c @@ -642,13 +642,13 @@ virInterfaceDestroy(virInterfacePtr iface, unsigned int flags) int virInterfaceRef(virInterfacePtr iface) { - VIR_DEBUG("iface=%p refs=%d", iface, iface ? iface->parent.u.s.refs : 0); + VIR_DEBUG("iface=%p", iface); virResetLastError(); virCheckInterfaceReturn(iface, -1); - virObjectRef(iface); + g_object_ref(iface); return 0; } @@ -671,7 +671,7 @@ virInterfaceFree(virInterfacePtr iface) virCheckInterfaceReturn(iface, -1); - virObjectUnref(iface); + g_object_unref(iface); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9530b7a254..a5e4b00a0e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1364,7 +1364,6 @@ virGetSecret; virGetStoragePool; virGetStorageVol; virGetStream; -virInterfaceClass; virNewConnectCloseCallbackData; virNodeDeviceClass; virSecretClass; -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/storage_event.c | 15 ++++------ src/conf/virstorageobj.c | 8 ++++- src/datatypes.c | 46 ++++++++++++++++++----------- src/datatypes.h | 15 +++++----- src/libvirt-storage.c | 6 ++-- src/libvirt_private.syms | 1 - src/qemu/qemu_migration.c | 3 +- src/remote/remote_daemon_dispatch.c | 2 +- src/remote/remote_driver.c | 4 +-- src/vz/vz_sdk.c | 3 +- 10 files changed, 57 insertions(+), 46 deletions(-) diff --git a/src/conf/storage_event.c b/src/conf/storage_event.c index de36ec3af9..e18069f718 100644 --- a/src/conf/storage_event.c +++ b/src/conf/storage_event.c @@ -110,10 +110,10 @@ virStoragePoolEventDispatchDefaultFunc(virConnectPtr conn, virConnectObjectEventGenericCallback cb, void *cbopaque) { - virStoragePoolPtr pool = virGetStoragePool(conn, - event->meta.name, - event->meta.uuid, - NULL, NULL); + g_autoptr(virStoragePool) pool = virGetStoragePool(conn, + event->meta.name, + event->meta.uuid, + NULL, NULL); if (!pool) return; @@ -127,23 +127,20 @@ virStoragePoolEventDispatchDefaultFunc(virConnectPtr conn, storagePoolLifecycleEvent->type, storagePoolLifecycleEvent->detail, cbopaque); - goto cleanup; + return; } case VIR_STORAGE_POOL_EVENT_ID_REFRESH: { ((virConnectStoragePoolEventGenericCallback)cb)(conn, pool, cbopaque); - goto cleanup; + return; } case VIR_STORAGE_POOL_EVENT_ID_LAST: break; } VIR_WARN("Unexpected event ID %d", event->eventID); - - cleanup: - virObjectUnref(pool); } diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index 5cbd30f93c..bff6eb6ae1 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -2095,6 +2095,12 @@ virStoragePoolObjListExport(virConnectPtr conn, return data.nPools; error: - virObjectListFree(data.pools); + if (data.pools) { + while (data.nPools--) { + if (data.pools[data.nPools]) + g_object_unref(data.pools[data.nPools]); + } + } + VIR_FREE(data.pools); return -1; } diff --git a/src/datatypes.c b/src/datatypes.c index f1bcca44f1..e434c31785 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -40,7 +40,6 @@ virClassPtr virNodeDeviceClass; virClassPtr virSecretClass; virClassPtr virStreamClass; virClassPtr virStorageVolClass; -virClassPtr virStoragePoolClass; static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); @@ -49,7 +48,6 @@ static void virNodeDeviceDispose(void *obj); static void virSecretDispose(void *obj); static void virStreamDispose(void *obj); static void virStorageVolDispose(void *obj); -static void virStoragePoolDispose(void *obj); G_DEFINE_TYPE(virDomainCheckpoint, vir_domain_checkpoint, G_TYPE_OBJECT); static void virDomainCheckpointFinalize(GObject *obj); @@ -163,6 +161,22 @@ vir_nw_filter_binding_class_init(virNWFilterBindingClass *klass) obj->finalize = virNWFilterBindingFinalize; } +G_DEFINE_TYPE(virStoragePool, vir_storage_pool, G_TYPE_OBJECT); +static void virStoragePoolFinalize(GObject *obj); + +static void +vir_storage_pool_init(virStoragePool *pool G_GNUC_UNUSED) +{ +} + +static void +vir_storage_pool_class_init(virStoragePoolClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virStoragePoolFinalize; +} + virClassPtr virAdmConnectClass; virClassPtr virAdmConnectCloseCallbackDataClass; @@ -219,7 +233,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS(virSecret); DECLARE_CLASS(virStream); DECLARE_CLASS(virStorageVol); - DECLARE_CLASS(virStoragePool); DECLARE_CLASS_LOCKABLE(virAdmConnect); DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData); @@ -628,7 +641,7 @@ virInterfaceFinalize(GObject *obj) * @freeFunc: private data cleanup function pointer specific to driver * * Allocates a new storage pool object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the storage pool object, or NULL on error. */ @@ -637,17 +650,16 @@ virGetStoragePool(virConnectPtr conn, const char *name, const unsigned char *uuid, void *privateData, virFreeCallback freeFunc) { - virStoragePoolPtr ret = NULL; + g_autoptr(virStoragePool) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; - virCheckConnectGoto(conn, error); - virCheckNonNullArgGoto(name, error); - virCheckNonNullArgGoto(uuid, error); + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgReturn(name, NULL); + virCheckNonNullArgReturn(uuid, NULL); - if (!(ret = virObjectNew(virStoragePoolClass))) - goto error; + ret = VIR_STORAGE_POOL(g_object_new(VIR_TYPE_STORAGE_POOL, NULL)); ret->name = g_strdup(name); @@ -658,16 +670,12 @@ virGetStoragePool(virConnectPtr conn, const char *name, ret->privateData = privateData; ret->privateDataFreeFunc = freeFunc; - return ret; - - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } /** - * virStoragePoolDispose: + * virStoragePoolFinalize: * @obj: the storage pool to release * * Unconditionally release all memory associated with a pool. @@ -677,9 +685,9 @@ virGetStoragePool(virConnectPtr conn, const char *name, * which may also be released if its ref count hits zero. */ static void -virStoragePoolDispose(void *obj) +virStoragePoolFinalize(GObject *obj) { - virStoragePoolPtr pool = obj; + virStoragePoolPtr pool = VIR_STORAGE_POOL(obj); char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(pool->uuid, uuidstr); @@ -690,6 +698,8 @@ virStoragePoolDispose(void *obj) VIR_FREE(pool->name); virObjectUnref(pool->conn); + + G_OBJECT_CLASS(vir_storage_pool_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index c68a0e9265..a630472f6e 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -36,7 +36,6 @@ extern virClassPtr virNodeDeviceClass; extern virClassPtr virSecretClass; extern virClassPtr virStreamClass; extern virClassPtr virStorageVolClass; -extern virClassPtr virStoragePoolClass; #define VIR_TYPE_DOMAIN_CHECKPOINT vir_domain_checkpoint_get_type() @@ -72,6 +71,9 @@ G_DECLARE_FINAL_TYPE(virNWFilterBinding, NW_FILTER_BINDING, GObject); +#define VIR_TYPE_STORAGE_POOL vir_storage_pool_get_type() +G_DECLARE_FINAL_TYPE(virStoragePool, vir_storage_pool, VIR, STORAGE_POOL, GObject); + extern virClassPtr virAdmConnectClass; #define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -192,8 +194,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckStoragePoolReturn(obj, retval) \ do { \ - virStoragePoolPtr _pool = (obj); \ - if (!virObjectIsClass(_pool, virStoragePoolClass) || \ + virStoragePoolPtr _pool = VIR_STORAGE_POOL(obj); \ + if (!G_IS_OBJECT(_pool) || !(G_OBJECT_TYPE(_pool) == VIR_TYPE_STORAGE_POOL) || \ !virObjectIsClass(_pool->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_STORAGE, \ VIR_ERR_INVALID_STORAGE_POOL, \ @@ -206,8 +208,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckStoragePoolGoto(obj, label) \ do { \ - virStoragePoolPtr _pool= (obj); \ - if (!virObjectIsClass(_pool, virStoragePoolClass) || \ + virStoragePoolPtr _pool= VIR_STORAGE_POOL(obj); \ + if (!G_IS_OBJECT(_pool) || !(G_OBJECT_TYPE(_pool) == VIR_TYPE_STORAGE_POOL) || \ !virObjectIsClass(_pool->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_STORAGE, \ VIR_ERR_INVALID_STORAGE_POOL, \ @@ -684,7 +686,7 @@ struct _virInterface { * Internal structure associated to a storage pool */ struct _virStoragePool { - virObject parent; + GObject parent; virConnectPtr conn; /* pointer back to the connection */ char *name; /* the storage pool external name */ unsigned char uuid[VIR_UUID_BUFLEN]; /* the storage pool unique identifier */ @@ -697,7 +699,6 @@ struct _virStoragePool { virFreeCallback privateDataFreeFunc; }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virStoragePool, virObjectUnref); /** diff --git a/src/libvirt-storage.c b/src/libvirt-storage.c index 0406fe84d3..b88b2162de 100644 --- a/src/libvirt-storage.c +++ b/src/libvirt-storage.c @@ -846,7 +846,7 @@ virStoragePoolFree(virStoragePoolPtr pool) virCheckStoragePoolReturn(pool, -1); - virObjectUnref(pool); + g_object_unref(pool); return 0; } @@ -872,13 +872,13 @@ virStoragePoolFree(virStoragePoolPtr pool) int virStoragePoolRef(virStoragePoolPtr pool) { - VIR_DEBUG("pool=%p refs=%d", pool, pool ? pool->parent.u.s.refs : 0); + VIR_DEBUG("pool=%p", pool); virResetLastError(); virCheckStoragePoolReturn(pool, -1); - virObjectRef(pool); + g_object_ref(pool); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a5e4b00a0e..f48ed05684 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1367,7 +1367,6 @@ virGetStream; virNewConnectCloseCallbackData; virNodeDeviceClass; virSecretClass; -virStoragePoolClass; virStorageVolClass; virStreamClass; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index bc280e856a..de65c730f7 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -174,7 +174,7 @@ qemuMigrationDstPrecreateDisk(virConnectPtr conn, unsigned long long capacity) { int ret = -1; - virStoragePoolPtr pool = NULL; + g_autoptr(virStoragePool) pool = NULL; virStorageVolPtr vol = NULL; char *volName = NULL, *basePath = NULL; char *volStr = NULL; @@ -269,7 +269,6 @@ qemuMigrationDstPrecreateDisk(virConnectPtr conn, VIR_FREE(basePath); VIR_FREE(volStr); virObjectUnref(vol); - virObjectUnref(pool); return ret; } diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c index 9f5aee07cd..9f367bc515 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -6196,7 +6196,7 @@ remoteDispatchConnectStoragePoolEventRegisterAny(virNetServerPtr server G_GNUC_U remoteEventCallbackFree(callback); if (rv < 0) virNetMessageSaveError(rerr); - virObjectUnref(pool); + g_object_unref(pool); return rv; } diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index f19061200c..f5d7842104 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -5493,7 +5493,7 @@ remoteStoragePoolBuildEventLifecycle(virNetClientProgramPtr prog G_GNUC_UNUSED, event = virStoragePoolEventLifecycleNew(pool->name, pool->uuid, msg->event, msg->detail); - virObjectUnref(pool); + g_object_unref(pool); virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackID); } @@ -5514,7 +5514,7 @@ remoteStoragePoolBuildEventRefresh(virNetClientProgramPtr prog G_GNUC_UNUSED, return; event = virStoragePoolEventRefreshNew(pool->name, pool->uuid); - virObjectUnref(pool); + g_object_unref(pool); virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackID); } diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 9cee6f1fde..ed3d5ee2c0 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -4081,7 +4081,7 @@ prlsdkCreateVm(vzDriverPtr driver, virDomainDefPtr def) static int virStorageTranslatePoolLocal(virConnectPtr conn, virStorageSourcePtr src) { - virStoragePoolPtr pool = NULL; + g_autoptr(virStoragePool) pool = NULL; virStorageVolPtr vol = NULL; virStorageVolInfo info; int ret = -1; @@ -4115,7 +4115,6 @@ virStorageTranslatePoolLocal(virConnectPtr conn, virStorageSourcePtr src) ret = 0; cleanup: - virObjectUnref(pool); virObjectUnref(vol); return ret; } -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/virstorageobj.c | 8 +++++- src/datatypes.c | 48 ++++++++++++++++++++++-------------- src/datatypes.h | 15 +++++------ src/libvirt-storage.c | 6 ++--- src/libvirt_private.syms | 1 - src/qemu/qemu_migration.c | 3 +-- src/storage/storage_driver.c | 7 +++--- src/vz/vz_sdk.c | 19 ++++++-------- 8 files changed, 58 insertions(+), 49 deletions(-) diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index bff6eb6ae1..698fc25c5f 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -1052,7 +1052,13 @@ virStoragePoolObjVolumeListExport(virConnectPtr conn, return data.nvols; error: - virObjectListFree(data.vols); + if (data.vols) { + while (data.nvols--) { + if (data.vols[data.nvols]) + g_object_unref(data.vols[data.nvols]); + } + VIR_FREE(data.vols); + } return -1; } diff --git a/src/datatypes.c b/src/datatypes.c index e434c31785..1f811e5f5e 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -39,7 +39,6 @@ virClassPtr virDomainClass; virClassPtr virNodeDeviceClass; virClassPtr virSecretClass; virClassPtr virStreamClass; -virClassPtr virStorageVolClass; static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); @@ -47,7 +46,6 @@ static void virDomainDispose(void *obj); static void virNodeDeviceDispose(void *obj); static void virSecretDispose(void *obj); static void virStreamDispose(void *obj); -static void virStorageVolDispose(void *obj); G_DEFINE_TYPE(virDomainCheckpoint, vir_domain_checkpoint, G_TYPE_OBJECT); static void virDomainCheckpointFinalize(GObject *obj); @@ -177,6 +175,22 @@ vir_storage_pool_class_init(virStoragePoolClass *klass) obj->finalize = virStoragePoolFinalize; } +G_DEFINE_TYPE(virStorageVol, vir_storage_vol, G_TYPE_OBJECT); +static void virStorageVolFinalize(GObject *obj); + +static void +vir_storage_vol_init(virStorageVol *vol G_GNUC_UNUSED) +{ +} + +static void +vir_storage_vol_class_init(virStorageVolClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virStorageVolFinalize; +} + virClassPtr virAdmConnectClass; virClassPtr virAdmConnectCloseCallbackDataClass; @@ -232,7 +246,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS(virNodeDevice); DECLARE_CLASS(virSecret); DECLARE_CLASS(virStream); - DECLARE_CLASS(virStorageVol); DECLARE_CLASS_LOCKABLE(virAdmConnect); DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData); @@ -713,7 +726,7 @@ virStoragePoolFinalize(GObject *obj) * @freeFunc: private data cleanup function pointer specific to driver * * Allocates a new storage volume object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the storage volume object, or NULL on error. */ @@ -721,18 +734,17 @@ virStorageVolPtr virGetStorageVol(virConnectPtr conn, const char *pool, const char *name, const char *key, void *privateData, virFreeCallback freeFunc) { - virStorageVolPtr ret = NULL; + g_autoptr(virStorageVol) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; - virCheckConnectGoto(conn, error); - virCheckNonNullArgGoto(pool, error); - virCheckNonNullArgGoto(name, error); - virCheckNonNullArgGoto(key, error); + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgReturn(pool, NULL); + virCheckNonNullArgReturn(name, NULL); + virCheckNonNullArgReturn(key, NULL); - if (!(ret = virObjectNew(virStorageVolClass))) - goto error; + ret = VIR_STORAGE_VOL(g_object_new(VIR_TYPE_STORAGE_VOL, NULL)); ret->pool = g_strdup(pool); ret->name = g_strdup(name); @@ -744,16 +756,12 @@ virGetStorageVol(virConnectPtr conn, const char *pool, const char *name, ret->privateData = privateData; ret->privateDataFreeFunc = freeFunc; - return ret; - - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } /** - * virStorageVolDispose: + * virStorageVolFinalize: * @obj: the storage volume to release * * Unconditionally release all memory associated with a volume. @@ -763,9 +771,9 @@ virGetStorageVol(virConnectPtr conn, const char *pool, const char *name, * which may also be released if its ref count hits zero. */ static void -virStorageVolDispose(void *obj) +virStorageVolFinalize(GObject *obj) { - virStorageVolPtr vol = obj; + virStorageVolPtr vol = VIR_STORAGE_VOL(obj); VIR_DEBUG("release vol %p %s", vol, vol->name); if (vol->privateDataFreeFunc) @@ -775,6 +783,8 @@ virStorageVolDispose(void *obj) VIR_FREE(vol->name); VIR_FREE(vol->pool); virObjectUnref(vol->conn); + + G_OBJECT_CLASS(vir_storage_vol_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index a630472f6e..7fab565a7c 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -35,7 +35,6 @@ extern virClassPtr virDomainClass; extern virClassPtr virNodeDeviceClass; extern virClassPtr virSecretClass; extern virClassPtr virStreamClass; -extern virClassPtr virStorageVolClass; #define VIR_TYPE_DOMAIN_CHECKPOINT vir_domain_checkpoint_get_type() @@ -74,6 +73,9 @@ G_DECLARE_FINAL_TYPE(virNWFilterBinding, #define VIR_TYPE_STORAGE_POOL vir_storage_pool_get_type() G_DECLARE_FINAL_TYPE(virStoragePool, vir_storage_pool, VIR, STORAGE_POOL, GObject); +#define VIR_TYPE_STORAGE_VOL vir_storage_vol_get_type() +G_DECLARE_FINAL_TYPE(virStorageVol, vir_storage_vol, VIR, STORAGE_VOL, GObject); + extern virClassPtr virAdmConnectClass; #define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -221,8 +223,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckStorageVolReturn(obj, retval) \ do { \ - virStorageVolPtr _vol = (obj); \ - if (!virObjectIsClass(_vol, virStorageVolClass) || \ + virStorageVolPtr _vol = VIR_STORAGE_VOL(obj); \ + if (!G_IS_OBJECT(_vol) || !(G_OBJECT_TYPE(_vol) == VIR_TYPE_STORAGE_VOL) || \ !virObjectIsClass(_vol->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_STORAGE, \ VIR_ERR_INVALID_STORAGE_VOL, \ @@ -234,8 +236,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); } while (0) #define virCheckStorageVolGoto(obj, label) \ do { \ - virStorageVolPtr _vol = (obj); \ - if (!virObjectIsClass(_vol, virStorageVolClass) || \ + virStorageVolPtr _vol = VIR_STORAGE_VOL(obj); \ + if (!G_IS_OBJECT(_vol) || !(G_OBJECT_TYPE(_vol) == VIR_TYPE_STORAGE_VOL) || \ !virObjectIsClass(_vol->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_STORAGE, \ VIR_ERR_INVALID_STORAGE_VOL, \ @@ -707,7 +709,7 @@ struct _virStoragePool { * Internal structure associated to a storage volume */ struct _virStorageVol { - virObject parent; + GObject parent; virConnectPtr conn; /* pointer back to the connection */ char *pool; /* Pool name of owner */ char *name; /* the storage vol external name */ @@ -721,7 +723,6 @@ struct _virStorageVol { virFreeCallback privateDataFreeFunc; }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virStorageVol, virObjectUnref); /** diff --git a/src/libvirt-storage.c b/src/libvirt-storage.c index b88b2162de..53ad9eeec6 100644 --- a/src/libvirt-storage.c +++ b/src/libvirt-storage.c @@ -1884,7 +1884,7 @@ virStorageVolFree(virStorageVolPtr vol) virCheckStorageVolReturn(vol, -1); - virObjectUnref(vol); + g_object_unref(vol); return 0; } @@ -1909,13 +1909,13 @@ virStorageVolFree(virStorageVolPtr vol) int virStorageVolRef(virStorageVolPtr vol) { - VIR_DEBUG("vol=%p refs=%d", vol, vol ? vol->parent.u.s.refs : 0); + VIR_DEBUG("vol=%p", vol); virResetLastError(); virCheckStorageVolReturn(vol, -1); - virObjectRef(vol); + g_object_ref(vol); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f48ed05684..7bee97f2dc 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1367,7 +1367,6 @@ virGetStream; virNewConnectCloseCallbackData; virNodeDeviceClass; virSecretClass; -virStorageVolClass; virStreamClass; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index de65c730f7..07e137e2c9 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -175,7 +175,7 @@ qemuMigrationDstPrecreateDisk(virConnectPtr conn, { int ret = -1; g_autoptr(virStoragePool) pool = NULL; - virStorageVolPtr vol = NULL; + g_autoptr(virStorageVol) vol = NULL; char *volName = NULL, *basePath = NULL; char *volStr = NULL; virBuffer buf = VIR_BUFFER_INITIALIZER; @@ -268,7 +268,6 @@ qemuMigrationDstPrecreateDisk(virConnectPtr conn, cleanup: VIR_FREE(basePath); VIR_FREE(volStr); - virObjectUnref(vol); return ret; } diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 2db763caa5..8c0f7eae44 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1892,7 +1892,8 @@ storageVolCreateXML(virStoragePoolPtr pool, virStoragePoolObjPtr obj; virStoragePoolDefPtr def; virStorageBackendPtr backend; - virStorageVolPtr vol = NULL, newvol = NULL; + virStorageVolPtr vol = NULL; + g_autoptr(virStorageVol) newvol = NULL; g_autoptr(virStorageVolDef) voldef = NULL; virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, NULL); @@ -2012,7 +2013,6 @@ storageVolCreateXML(virStoragePoolPtr pool, voldef = NULL; cleanup: - virObjectUnref(newvol); virStoragePoolObjEndAPI(&obj); return vol; } @@ -2029,7 +2029,7 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, virStorageBackendPtr backend; virStorageVolDefPtr voldefsrc = NULL; virStorageVolDefPtr shadowvol = NULL; - virStorageVolPtr newvol = NULL; + g_autoptr(virStorageVol) newvol = NULL; virStorageVolPtr vol = NULL; int buildret; g_autoptr(virStorageVolDef) voldef = NULL; @@ -2204,7 +2204,6 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, voldef = NULL; cleanup: - virObjectUnref(newvol); VIR_FREE(shadowvol); virStoragePoolObjEndAPI(&obj); virStoragePoolObjEndAPI(&objsrc); diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index ed3d5ee2c0..17d8f9d94b 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -4082,9 +4082,8 @@ static int virStorageTranslatePoolLocal(virConnectPtr conn, virStorageSourcePtr src) { g_autoptr(virStoragePool) pool = NULL; - virStorageVolPtr vol = NULL; + g_autoptr(virStorageVol) vol = NULL; virStorageVolInfo info; - int ret = -1; if (!(pool = virStoragePoolLookupByName(conn, src->srcpool->pool))) return -1; @@ -4093,30 +4092,26 @@ virStorageTranslatePoolLocal(virConnectPtr conn, virStorageSourcePtr src) _("storage pool '%s' containing volume '%s' " "is not active"), src->srcpool->pool, src->srcpool->volume); - goto cleanup; + return -1; } if (!(vol = virStorageVolLookupByName(pool, src->srcpool->volume))) - goto cleanup; + return -1; if (virStorageVolGetInfo(vol, &info) < 0) - goto cleanup; + return -1; if (info.type != VIR_STORAGE_VOL_PLOOP) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported volume format '%s'"), virStorageVolTypeToString(info.type)); - goto cleanup; + return -1; } if (!(src->path = virStorageVolGetPath(vol))) - goto cleanup; - - ret = 0; + return -1; - cleanup: - virObjectUnref(vol); - return ret; + return 0; } -- 2.25.1

On Fri, 2020-04-03 at 17:15 +0200, Rafael Fonseca wrote:
--- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -1052,7 +1052,13 @@ virStoragePoolObjVolumeListExport(virConnectPtr conn, return data.nvols;
error: - virObjectListFree(data.vols); + if (data.vols) { + while (data.nvols--) { + if (data.vols[data.nvols]) + g_object_unref(data.vols[data.nvols]); + } + VIR_FREE(data.vols); + } return -1; }
This pattern has been repeated several times now. Is it worth adding a helper function that's equivalent to virObjectListFree but for GObjects?

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/node_device_event.c | 9 +++----- src/conf/node_device_util.c | 4 ++-- src/conf/virnodedeviceobj.c | 10 ++++++-- src/datatypes.c | 44 ++++++++++++++++++++++-------------- src/datatypes.h | 14 +++++++----- src/libvirt-nodedev.c | 6 ++--- src/libvirt_private.syms | 1 - src/libxl/libxl_driver.c | 9 +++----- src/qemu/qemu_driver.c | 9 +++----- src/remote/remote_driver.c | 4 ++-- src/rpc/gendispatch.pl | 2 +- src/test/test_driver.c | 2 +- 12 files changed, 61 insertions(+), 53 deletions(-) diff --git a/src/conf/node_device_event.c b/src/conf/node_device_event.c index c6915be593..cc2cdd9352 100644 --- a/src/conf/node_device_event.c +++ b/src/conf/node_device_event.c @@ -110,7 +110,7 @@ virNodeDeviceEventDispatchDefaultFunc(virConnectPtr conn, virConnectObjectEventGenericCallback cb, void *cbopaque) { - virNodeDevicePtr dev = virGetNodeDevice(conn, + g_autoptr(virNodeDevice) dev = virGetNodeDevice(conn, event->meta.name); if (!dev) @@ -126,23 +126,20 @@ virNodeDeviceEventDispatchDefaultFunc(virConnectPtr conn, nodeDeviceLifecycleEvent->type, nodeDeviceLifecycleEvent->detail, cbopaque); - goto cleanup; + return; } case VIR_NODE_DEVICE_EVENT_ID_UPDATE: { ((virConnectNodeDeviceEventGenericCallback)cb)(conn, dev, cbopaque); - goto cleanup; + return; } case VIR_NODE_DEVICE_EVENT_ID_LAST: break; } VIR_WARN("Unexpected event ID %d", event->eventID); - - cleanup: - virObjectUnref(dev); } diff --git a/src/conf/node_device_util.c b/src/conf/node_device_util.c index 5e80422d7f..0b9292ffd3 100644 --- a/src/conf/node_device_util.c +++ b/src/conf/node_device_util.c @@ -20,6 +20,7 @@ #include "internal.h" +#include "datatypes.h" #include "node_device_util.h" #include "virlog.h" #include "virscsihost.h" @@ -45,7 +46,7 @@ char * virNodeDeviceGetParentName(virConnectPtr conn, const char *nodedev_name) { - virNodeDevicePtr device = NULL; + g_autoptr(virNodeDevice) device = NULL; char *parent; if (!(device = virNodeDeviceLookupByName(conn, nodedev_name))) { @@ -56,7 +57,6 @@ virNodeDeviceGetParentName(virConnectPtr conn, } parent = g_strdup(virNodeDeviceGetParent(device)); - virObjectUnref(device); return parent; } diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c index 3a34a324ca..5ee2db8b01 100644 --- a/src/conf/virnodedeviceobj.c +++ b/src/conf/virnodedeviceobj.c @@ -866,7 +866,6 @@ virNodeDeviceObjListExportCallback(void *payload, virNodeDeviceObjMatch(obj, data->flags)) { if (data->devices) { if (!(device = virGetNodeDevice(data->conn, def->name))) { - virObjectUnref(device); data->error = true; goto cleanup; } @@ -914,7 +913,14 @@ virNodeDeviceObjListExport(virConnectPtr conn, return data.ndevices; cleanup: - virObjectListFree(data.devices); + if (data.devices) { + while (data.ndevices--) { + if (data.devices[data.ndevices]) + g_object_unref(data.devices[data.ndevices]); + } + } + VIR_FREE(data.devices); + return -1; } diff --git a/src/datatypes.c b/src/datatypes.c index 1f811e5f5e..43767b9fb5 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -36,14 +36,12 @@ VIR_LOG_INIT("datatypes"); virClassPtr virConnectClass; virClassPtr virConnectCloseCallbackDataClass; virClassPtr virDomainClass; -virClassPtr virNodeDeviceClass; virClassPtr virSecretClass; virClassPtr virStreamClass; static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); static void virDomainDispose(void *obj); -static void virNodeDeviceDispose(void *obj); static void virSecretDispose(void *obj); static void virStreamDispose(void *obj); @@ -127,6 +125,22 @@ vir_network_port_class_init(virNetworkPortClass *klass) obj->finalize = virNetworkPortFinalize; } +G_DEFINE_TYPE(virNodeDevice, vir_node_device, G_TYPE_OBJECT); +static void virNodeDeviceFinalize(GObject *obj); + +static void +vir_node_device_init(virNodeDevice *dev G_GNUC_UNUSED) +{ +} + +static void +vir_node_device_class_init(virNodeDeviceClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virNodeDeviceFinalize; +} + G_DEFINE_TYPE(virNWFilter, vir_nw_filter, G_TYPE_OBJECT); static void virNWFilterFinalize(GObject *obj); @@ -243,7 +257,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virConnect); DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData); DECLARE_CLASS(virDomain); - DECLARE_CLASS(virNodeDevice); DECLARE_CLASS(virSecret); DECLARE_CLASS(virStream); @@ -794,37 +807,32 @@ virStorageVolFinalize(GObject *obj) * @name: device name (unique on node) * * Allocates a new node device object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the node device object, or NULL on error. */ virNodeDevicePtr virGetNodeDevice(virConnectPtr conn, const char *name) { - virNodeDevicePtr ret = NULL; + g_autoptr(virNodeDevice) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; - virCheckConnectGoto(conn, error); - virCheckNonNullArgGoto(name, error); + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgReturn(name, NULL); - if (!(ret = virObjectNew(virNodeDeviceClass))) - goto error; + ret = VIR_NODE_DEVICE(g_object_new(VIR_TYPE_NODE_DEVICE, NULL)); ret->name = g_strdup(name); ret->conn = virObjectRef(conn); - return ret; - - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } /** - * virNodeDeviceDispose: + * virNodeDeviceFinalize: * @obj: the node device to release * * Unconditionally release all memory associated with a device. @@ -834,15 +842,17 @@ virGetNodeDevice(virConnectPtr conn, const char *name) * which may also be released if its ref count hits zero. */ static void -virNodeDeviceDispose(void *obj) +virNodeDeviceFinalize(GObject *obj) { - virNodeDevicePtr dev = obj; + virNodeDevicePtr dev = VIR_NODE_DEVICE(obj); VIR_DEBUG("release dev %p %s", dev, dev->name); VIR_FREE(dev->name); VIR_FREE(dev->parentName); virObjectUnref(dev->conn); + + G_OBJECT_CLASS(vir_node_device_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index 7fab565a7c..3b9a31920b 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -32,7 +32,6 @@ extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; -extern virClassPtr virNodeDeviceClass; extern virClassPtr virSecretClass; extern virClassPtr virStreamClass; @@ -60,6 +59,9 @@ G_DECLARE_FINAL_TYPE(virNetwork, vir_network, VIR, NETWORK, GObject); #define VIR_TYPE_NETWORK_PORT vir_network_port_get_type() G_DECLARE_FINAL_TYPE(virNetworkPort, vir_network_port, VIR, NETWORK_PORT, GObject); +#define VIR_TYPE_NODE_DEVICE vir_node_device_get_type() +G_DECLARE_FINAL_TYPE(virNodeDevice, vir_node_device, VIR, NODE_DEVICE, GObject); + #define VIR_TYPE_NW_FILTER vir_nw_filter_get_type() G_DECLARE_FINAL_TYPE(virNWFilter, vir_nw_filter, VIR, NW_FILTER, GObject); @@ -249,8 +251,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckNodeDeviceReturn(obj, retval) \ do { \ - virNodeDevicePtr _node = (obj); \ - if (!virObjectIsClass(_node, virNodeDeviceClass) || \ + virNodeDevicePtr _node = VIR_NODE_DEVICE(obj); \ + if (!G_IS_OBJECT(_node) || !(G_OBJECT_TYPE(_node) == VIR_TYPE_NODE_DEVICE) || \ !virObjectIsClass(_node->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_NODEDEV, \ VIR_ERR_INVALID_NODE_DEVICE, \ @@ -263,8 +265,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckNodeDeviceGoto(obj, label) \ do { \ - virNodeDevicePtr _dev= (obj); \ - if (!virObjectIsClass(_dev, virNodeDeviceClass) || \ + virNodeDevicePtr _dev= VIR_NODE_DEVICE(obj); \ + if (!G_IS_OBJECT(_dev) || !(G_OBJECT_TYPE(_dev) == VIR_TYPE_NODE_DEVICE) || \ !virObjectIsClass(_dev->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_NODEDEV, \ VIR_ERR_INVALID_NODE_DEVICE, \ @@ -731,7 +733,7 @@ struct _virStorageVol { * Internal structure associated with a node device */ struct _virNodeDevice { - virObject parent; + GObject parent; virConnectPtr conn; /* pointer back to the connection */ char *name; /* device name (unique on node) */ char *parentName; /* parent device name */ diff --git a/src/libvirt-nodedev.c b/src/libvirt-nodedev.c index dce46b7181..98db5e9813 100644 --- a/src/libvirt-nodedev.c +++ b/src/libvirt-nodedev.c @@ -452,7 +452,7 @@ virNodeDeviceFree(virNodeDevicePtr dev) virCheckNodeDeviceReturn(dev, -1); - virObjectUnref(dev); + g_object_unref(dev); return 0; } @@ -477,13 +477,13 @@ virNodeDeviceFree(virNodeDevicePtr dev) int virNodeDeviceRef(virNodeDevicePtr dev) { - VIR_DEBUG("dev=%p refs=%d", dev, dev ? dev->parent.u.s.refs : 0); + VIR_DEBUG("dev=%p", dev); virResetLastError(); virCheckNodeDeviceReturn(dev, -1); - virObjectRef(dev); + g_object_ref(dev); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 7bee97f2dc..f2187b7cce 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1365,7 +1365,6 @@ virGetStoragePool; virGetStorageVol; virGetStream; virNewConnectCloseCallbackData; -virNodeDeviceClass; virSecretClass; virStreamClass; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 6564b45ee4..bd43f3310e 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -5788,7 +5788,7 @@ libxlNodeDeviceDetachFlags(virNodeDevicePtr dev, libxlDriverPrivatePtr driver = dev->conn->privateData; virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; virConnectPtr nodeconn = NULL; - virNodeDevicePtr nodedev = NULL; + g_autoptr(virNodeDevice) nodedev = NULL; virCheckFlags(0, -1); @@ -5838,7 +5838,6 @@ libxlNodeDeviceDetachFlags(virNodeDevicePtr dev, cleanup: virPCIDeviceFree(pci); virNodeDeviceDefFree(def); - virObjectUnref(nodedev); virObjectUnref(nodeconn); VIR_FREE(xml); return ret; @@ -5861,7 +5860,7 @@ libxlNodeDeviceReAttach(virNodeDevicePtr dev) libxlDriverPrivatePtr driver = dev->conn->privateData; virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; virConnectPtr nodeconn = NULL; - virNodeDevicePtr nodedev = NULL; + g_autoptr(virNodeDevice) nodedev = NULL; if (!(nodeconn = virGetConnectNodeDev())) goto cleanup; @@ -5902,7 +5901,6 @@ libxlNodeDeviceReAttach(virNodeDevicePtr dev) cleanup: virPCIDeviceFree(pci); virNodeDeviceDefFree(def); - virObjectUnref(nodedev); virObjectUnref(nodeconn); VIR_FREE(xml); return ret; @@ -5919,7 +5917,7 @@ libxlNodeDeviceReset(virNodeDevicePtr dev) libxlDriverPrivatePtr driver = dev->conn->privateData; virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; virConnectPtr nodeconn = NULL; - virNodeDevicePtr nodedev = NULL; + g_autoptr(virNodeDevice) nodedev = NULL; if (!(nodeconn = virGetConnectNodeDev())) goto cleanup; @@ -5960,7 +5958,6 @@ libxlNodeDeviceReset(virNodeDevicePtr dev) cleanup: virPCIDeviceFree(pci); virNodeDeviceDefFree(def); - virObjectUnref(nodedev); virObjectUnref(nodeconn); VIR_FREE(xml); return ret; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 864158fd9d..bc28f65a3a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -12963,7 +12963,7 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, bool vfio = qemuHostdevHostSupportsPassthroughVFIO(); virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; virConnectPtr nodeconn = NULL; - virNodeDevicePtr nodedev = NULL; + g_autoptr(virNodeDevice) nodedev = NULL; virCheckFlags(0, -1); @@ -13024,7 +13024,6 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, cleanup: virPCIDeviceFree(pci); virNodeDeviceDefFree(def); - virObjectUnref(nodedev); virObjectUnref(nodeconn); return ret; } @@ -13046,7 +13045,7 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) g_autofree char *xml = NULL; virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; virConnectPtr nodeconn = NULL; - virNodeDevicePtr nodedev = NULL; + g_autoptr(virNodeDevice) nodedev = NULL; if (!(nodeconn = virGetConnectNodeDev())) goto cleanup; @@ -13084,7 +13083,6 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) virPCIDeviceFree(pci); cleanup: virNodeDeviceDefFree(def); - virObjectUnref(nodedev); virObjectUnref(nodeconn); return ret; } @@ -13100,7 +13098,7 @@ qemuNodeDeviceReset(virNodeDevicePtr dev) g_autofree char *xml = NULL; virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; virConnectPtr nodeconn = NULL; - virNodeDevicePtr nodedev = NULL; + g_autoptr(virNodeDevice) nodedev = NULL; if (!(nodeconn = virGetConnectNodeDev())) goto cleanup; @@ -13138,7 +13136,6 @@ qemuNodeDeviceReset(virNodeDevicePtr dev) virPCIDeviceFree(pci); cleanup: virNodeDeviceDefFree(def); - virObjectUnref(nodedev); virObjectUnref(nodeconn); return ret; } diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index f5d7842104..a3f05563d4 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -5536,7 +5536,7 @@ remoteNodeDeviceBuildEventLifecycle(virNetClientProgramPtr prog G_GNUC_UNUSED, event = virNodeDeviceEventLifecycleNew(dev->name, msg->event, msg->detail); - virObjectUnref(dev); + g_object_unref(dev); virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackID); } @@ -5557,7 +5557,7 @@ remoteNodeDeviceBuildEventUpdate(virNetClientProgramPtr prog G_GNUC_UNUSED, return; event = virNodeDeviceEventUpdateNew(dev->name); - virObjectUnref(dev); + g_object_unref(dev); virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackID); } diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl index 0b2ae59910..3187a0b798 100755 --- a/src/rpc/gendispatch.pl +++ b/src/rpc/gendispatch.pl @@ -575,7 +575,7 @@ elsif ($mode eq "server") { " goto cleanup;\n"); push(@args_list, "dev"); push(@free_list, - " virObjectUnref(dev);"); + " g_object_unref(dev);"); } foreach my $args_member (@{$call->{args_members}}) { diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 1696b956fe..5195ccbb61 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -7496,7 +7496,7 @@ testNodeDeviceCreateXML(virConnectPtr conn, cleanup: virNodeDeviceObjEndAPI(&obj); virNodeDeviceDefFree(def); - virObjectUnref(dev); + g_object_unref(dev); return ret; } -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/secret_event.c | 9 ++---- src/conf/virsecretobj.c | 8 +++++- src/datatypes.c | 44 ++++++++++++++++++----------- src/datatypes.h | 14 +++++---- src/libvirt-secret.c | 7 ++--- src/libvirt_private.syms | 1 - src/remote/remote_daemon_dispatch.c | 4 +-- src/remote/remote_driver.c | 4 +-- src/storage/storage_util.c | 4 +-- src/util/virsecret.c | 3 +- 10 files changed, 54 insertions(+), 44 deletions(-) diff --git a/src/conf/secret_event.c b/src/conf/secret_event.c index 1c34dcfbc9..229f90c6c4 100644 --- a/src/conf/secret_event.c +++ b/src/conf/secret_event.c @@ -109,7 +109,7 @@ virSecretEventDispatchDefaultFunc(virConnectPtr conn, virConnectObjectEventGenericCallback cb, void *cbopaque) { - virSecretPtr secret = virGetSecret(conn, + g_autoptr(virSecret) secret = virGetSecret(conn, event->meta.uuid, event->meta.id, event->meta.name); @@ -127,23 +127,20 @@ virSecretEventDispatchDefaultFunc(virConnectPtr conn, secretLifecycleEvent->type, secretLifecycleEvent->detail, cbopaque); - goto cleanup; + return; } case VIR_SECRET_EVENT_ID_VALUE_CHANGED: { ((virConnectSecretEventGenericCallback)cb)(conn, secret, cbopaque); - goto cleanup; + return; } case VIR_SECRET_EVENT_ID_LAST: break; } VIR_WARN("Unexpected event ID %d", event->eventID); - - cleanup: - virObjectUnref(secret); } diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c index 81c9f2c346..861c66bd03 100644 --- a/src/conf/virsecretobj.c +++ b/src/conf/virsecretobj.c @@ -611,7 +611,13 @@ virSecretObjListExport(virConnectPtr conn, return data.nsecrets; error: - virObjectListFree(data.secrets); + if (data.secrets) { + while (data.nsecrets--) { + if (data.secrets[data.nsecrets]) + g_object_unref(data.secrets[data.nsecrets]); + } + VIR_FREE(data.secrets); + } return -1; } diff --git a/src/datatypes.c b/src/datatypes.c index 43767b9fb5..4f2bca6e6d 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -36,13 +36,11 @@ VIR_LOG_INIT("datatypes"); virClassPtr virConnectClass; virClassPtr virConnectCloseCallbackDataClass; virClassPtr virDomainClass; -virClassPtr virSecretClass; virClassPtr virStreamClass; static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); static void virDomainDispose(void *obj); -static void virSecretDispose(void *obj); static void virStreamDispose(void *obj); G_DEFINE_TYPE(virDomainCheckpoint, vir_domain_checkpoint, G_TYPE_OBJECT); @@ -173,6 +171,22 @@ vir_nw_filter_binding_class_init(virNWFilterBindingClass *klass) obj->finalize = virNWFilterBindingFinalize; } +G_DEFINE_TYPE(virSecret, vir_secret, G_TYPE_OBJECT); +static void virSecretFinalize(GObject *obj); + +static void +vir_secret_init(virSecret *sec G_GNUC_UNUSED) +{ +} + +static void +vir_secret_class_init(virSecretClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virSecretFinalize; +} + G_DEFINE_TYPE(virStoragePool, vir_storage_pool, G_TYPE_OBJECT); static void virStoragePoolFinalize(GObject *obj); @@ -257,7 +271,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virConnect); DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData); DECLARE_CLASS(virDomain); - DECLARE_CLASS(virSecret); DECLARE_CLASS(virStream); DECLARE_CLASS_LOCKABLE(virAdmConnect); @@ -862,7 +875,7 @@ virNodeDeviceFinalize(GObject *obj) * @uuid: secret UUID * * Allocates a new secret object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the secret object, or NULL on error. */ @@ -870,16 +883,15 @@ virSecretPtr virGetSecret(virConnectPtr conn, const unsigned char *uuid, int usageType, const char *usageID) { - virSecretPtr ret = NULL; + g_autoptr(virSecret) ret = NULL; if (virDataTypesInitialize() < 0) return NULL; - virCheckConnectGoto(conn, error); - virCheckNonNullArgGoto(uuid, error); + virCheckConnectReturn(conn, NULL); + virCheckNonNullArgReturn(uuid, NULL); - if (!(ret = virObjectNew(virSecretClass))) - return NULL; + ret = VIR_SECRET(g_object_new(VIR_TYPE_SECRET, NULL)); memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN); ret->usageType = usageType; @@ -887,15 +899,11 @@ virGetSecret(virConnectPtr conn, const unsigned char *uuid, ret->conn = virObjectRef(conn); - return ret; - - error: - virObjectUnref(ret); - return NULL; + return g_steal_pointer(&ret); } /** - * virSecretDispose: + * virSecretFinalize: * @obj: the secret to release * * Unconditionally release all memory associated with a secret. @@ -905,9 +913,9 @@ virGetSecret(virConnectPtr conn, const unsigned char *uuid, * which may also be released if its ref count hits zero. */ static void -virSecretDispose(void *obj) +virSecretFinalize(GObject *obj) { - virSecretPtr secret = obj; + virSecretPtr secret = VIR_SECRET(obj); char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(secret->uuid, uuidstr); @@ -915,6 +923,8 @@ virSecretDispose(void *obj) VIR_FREE(secret->usageID); virObjectUnref(secret->conn); + + G_OBJECT_CLASS(vir_secret_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index 3b9a31920b..4b0747f728 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -32,7 +32,6 @@ extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; -extern virClassPtr virSecretClass; extern virClassPtr virStreamClass; @@ -72,6 +71,9 @@ G_DECLARE_FINAL_TYPE(virNWFilterBinding, NW_FILTER_BINDING, GObject); +#define VIR_TYPE_SECRET vir_secret_get_type() +G_DECLARE_FINAL_TYPE(virSecret, vir_secret, VIR, SECRET, GObject); + #define VIR_TYPE_STORAGE_POOL vir_storage_pool_get_type() G_DECLARE_FINAL_TYPE(virStoragePool, vir_storage_pool, VIR, STORAGE_POOL, GObject); @@ -278,8 +280,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckSecretReturn(obj, retval) \ do { \ - virSecretPtr _secret = (obj); \ - if (!virObjectIsClass(_secret, virSecretClass) || \ + virSecretPtr _secret = VIR_SECRET(obj); \ + if (!G_IS_OBJECT(_secret) || !(G_OBJECT_TYPE(_secret) == VIR_TYPE_SECRET) || \ !virObjectIsClass(_secret->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_SECRET, \ VIR_ERR_INVALID_SECRET, \ @@ -292,8 +294,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckSecretGoto(obj, label) \ do { \ - virSecretPtr _secret = (obj); \ - if (!virObjectIsClass(_secret, virSecretClass) || \ + virSecretPtr _secret = VIR_SECRET(obj); \ + if (!G_IS_OBJECT(_secret) || !(G_OBJECT_TYPE(_secret) == VIR_TYPE_SECRET) || \ !virObjectIsClass(_secret->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_SECRET, \ VIR_ERR_INVALID_SECRET, \ @@ -745,7 +747,7 @@ struct _virNodeDevice { * Internal structure associated with a secret */ struct _virSecret { - virObject parent; + GObject parent; virConnectPtr conn; /* pointer back to the connection */ unsigned char uuid[VIR_UUID_BUFLEN]; /* the secret unique identifier */ int usageType; /* the type of usage */ diff --git a/src/libvirt-secret.c b/src/libvirt-secret.c index 33cbdd7b0b..4248536a5b 100644 --- a/src/libvirt-secret.c +++ b/src/libvirt-secret.c @@ -658,14 +658,13 @@ virSecretUndefine(virSecretPtr secret) int virSecretRef(virSecretPtr secret) { - VIR_DEBUG("secret=%p refs=%d", secret, - secret ? secret->parent.u.s.refs : 0); + VIR_DEBUG("secret=%p", secret); virResetLastError(); virCheckSecretReturn(secret, -1); - virObjectRef(secret); + g_object_ref(secret); return 0; } @@ -687,7 +686,7 @@ virSecretFree(virSecretPtr secret) virCheckSecretReturn(secret, -1); - virObjectUnref(secret); + g_object_unref(secret); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f2187b7cce..b66c3623f6 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1365,7 +1365,6 @@ virGetStoragePool; virGetStorageVol; virGetStream; virNewConnectCloseCallbackData; -virSecretClass; virStreamClass; diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c index 9f367bc515..a2dd0415b3 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -4406,7 +4406,7 @@ remoteDispatchSecretGetValue(virNetServerPtr server G_GNUC_UNUSED, cleanup: if (rv < 0) virNetMessageSaveError(rerr); - virObjectUnref(secret); + g_object_unref(secret); return rv; } @@ -6436,7 +6436,7 @@ remoteDispatchConnectSecretEventRegisterAny(virNetServerPtr server G_GNUC_UNUSED remoteEventCallbackFree(callback); if (rv < 0) virNetMessageSaveError(rerr); - virObjectUnref(secret); + g_object_unref(secret); return rv; } diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index a3f05563d4..65c2b92f1e 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -5579,7 +5579,7 @@ remoteSecretBuildEventLifecycle(virNetClientProgramPtr prog G_GNUC_UNUSED, event = virSecretEventLifecycleNew(secret->uuid, secret->usageType, secret->usageID, msg->event, msg->detail); - virObjectUnref(secret); + g_object_unref(secret); virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackID); } @@ -5600,7 +5600,7 @@ remoteSecretBuildEventValueChanged(virNetClientProgramPtr prog G_GNUC_UNUSED, return; event = virSecretEventValueChangedNew(secret->uuid, secret->usageType, secret->usageID); - virObjectUnref(secret); + g_object_unref(secret); virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackID); } diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c index 1ec1d13625..7e3bfd1393 100644 --- a/src/storage/storage_util.c +++ b/src/storage/storage_util.c @@ -2172,7 +2172,7 @@ virStorageBackendVolDeleteLocal(virStoragePoolObjPtr pool G_GNUC_UNUSED, static int storageBackendLoadDefaultSecrets(virStorageVolDefPtr vol) { - virSecretPtr sec; + g_autoptr(virSecret) sec = NULL; virStorageEncryptionSecretPtr encsec = NULL; virConnectPtr conn = NULL; @@ -2199,7 +2199,6 @@ storageBackendLoadDefaultSecrets(virStorageVolDefPtr vol) if (VIR_ALLOC_N(vol->target.encryption->secrets, 1) < 0 || VIR_ALLOC(encsec) < 0) { VIR_FREE(vol->target.encryption->secrets); - virObjectUnref(sec); return -1; } @@ -2209,7 +2208,6 @@ storageBackendLoadDefaultSecrets(virStorageVolDefPtr vol) encsec->type = VIR_STORAGE_ENCRYPTION_SECRET_TYPE_PASSPHRASE; encsec->seclookupdef.type = VIR_SECRET_LOOKUP_TYPE_UUID; virSecretGetUUID(sec, encsec->seclookupdef.u.uuid); - virObjectUnref(sec); return 0; } diff --git a/src/util/virsecret.c b/src/util/virsecret.c index 54d6bbcb7c..7279d22683 100644 --- a/src/util/virsecret.c +++ b/src/util/virsecret.c @@ -147,7 +147,7 @@ virSecretGetSecretString(virConnectPtr conn, uint8_t **secret, size_t *secret_size) { - virSecretPtr sec = NULL; + g_autoptr(virSecret) sec = NULL; int ret = -1; switch (seclookupdef->type) { @@ -190,6 +190,5 @@ virSecretGetSecretString(virConnectPtr conn, ret = 0; cleanup: - virObjectUnref(sec); return ret; } -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/virchrdev.c | 5 +++-- src/datatypes.c | 32 +++++++++++++++++++++-------- src/datatypes.h | 15 +++++++------- src/libvirt-stream.c | 7 +++---- src/libvirt_private.syms | 1 - src/libxl/libxl_migration.c | 2 +- src/qemu/qemu_migration.c | 6 ++---- src/remote/remote_daemon_dispatch.c | 2 +- src/remote/remote_daemon_stream.c | 3 ++- src/remote/remote_driver.c | 3 ++- src/rpc/gendispatch.pl | 2 +- src/util/virfdstream.c | 5 +++-- 12 files changed, 49 insertions(+), 34 deletions(-) diff --git a/src/conf/virchrdev.c b/src/conf/virchrdev.c index 800e82869e..2338d40c39 100644 --- a/src/conf/virchrdev.c +++ b/src/conf/virchrdev.c @@ -205,7 +205,8 @@ static void virChrdevHashEntryFree(void *data) return; /* free stream reference */ - virObjectUnref(ent->st); + if (ent->st) + g_object_unref(ent->st); /* delete lock file */ virChrdevLockFileRemove(ent->dev); @@ -435,7 +436,7 @@ int virChrdevOpen(virChrdevsPtr devs, if (added) virHashRemoveEntry(devs->hash, path); else - virObjectUnref(st); + g_object_unref(st); if (cbdata) VIR_FREE(cbdata->path); diff --git a/src/datatypes.c b/src/datatypes.c index 4f2bca6e6d..8cf9e0c51b 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -36,12 +36,10 @@ VIR_LOG_INIT("datatypes"); virClassPtr virConnectClass; virClassPtr virConnectCloseCallbackDataClass; virClassPtr virDomainClass; -virClassPtr virStreamClass; static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); static void virDomainDispose(void *obj); -static void virStreamDispose(void *obj); G_DEFINE_TYPE(virDomainCheckpoint, vir_domain_checkpoint, G_TYPE_OBJECT); static void virDomainCheckpointFinalize(GObject *obj); @@ -219,6 +217,22 @@ vir_storage_vol_class_init(virStorageVolClass *klass) obj->finalize = virStorageVolFinalize; } +G_DEFINE_TYPE(virStream, vir_stream, G_TYPE_OBJECT); +static void virStreamFinalize(GObject *obj); + +static void +vir_stream_init(virStream *strm G_GNUC_UNUSED) +{ +} + +static void +vir_stream_class_init(virStreamClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virStreamFinalize; +} + virClassPtr virAdmConnectClass; virClassPtr virAdmConnectCloseCallbackDataClass; @@ -271,7 +285,6 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virConnect); DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData); DECLARE_CLASS(virDomain); - DECLARE_CLASS(virStream); DECLARE_CLASS_LOCKABLE(virAdmConnect); DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData); @@ -933,7 +946,7 @@ virSecretFinalize(GObject *obj) * @conn: the hypervisor connection * * Allocates a new stream object. When the object is no longer needed, - * virObjectUnref() must be called in order to not leak data. + * g_object_unref() must be called in order to not leak data. * * Returns a pointer to the stream object, or NULL on error. */ @@ -945,8 +958,7 @@ virGetStream(virConnectPtr conn) if (virDataTypesInitialize() < 0) return NULL; - if (!(ret = virObjectNew(virStreamClass))) - return NULL; + ret = VIR_STREAM(g_object_new(VIR_TYPE_STREAM, NULL)); ret->conn = virObjectRef(conn); @@ -954,7 +966,7 @@ virGetStream(virConnectPtr conn) } /** - * virStreamDispose: + * virStreamFinalize: * @obj: the stream to release * * Unconditionally release all memory associated with a stream. @@ -964,14 +976,16 @@ virGetStream(virConnectPtr conn) * which may also be released if its ref count hits zero. */ static void -virStreamDispose(void *obj) +virStreamFinalize(GObject *obj) { - virStreamPtr st = obj; + virStreamPtr st = VIR_STREAM(obj); VIR_DEBUG("release dev %p", st); if (st->ff) st->ff(st->privateData); virObjectUnref(st->conn); + + G_OBJECT_CLASS(vir_stream_parent_class)->finalize(obj); } diff --git a/src/datatypes.h b/src/datatypes.h index 4b0747f728..759e5487c3 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -32,8 +32,6 @@ extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; -extern virClassPtr virStreamClass; - #define VIR_TYPE_DOMAIN_CHECKPOINT vir_domain_checkpoint_get_type() G_DECLARE_FINAL_TYPE(virDomainCheckpoint, @@ -80,6 +78,9 @@ G_DECLARE_FINAL_TYPE(virStoragePool, vir_storage_pool, VIR, STORAGE_POOL, GObjec #define VIR_TYPE_STORAGE_VOL vir_storage_vol_get_type() G_DECLARE_FINAL_TYPE(virStorageVol, vir_storage_vol, VIR, STORAGE_VOL, GObject); +#define VIR_TYPE_STREAM vir_stream_get_type() +G_DECLARE_FINAL_TYPE(virStream, vir_stream, VIR, STREAM, GObject); + extern virClassPtr virAdmConnectClass; #define VIR_TYPE_ADM_SERVER vir_adm_server_get_type() @@ -308,8 +309,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); #define virCheckStreamReturn(obj, retval) \ do { \ - virStreamPtr _st = (obj); \ - if (!virObjectIsClass(_st, virStreamClass) || \ + virStreamPtr _st = VIR_STREAM(obj); \ + if (!G_IS_OBJECT(_st) || !(G_OBJECT_TYPE(_st) == VIR_TYPE_STREAM) || \ !virObjectIsClass(_st->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_STREAMS, \ VIR_ERR_INVALID_STREAM, \ @@ -321,8 +322,8 @@ G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject); } while (0) #define virCheckStreamGoto(obj, label) \ do { \ - virStreamPtr _st = (obj); \ - if (!virObjectIsClass(_st, virStreamClass) || \ + virStreamPtr _st = VIR_STREAM(obj); \ + if (!G_IS_OBJECT(_st) || !(G_OBJECT_TYPE(_st) == VIR_TYPE_STREAM) || \ !virObjectIsClass(_st->conn, virConnectClass)) { \ virReportErrorHelper(VIR_FROM_STREAMS, \ VIR_ERR_INVALID_STREAM, \ @@ -764,7 +765,7 @@ typedef int (*virStreamFinishFunc)(virStreamPtr, void *opaque); * Internal structure associated with an input stream */ struct _virStream { - virObject parent; + GObject parent; virConnectPtr conn; unsigned int flags; diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c index 6f6bb5df0b..95d975b61b 100644 --- a/src/libvirt-stream.c +++ b/src/libvirt-stream.c @@ -85,14 +85,13 @@ virStreamNew(virConnectPtr conn, int virStreamRef(virStreamPtr stream) { - VIR_DEBUG("stream=%p refs=%d", stream, - stream ? stream->parent.u.s.refs : 0); + VIR_DEBUG("stream=%p", stream); virResetLastError(); virCheckStreamReturn(stream, -1); - virObjectRef(stream); + g_object_ref(stream); return 0; } @@ -1273,6 +1272,6 @@ virStreamFree(virStreamPtr stream) /* XXX Enforce shutdown before free'ing resources ? */ - virObjectUnref(stream); + g_object_unref(stream); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index b66c3623f6..86331a97bc 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1365,7 +1365,6 @@ virGetStoragePool; virGetStorageVol; virGetStream; virNewConnectCloseCallbackData; -virStreamClass; # driver.h diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index defdda5ed6..ac462aaf3f 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -1110,7 +1110,7 @@ libxlDoMigrateSrcP2P(libxlDriverPrivatePtr driver, cleanup: if (flags & VIR_MIGRATE_TUNNELLED) { libxlMigrationSrcStopTunnel(tc); - virObjectUnref(st); + g_object_unref(st); } if (ddomain) { diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 07e137e2c9..13ff06f5c7 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -4000,7 +4000,7 @@ qemuMigrationSrcPerformPeer2Peer2(virQEMUDriverPtr driver, int cookielen = 0, ret; virErrorPtr orig_err = NULL; bool cancelled; - virStreamPtr st = NULL; + g_autoptr(virStream) st = NULL; unsigned long destflags; VIR_DEBUG("driver=%p, sconn=%p, dconn=%p, vm=%p, dconnuri=%s, " @@ -4109,7 +4109,6 @@ qemuMigrationSrcPerformPeer2Peer2(virQEMUDriverPtr driver, ret = -1; } - virObjectUnref(st); virErrorRestore(&orig_err); VIR_FREE(uri_out); @@ -4153,7 +4152,7 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriverPtr driver, int ret = -1; virErrorPtr orig_err = NULL; bool cancelled = true; - virStreamPtr st = NULL; + g_autoptr(virStream) st = NULL; unsigned long destflags; virTypedParameterPtr params = NULL; int nparams = 0; @@ -4446,7 +4445,6 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriverPtr driver, ret = -1; } - virObjectUnref(st); virErrorRestore(&orig_err); VIR_FREE(uri_out); diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c index a2dd0415b3..f3bbfbea32 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -5690,7 +5690,7 @@ remoteDispatchDomainMigratePrepareTunnel3Params(virNetServerPtr server G_GNUC_UN virStreamAbort(st); daemonFreeClientStream(client, stream); } else { - virObjectUnref(st); + g_object_unref(st); } } return rv; diff --git a/src/remote/remote_daemon_stream.c b/src/remote/remote_daemon_stream.c index ec9667fe56..cc11f88688 100644 --- a/src/remote/remote_daemon_stream.c +++ b/src/remote/remote_daemon_stream.c @@ -420,7 +420,8 @@ int daemonFreeClientStream(virNetServerClientPtr client, msg = tmp; } - virObjectUnref(stream->st); + if (stream->st) + g_object_unref(stream->st); VIR_FREE(stream); return ret; diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 65c2b92f1e..bb04db9aa7 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -5836,7 +5836,8 @@ static void remoteStreamCallbackFree(void *opaque) if (!cbdata->cb && cbdata->ff) (cbdata->ff)(cbdata->opaque); - virObjectUnref(cbdata->st); + if (cbdata->st) + g_object_unref(cbdata->st); VIR_FREE(opaque); } diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl index 3187a0b798..0d0cce551a 100755 --- a/src/rpc/gendispatch.pl +++ b/src/rpc/gendispatch.pl @@ -1026,7 +1026,7 @@ elsif ($mode eq "server") { push(@free_list_on_error, " virStreamAbort(st);"); push(@free_list_on_error, " daemonFreeClientStream(client, stream);"); push(@free_list_on_error, "} else {"); - push(@free_list_on_error, " virObjectUnref(st);"); + push(@free_list_on_error, " g_object_unref(st);"); push(@free_list_on_error, "}"); } diff --git a/src/util/virfdstream.c b/src/util/virfdstream.c index 111e451f8c..013b6dd1f5 100644 --- a/src/util/virfdstream.c +++ b/src/util/virfdstream.c @@ -407,7 +407,8 @@ virFDStreamThreadDataFree(virFDStreamThreadDataPtr data) if (!data) return; - virObjectUnref(data->st); + if (data->st) + g_object_unref(data->st); VIR_FREE(data->fdinname); VIR_FREE(data->fdoutname); VIR_FREE(data); @@ -1282,7 +1283,7 @@ virFDStreamOpenFileInternal(virStreamPtr st, if (VIR_ALLOC(threadData) < 0) goto error; - threadData->st = virObjectRef(st); + threadData->st = g_object_ref(st); threadData->length = length; threadData->sparse = sparse; -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/network_conf.c | 31 ++++++++++++++----------------- src/conf/network_conf.h | 12 +++++++++--- src/network/bridge_driver.c | 2 +- tests/networkxml2xmltest.c | 3 +-- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 819b645df7..c56dc95688 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -70,35 +70,32 @@ VIR_ENUM_IMPL(virNetworkTaint, "hook-script", ); -static virClassPtr virNetworkXMLOptionClass; +G_DEFINE_TYPE(virNetworkXMLOption, vir_network_xml_option, G_TYPE_OBJECT); static void -virNetworkXMLOptionDispose(void *obj G_GNUC_UNUSED) +virNetworkXMLOptionFinalize(GObject *obj) { - return; + G_OBJECT_CLASS(vir_network_xml_option_parent_class)->finalize(obj); } -static int -virNetworkXMLOnceInit(void) +static void +vir_network_xml_option_init(virNetworkXMLOption *xmlopt G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(virNetworkXMLOption, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(virNetworkXML); +static void +vir_network_xml_option_class_init(virNetworkXMLOptionClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virNetworkXMLOptionFinalize; +} virNetworkXMLOptionPtr virNetworkXMLOptionNew(virXMLNamespacePtr xmlns) { - virNetworkXMLOptionPtr xmlopt; - - if (virNetworkXMLInitialize() < 0) - return NULL; - - if (!(xmlopt = virObjectNew(virNetworkXMLOptionClass))) - return NULL; + virNetworkXMLOptionPtr xmlopt = + VIR_NETWORK_XML_OPTION(g_object_new(VIR_TYPE_NETWORK_XML_OPTION, NULL)); if (xmlns) xmlopt->ns = *xmlns; diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index db7243eef5..e492ca9c6f 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -33,17 +33,23 @@ #include "device_conf.h" #include "virbitmap.h" #include "networkcommon_conf.h" -#include "virobject.h" #include "virmacmap.h" #include "virenum.h" #include "virxml.h" +#include <glib-object.h> struct _virNetworkXMLOption { - virObject parent; + GObject parent; virXMLNamespace ns; }; -typedef struct _virNetworkXMLOption virNetworkXMLOption; + +#define VIR_TYPE_NETWORK_XML_OPTION vir_network_xml_option_get_type() +G_DECLARE_FINAL_TYPE(virNetworkXMLOption, + vir_network_xml_option, + VIR, + NETWORK_XML_OPTION, + GObject); typedef virNetworkXMLOption *virNetworkXMLOptionPtr; diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 6148bf6a7e..77b5aafb60 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -889,7 +889,7 @@ networkStateCleanup(void) return -1; virObjectUnref(network_driver->networkEventState); - virObjectUnref(network_driver->xmlopt); + g_object_unref(network_driver->xmlopt); /* free inactive networks */ virObjectUnref(network_driver->networks); diff --git a/tests/networkxml2xmltest.c b/tests/networkxml2xmltest.c index ec679e72ee..b881e03c3b 100644 --- a/tests/networkxml2xmltest.c +++ b/tests/networkxml2xmltest.c @@ -30,7 +30,7 @@ testCompareXMLToXMLFiles(const char *inxml, const char *outxml, int ret; testCompareNetXML2XMLResult result = TEST_COMPARE_NET_XML2XML_RESULT_SUCCESS; virNetworkDefPtr dev = NULL; - virNetworkXMLOptionPtr xmlopt = NULL; + g_autoptr(virNetworkXMLOption) xmlopt = NULL; if (!(xmlopt = networkDnsmasqCreateXMLConf())) goto cleanup; @@ -72,7 +72,6 @@ testCompareXMLToXMLFiles(const char *inxml, const char *outxml, VIR_FREE(actual); virNetworkDefFree(dev); - virObjectUnref(xmlopt); return ret; } -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/lxc/lxc_conf.c | 31 +++++++++++++------------- src/lxc/lxc_conf.h | 10 +++++++-- src/lxc/lxc_driver.c | 51 +++++++++++++++---------------------------- src/lxc/lxc_process.c | 33 +++++++++------------------- 4 files changed, 51 insertions(+), 74 deletions(-) diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c index cfb80eaf22..243020f9f1 100644 --- a/src/lxc/lxc_conf.c +++ b/src/lxc/lxc_conf.c @@ -42,19 +42,20 @@ VIR_LOG_INIT("lxc.lxc_conf"); -static virClassPtr virLXCDriverConfigClass; -static void virLXCDriverConfigDispose(void *obj); +G_DEFINE_TYPE(virLXCDriverConfig, vir_lxc_driver_config, G_TYPE_OBJECT); -static int virLXCConfigOnceInit(void) -{ - if (!VIR_CLASS_NEW(virLXCDriverConfig, virClassForObject())) - return -1; +static void virLXCDriverConfigFinalize(GObject *obj); - return 0; +static void vir_lxc_driver_config_init(virLXCDriverConfig *cfg G_GNUC_UNUSED) +{ } -VIR_ONCE_GLOBAL_INIT(virLXCConfig); +static void vir_lxc_driver_config_class_init(virLXCDriverConfigClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + obj->finalize = virLXCDriverConfigFinalize; +} /* Functions */ virCapsPtr virLXCDriverCapsInit(virLXCDriverPtr driver) @@ -227,11 +228,7 @@ virLXCDriverConfigNew(void) { virLXCDriverConfigPtr cfg; - if (virLXCConfigInitialize() < 0) - return NULL; - - if (!(cfg = virObjectNew(virLXCDriverConfigClass))) - return NULL; + cfg = VIR_LXC_DRIVER_CONFIG(g_object_new(VIR_TYPE_LXC_DRIVER_CONFIG, NULL)); cfg->securityDefaultConfined = false; cfg->securityRequireConfined = false; @@ -278,19 +275,21 @@ virLXCDriverConfigPtr virLXCDriverGetConfig(virLXCDriverPtr driver) { virLXCDriverConfigPtr cfg; lxcDriverLock(driver); - cfg = virObjectRef(driver->config); + cfg = g_object_ref(driver->config); lxcDriverUnlock(driver); return cfg; } static void -virLXCDriverConfigDispose(void *obj) +virLXCDriverConfigFinalize(GObject *obj) { - virLXCDriverConfigPtr cfg = obj; + virLXCDriverConfigPtr cfg = VIR_LXC_DRIVER_CONFIG(obj); VIR_FREE(cfg->configDir); VIR_FREE(cfg->autostartDir); VIR_FREE(cfg->stateDir); VIR_FREE(cfg->logDir); VIR_FREE(cfg->securityDriverName); + + G_OBJECT_CLASS(vir_lxc_driver_config_parent_class)->finalize(obj); } diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index f2f0e0a570..5ed84f79c7 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -34,6 +34,7 @@ #include "virusb.h" #include "virclosecallbacks.h" #include "virhostdev.h" +#include <glib-object.h> #define LXC_DRIVER_NAME "LXC" @@ -45,11 +46,16 @@ typedef struct _virLXCDriver virLXCDriver; typedef virLXCDriver *virLXCDriverPtr; -typedef struct _virLXCDriverConfig virLXCDriverConfig; +#define VIR_TYPE_LXC_DRIVER_CONFIG vir_lxc_driver_config_get_type() +G_DECLARE_FINAL_TYPE(virLXCDriverConfig, + vir_lxc_driver_config, + VIR, + LXC_DRIVER_CONFIG, + GObject); typedef virLXCDriverConfig *virLXCDriverConfigPtr; struct _virLXCDriverConfig { - virObject parent; + GObject parent; char *configDir; char *autostartDir; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 5da9ec7c58..07bc7219f1 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -400,7 +400,7 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) virDomainPtr dom = NULL; virObjectEventPtr event = NULL; virDomainDefPtr oldDef = NULL; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); g_autoptr(virCaps) caps = NULL; unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE; @@ -458,7 +458,6 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) virDomainDefFree(oldDef); virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return dom; } @@ -475,7 +474,7 @@ static int lxcDomainUndefineFlags(virDomainPtr dom, virDomainObjPtr vm; virObjectEventPtr event = NULL; int ret = -1; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); virCheckFlags(0, -1); @@ -510,7 +509,6 @@ static int lxcDomainUndefineFlags(virDomainPtr dom, cleanup: virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return ret; } @@ -638,7 +636,7 @@ static int lxcDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, int ret = -1; virLXCDomainObjPrivatePtr priv; virLXCDriverPtr driver = dom->conn->privateData; - virLXCDriverConfigPtr cfg = NULL; + g_autoptr(virLXCDriverConfig) cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG | @@ -719,7 +717,6 @@ static int lxcDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -743,7 +740,7 @@ lxcDomainSetMemoryParameters(virDomainPtr dom, virDomainDefPtr persistentDef = NULL; virDomainObjPtr vm = NULL; virLXCDomainObjPrivatePtr priv = NULL; - virLXCDriverConfigPtr cfg = NULL; + g_autoptr(virLXCDriverConfig) cfg = NULL; virLXCDriverPtr driver = dom->conn->privateData; int ret = -1; @@ -804,7 +801,6 @@ lxcDomainSetMemoryParameters(virDomainPtr dom, cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -976,7 +972,7 @@ static int lxcDomainCreateWithFiles(virDomainPtr dom, virDomainObjPtr vm; virObjectEventPtr event = NULL; int ret = -1; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); virCheckFlags(VIR_DOMAIN_START_AUTODESTROY, -1); @@ -1023,7 +1019,6 @@ static int lxcDomainCreateWithFiles(virDomainPtr dom, cleanup: virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); virNWFilterUnlockFilterUpdates(); return ret; } @@ -1079,7 +1074,7 @@ lxcDomainCreateXMLWithFiles(virConnectPtr conn, virDomainDefPtr def = NULL; virDomainPtr dom = NULL; virObjectEventPtr event = NULL; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); g_autoptr(virCaps) caps = NULL; unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE; @@ -1150,7 +1145,6 @@ lxcDomainCreateXMLWithFiles(virConnectPtr conn, virDomainDefFree(def); virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); virNWFilterUnlockFilterUpdates(); return dom; } @@ -1582,7 +1576,7 @@ static void lxcNotifyLoadDomain(virDomainObjPtr vm, int newVM, void *opaque) static int lxcStateReload(void) { - virLXCDriverConfigPtr cfg = NULL; + g_autoptr(virLXCDriverConfig) cfg = NULL; if (!lxc_driver) return 0; @@ -1594,7 +1588,6 @@ lxcStateReload(void) cfg->autostartDir, false, lxc_driver->xmlopt, lxcNotifyLoadDomain, lxc_driver); - virObjectUnref(cfg); return 0; } @@ -1620,7 +1613,8 @@ static int lxcStateCleanup(void) if (lxc_driver->lockFD != -1) virPidFileRelease(lxc_driver->config->stateDir, "driver", lxc_driver->lockFD); - virObjectUnref(lxc_driver->config); + if (lxc_driver->config) + g_object_unref(lxc_driver->config); virMutexDestroy(&lxc_driver->lock); VIR_FREE(lxc_driver); @@ -1801,7 +1795,7 @@ lxcDomainSetSchedulerParametersFlags(virDomainPtr dom, int ret = -1; int rc; virLXCDomainObjPrivatePtr priv; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -1914,7 +1908,6 @@ lxcDomainSetSchedulerParametersFlags(virDomainPtr dom, cleanup: virDomainDefFree(persistentDefCopy); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -2239,7 +2232,7 @@ lxcDomainSetBlkioParameters(virDomainPtr dom, virDomainDefPtr def = NULL; virDomainDefPtr persistentDef = NULL; int ret = -1; - virLXCDriverConfigPtr cfg = NULL; + g_autoptr(virLXCDriverConfig) cfg = NULL; virLXCDomainObjPrivatePtr priv; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | @@ -2304,7 +2297,6 @@ lxcDomainSetBlkioParameters(virDomainPtr dom, cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -2463,7 +2455,7 @@ static int lxcDomainSetAutostart(virDomainPtr dom, virDomainObjPtr vm; char *configFile = NULL, *autostartLink = NULL; int ret = -1; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); if (!(vm = lxcDomObjFromDomain(dom))) goto cleanup; @@ -2529,7 +2521,6 @@ static int lxcDomainSetAutostart(virDomainPtr dom, VIR_FREE(configFile); VIR_FREE(autostartLink); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -2625,7 +2616,7 @@ static int lxcDomainSuspend(virDomainPtr dom) virDomainObjPtr vm; virObjectEventPtr event = NULL; int ret = -1; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); if (!(vm = lxcDomObjFromDomain(dom))) goto cleanup; @@ -2662,7 +2653,6 @@ static int lxcDomainSuspend(virDomainPtr dom) cleanup: virObjectEventStateQueue(driver->domainEventState, event); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -2674,7 +2664,7 @@ static int lxcDomainResume(virDomainPtr dom) int ret = -1; int state; virLXCDomainObjPrivatePtr priv; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); if (!(vm = lxcDomObjFromDomain(dom))) goto cleanup; @@ -2719,7 +2709,6 @@ static int lxcDomainResume(virDomainPtr dom) cleanup: virObjectEventStateQueue(driver->domainEventState, event); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4297,7 +4286,7 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr dom, virDomainDefPtr vmdef = NULL; virDomainDeviceDefPtr dev = NULL, dev_copy = NULL; int ret = -1; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -4384,7 +4373,6 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr dom, virDomainDeviceDefFree(dev_copy); virDomainDeviceDefFree(dev); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4406,7 +4394,7 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom, virDomainDefPtr vmdef = NULL; virDomainDeviceDefPtr dev = NULL; int ret = -1; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -4456,7 +4444,6 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom, virDomainDefFree(vmdef); virDomainDeviceDefFree(dev); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4471,7 +4458,7 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom, virDomainDefPtr vmdef = NULL; virDomainDeviceDefPtr dev = NULL, dev_copy = NULL; int ret = -1; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -4552,7 +4539,6 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom, virDomainDeviceDefFree(dev_copy); virDomainDeviceDefFree(dev); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4825,7 +4811,7 @@ lxcDomainSetMetadata(virDomainPtr dom, { virLXCDriverPtr driver = dom->conn->privateData; virDomainObjPtr vm; - virLXCDriverConfigPtr cfg = NULL; + g_autoptr(virLXCDriverConfig) cfg = NULL; int ret = -1; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | @@ -4856,7 +4842,6 @@ lxcDomainSetMetadata(virDomainPtr dom, cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 699accc633..cacfa14094 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -162,7 +162,7 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver, size_t i; virLXCDomainObjPrivatePtr priv = vm->privateData; const virNetDevVPortProfile *vport = NULL; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); virConnectPtr conn = NULL; VIR_DEBUG("Cleanup VM name=%s pid=%d reason=%d", @@ -257,7 +257,6 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver, } virDomainObjRemoveTransientDef(vm); - virObjectUnref(cfg); virObjectUnref(conn); } @@ -340,11 +339,10 @@ virLXCProcessSetupInterfaceDirect(virLXCDriverPtr driver, virDomainDefPtr def, virDomainNetDefPtr net) { - char *ret = NULL; char *res_ifname = NULL; const virNetDevBandwidth *bw; const virNetDevVPortProfile *prof; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); const char *linkdev = virDomainNetGetActualDirectDev(net); unsigned int macvlan_create_flags = VIR_NETDEV_MACVLAN_CREATE_IFUP; @@ -386,13 +384,9 @@ virLXCProcessSetupInterfaceDirect(virLXCDriverPtr driver, cfg->stateDir, NULL, 0, macvlan_create_flags) < 0) - goto cleanup; - - ret = res_ifname; + return NULL; - cleanup: - virObjectUnref(cfg); - return ret; + return res_ifname; } static const char *nsInfoLocal[VIR_LXC_DOMAIN_NAMESPACE_LAST] = { @@ -786,7 +780,7 @@ static void virLXCProcessMonitorInitNotify(virLXCMonitorPtr mon G_GNUC_UNUSED, { virLXCDriverPtr driver = lxc_driver; virLXCDomainObjPrivatePtr priv; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); ino_t inode = 0; virObjectLock(vm); @@ -806,7 +800,6 @@ static void virLXCProcessMonitorInitNotify(virLXCMonitorPtr mon G_GNUC_UNUSED, VIR_WARN("Cannot update XML with PID for LXC %s", vm->def->name); virObjectUnlock(vm); - virObjectUnref(cfg); } static virLXCMonitorCallbacks monitorCallbacks = { @@ -820,10 +813,10 @@ static virLXCMonitorPtr virLXCProcessConnectMonitor(virLXCDriverPtr driver, virDomainObjPtr vm) { virLXCMonitorPtr monitor = NULL; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); if (virSecurityManagerSetSocketLabel(driver->securityManager, vm->def) < 0) - goto cleanup; + return NULL; /* Hold an extra reference because we can't allow 'vm' to be * deleted while the monitor is active. This will be unreffed @@ -840,11 +833,8 @@ static virLXCMonitorPtr virLXCProcessConnectMonitor(virLXCDriverPtr driver, virObjectUnref(monitor); monitor = NULL; } - goto cleanup; } - cleanup: - virObjectUnref(cfg); return monitor; } @@ -932,7 +922,7 @@ virLXCProcessBuildControllerCmd(virLXCDriverPtr driver, char *filterstr; char *outputstr; virCommandPtr cmd; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); cmd = virCommandNew(vm->def->emulator); @@ -1013,7 +1003,6 @@ virLXCProcessBuildControllerCmd(virLXCDriverPtr driver, virCommandRequireHandshake(cmd); cleanup: - virObjectUnref(cfg); return cmd; error: virCommandFree(cmd); @@ -1202,7 +1191,7 @@ int virLXCProcessStart(virConnectPtr conn, virLXCDomainObjPrivatePtr priv = vm->privateData; virCapsPtr caps = NULL; virErrorPtr err = NULL; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); virCgroupPtr selfcgroup; int status; char *pidfile = NULL; @@ -1564,7 +1553,6 @@ int virLXCProcessStart(virConnectPtr conn, VIR_FORCE_CLOSE(handshakefds[1]); VIR_FREE(pidfile); VIR_FREE(logfile); - virObjectUnref(cfg); if (caps) g_object_unref(caps); @@ -1663,7 +1651,7 @@ virLXCProcessReconnectDomain(virDomainObjPtr vm, { virLXCDriverPtr driver = opaque; virLXCDomainObjPrivatePtr priv; - virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver); int ret = -1; virObjectLock(vm); @@ -1729,7 +1717,6 @@ virLXCProcessReconnectDomain(virDomainObjPtr vm, ret = 0; cleanup: - virObjectUnref(cfg); virObjectUnlock(vm); return ret; -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/libxl/libxl_conf.c | 51 ++++++----- src/libxl/libxl_conf.h | 12 ++- src/libxl/libxl_driver.c | 163 +++++++++++++----------------------- src/libxl/libxl_migration.c | 21 ++--- tests/testutilsxen.c | 3 +- 5 files changed, 98 insertions(+), 152 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index d9377438d9..547868c6e8 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -52,23 +52,27 @@ VIR_LOG_INIT("libxl.libxl_conf"); -static virClassPtr libxlDriverConfigClass; -static void libxlDriverConfigDispose(void *obj); +G_DEFINE_TYPE(libxlDriverConfig, libxl_driver_config, G_TYPE_OBJECT); -static int libxlConfigOnceInit(void) -{ - if (!VIR_CLASS_NEW(libxlDriverConfig, virClassForObject())) - return -1; +static void libxlDriverConfigFinalize(GObject *obj); - return 0; +static void +libxl_driver_config_init(libxlDriverConfig *cfg G_GNUC_UNUSED) +{ } -VIR_ONCE_GLOBAL_INIT(libxlConfig); +static void +libxl_driver_config_class_init(libxlDriverConfigClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = libxlDriverConfigFinalize; +} static void -libxlDriverConfigDispose(void *obj) +libxlDriverConfigFinalize(GObject *obj) { - libxlDriverConfigPtr cfg = obj; + libxlDriverConfigPtr cfg = LIBXL_DRIVER_CONFIG(obj); if (cfg->caps) g_object_unref(cfg->caps); @@ -87,6 +91,8 @@ libxlDriverConfigDispose(void *obj) VIR_FREE(cfg->lockManagerName); VIR_FREE(cfg->channelDir); virFirmwareFreeList(cfg->firmwares, cfg->nfirmwares); + + G_OBJECT_CLASS(libxl_driver_config_parent_class)->finalize(obj); } @@ -1685,13 +1691,8 @@ libxlGetAutoballoonConf(libxlDriverConfigPtr cfg, libxlDriverConfigPtr libxlDriverConfigNew(void) { - libxlDriverConfigPtr cfg; - - if (libxlConfigInitialize() < 0) - return NULL; - - if (!(cfg = virObjectNew(libxlDriverConfigClass))) - return NULL; + g_autoptr(libxlDriverConfig) cfg = + LIBXL_DRIVER_CONFIG(g_object_new(LIBXL_TYPE_DRIVER_CONFIG, NULL)); cfg->configBaseDir = g_strdup(LIBXL_CONFIG_BASE_DIR); cfg->configDir = g_strdup(LIBXL_CONFIG_DIR); @@ -1707,34 +1708,30 @@ libxlDriverConfigNew(void) if (virFirmwareParseList(DEFAULT_LOADER_NVRAM, &cfg->firmwares, &cfg->nfirmwares) < 0) - goto error; + return NULL; #else if (VIR_ALLOC_N(cfg->firmwares, 1) < 0) - goto error; + return NULL; cfg->nfirmwares = 1; if (VIR_ALLOC(cfg->firmwares[0]) < 0) - goto error; + return NULL; cfg->firmwares[0]->name = g_strdup(LIBXL_FIRMWARE_DIR "/ovmf.bin"); #endif /* Always add hvmloader to firmwares */ if (VIR_REALLOC_N(cfg->firmwares, cfg->nfirmwares + 1) < 0) - goto error; + return NULL; cfg->nfirmwares++; if (VIR_ALLOC(cfg->firmwares[cfg->nfirmwares - 1]) < 0) - goto error; + return NULL; cfg->firmwares[cfg->nfirmwares - 1]->name = g_strdup(LIBXL_FIRMWARE_DIR "/hvmloader"); /* defaults for keepalive messages */ cfg->keepAliveInterval = 5; cfg->keepAliveCount = 5; - return cfg; - - error: - virObjectUnref(cfg); - return NULL; + return g_steal_pointer(&cfg); } int diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 07b3373170..94386cc8cc 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -37,6 +37,7 @@ #include "virfirmware.h" #include "libxl_capabilities.h" #include "libxl_logger.h" +#include <glib-object.h> #define LIBXL_DRIVER_NAME "xenlight" #define LIBXL_VNC_PORT_MIN 5900 @@ -60,11 +61,17 @@ typedef struct _libxlDriverPrivate libxlDriverPrivate; typedef libxlDriverPrivate *libxlDriverPrivatePtr; -typedef struct _libxlDriverConfig libxlDriverConfig; +#define LIBXL_TYPE_DRIVER_CONFIG libxl_driver_config_get_type() +G_DECLARE_FINAL_TYPE(libxlDriverConfig, + libxl_driver_config, + LIBXL, + DRIVER_CONFIG, + GObject); + typedef libxlDriverConfig *libxlDriverConfigPtr; struct _libxlDriverConfig { - virObject parent; + GObject parent; const libxl_version_info *verInfo; unsigned int version; @@ -102,7 +109,6 @@ struct _libxlDriverConfig { size_t nfirmwares; }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(libxlDriverConfig, virObjectUnref); struct _libxlDriverPrivate { diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index bd43f3310e..eab8945e48 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -390,7 +390,7 @@ libxlReconnectDomain(virDomainObjPtr vm, { libxlDriverPrivatePtr driver = opaque; libxlDomainObjPrivatePtr priv = vm->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); int rc; libxl_dominfo d_info; int len; @@ -484,7 +484,6 @@ libxlReconnectDomain(virDomainObjPtr vm, libxl_dominfo_dispose(&d_info); virObjectUnlock(vm); virObjectUnref(vm); - virObjectUnref(cfg); return ret; error: @@ -520,7 +519,8 @@ libxlStateCleanup(void) if (libxl_driver->lockFD != -1) virPidFileRelease(libxl_driver->config->stateDir, "driver", libxl_driver->lockFD); - virObjectUnref(libxl_driver->config); + if (libxl_driver->config) + g_object_unref(libxl_driver->config); virMutexDestroy(&libxl_driver->lock); VIR_FREE(libxl_driver); @@ -590,7 +590,7 @@ const struct libxl_event_hooks ev_hooks = { static int libxlAddDom0(libxlDriverPrivatePtr driver) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainDefPtr def = NULL; virDomainObjPtr vm = NULL; libxl_dominfo d_info; @@ -643,7 +643,6 @@ libxlAddDom0(libxlDriverPrivatePtr driver) libxl_dominfo_dispose(&d_info); virDomainDefFree(def); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -832,7 +831,7 @@ libxlStateInitialize(bool privileged, static int libxlStateReload(void) { - libxlDriverConfigPtr cfg; + g_autoptr(libxlDriverConfig) cfg = NULL; if (!libxl_driver) return 0; @@ -850,7 +849,6 @@ libxlStateReload(void) libxlAutostartDomain, libxl_driver); - virObjectUnref(cfg); return 0; } @@ -919,14 +917,13 @@ static int libxlConnectGetVersion(virConnectPtr conn, unsigned long *version) { libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg; + g_autoptr(libxlDriverConfig) cfg = NULL; if (virConnectGetVersionEnsureACL(conn) < 0) return 0; cfg = libxlDriverConfigGet(driver); *version = cfg->version; - virObjectUnref(cfg); return 0; } @@ -966,7 +963,7 @@ libxlConnectGetMaxVcpus(virConnectPtr conn, const char *type G_GNUC_UNUSED) { int ret; libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg; + g_autoptr(libxlDriverConfig) cfg = NULL; if (virConnectGetMaxVcpusEnsureACL(conn) < 0) return -1; @@ -980,7 +977,6 @@ libxlConnectGetMaxVcpus(virConnectPtr conn, const char *type G_GNUC_UNUSED) if (ret <= 0) ret = -1; - virObjectUnref(cfg); return ret; } @@ -998,7 +994,7 @@ libxlConnectGetCapabilities(virConnectPtr conn) { libxlDriverPrivatePtr driver = conn->privateData; char *xml; - libxlDriverConfigPtr cfg; + g_autoptr(libxlDriverConfig) cfg = NULL; if (virConnectGetCapabilitiesEnsureACL(conn) < 0) return NULL; @@ -1006,7 +1002,6 @@ libxlConnectGetCapabilities(virConnectPtr conn) cfg = libxlDriverConfigGet(driver); xml = virCapabilitiesFormatXML(cfg->caps); - virObjectUnref(cfg); return xml; } @@ -1042,7 +1037,7 @@ libxlDomainCreateXML(virConnectPtr conn, const char *xml, virDomainDefPtr def; virDomainObjPtr vm = NULL; virDomainPtr dom = NULL; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE; virCheckFlags(VIR_DOMAIN_START_PAUSED | @@ -1087,7 +1082,6 @@ libxlDomainCreateXML(virConnectPtr conn, const char *xml, cleanup: virDomainDefFree(def); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return dom; } @@ -1164,7 +1158,7 @@ static int libxlDomainSuspend(virDomainPtr dom) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; virObjectEventPtr event = NULL; int ret = -1; @@ -1208,7 +1202,6 @@ libxlDomainSuspend(virDomainPtr dom) cleanup: virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return ret; } @@ -1217,7 +1210,7 @@ static int libxlDomainResume(virDomainPtr dom) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; virObjectEventPtr event = NULL; int ret = -1; @@ -1262,7 +1255,6 @@ libxlDomainResume(virDomainPtr dom) cleanup: virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return ret; } @@ -1270,7 +1262,7 @@ static int libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; int ret = -1; @@ -1320,7 +1312,6 @@ libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags) cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -1335,7 +1326,7 @@ static int libxlDomainReboot(virDomainPtr dom, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; int ret = -1; @@ -1367,7 +1358,6 @@ libxlDomainReboot(virDomainPtr dom, unsigned int flags) cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -1376,7 +1366,7 @@ libxlDomainDestroyFlags(virDomainPtr dom, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; int ret = -1; virObjectEventPtr event = NULL; @@ -1421,7 +1411,6 @@ libxlDomainDestroyFlags(virDomainPtr dom, cleanup: virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return ret; } @@ -1441,7 +1430,7 @@ libxlDomainPMSuspendForDuration(virDomainPtr dom, virDomainObjPtr vm; int ret = -1; libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virObjectEventPtr event = NULL; virCheckFlags(0, -1); @@ -1507,7 +1496,7 @@ libxlDomainPMWakeup(virDomainPtr dom, unsigned int flags) int ret = -1; virObjectEventPtr event = NULL; libxlDomainObjPrivatePtr priv; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virCheckFlags(0, -1); @@ -1636,7 +1625,7 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; virDomainDefPtr persistentDef = NULL; int ret = -1; @@ -1721,7 +1710,6 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -1741,7 +1729,7 @@ static int libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; libxl_dominfo d_info; int ret = -1; @@ -1777,7 +1765,6 @@ libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info) cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -1815,7 +1802,7 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, const char *to, bool managed) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); libxlSavefileHeader hdr; virObjectEventPtr event = NULL; char *xml = NULL; @@ -1892,7 +1879,6 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, if (VIR_CLOSE(fd) < 0) virReportSystemError(errno, "%s", _("cannot close file")); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return ret; } @@ -1957,7 +1943,7 @@ libxlDomainRestoreFlags(virConnectPtr conn, const char *from, const char *dxml, unsigned int flags) { libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm = NULL; virDomainDefPtr def = NULL; libxlSavefileHeader hdr; @@ -2010,7 +1996,6 @@ libxlDomainRestoreFlags(virConnectPtr conn, const char *from, virReportSystemError(errno, "%s", _("cannot close file")); virDomainDefFree(def); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -2024,7 +2009,7 @@ static int libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; virObjectEventPtr event = NULL; bool paused = false; @@ -2107,7 +2092,6 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) cleanup: virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return ret; } @@ -2240,7 +2224,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainDefPtr def; virDomainObjPtr vm; libxl_bitmap map; @@ -2378,7 +2362,6 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, cleanup: VIR_FREE(bitmask); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -2459,7 +2442,7 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainDefPtr targetDef = NULL; virBitmapPtr pcpumap = NULL; virDomainVcpuDefPtr vcpuinfo; @@ -2527,7 +2510,6 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu, cleanup: virDomainObjEndAPI(&vm); virBitmapFree(pcpumap); - virObjectUnref(cfg); return ret; } @@ -2545,7 +2527,7 @@ libxlDomainGetVcpuPinInfo(virDomainPtr dom, int ncpumaps, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm = NULL; virDomainDefPtr targetDef = NULL; int ret = -1; @@ -2574,7 +2556,6 @@ libxlDomainGetVcpuPinInfo(virDomainPtr dom, int ncpumaps, cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -2583,7 +2564,7 @@ libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo, unsigned char *cpumaps, int maplen) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; int ret = -1; libxl_vcpuinfo *vcpuinfo; @@ -2635,7 +2616,6 @@ libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo, cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -2643,7 +2623,7 @@ static char * libxlDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; virDomainDefPtr def; char *ret = NULL; @@ -2666,7 +2646,6 @@ libxlDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -2677,7 +2656,7 @@ libxlConnectDomainXMLFromNative(virConnectPtr conn, unsigned int flags) { libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainDefPtr def = NULL; g_autoptr(virConf) conf = NULL; char *xml = NULL; @@ -2716,7 +2695,6 @@ libxlConnectDomainXMLFromNative(virConnectPtr conn, cleanup: virDomainDefFree(def); - virObjectUnref(cfg); return xml; } @@ -2727,7 +2705,7 @@ libxlConnectDomainXMLToNative(virConnectPtr conn, const char * nativeFormat, unsigned int flags) { libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainDefPtr def = NULL; g_autoptr(virConf) conf = NULL; int len = MAX_CONFIG_SIZE; @@ -2766,7 +2744,6 @@ libxlConnectDomainXMLToNative(virConnectPtr conn, const char * nativeFormat, cleanup: virDomainDefFree(def); - virObjectUnref(cfg); return ret; } @@ -2846,7 +2823,7 @@ static virDomainPtr libxlDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) { libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainDefPtr def = NULL; virDomainObjPtr vm = NULL; virDomainPtr dom = NULL; @@ -2896,7 +2873,6 @@ libxlDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag virDomainDefFree(oldDef); virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return dom; } @@ -2911,7 +2887,7 @@ libxlDomainUndefineFlags(virDomainPtr dom, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; virObjectEventPtr event = NULL; char *name = NULL; @@ -2967,7 +2943,6 @@ libxlDomainUndefineFlags(virDomainPtr dom, VIR_FREE(name); virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return ret; } @@ -2980,7 +2955,7 @@ libxlDomainUndefine(virDomainPtr dom) static int libxlDomainChangeEjectableMedia(virDomainObjPtr vm, virDomainDiskDefPtr disk) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(libxl_driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(libxl_driver); virDomainDiskDefPtr origdisk = NULL; libxl_device_disk x_disk; size_t i; @@ -3027,14 +3002,13 @@ libxlDomainChangeEjectableMedia(virDomainObjPtr vm, virDomainDiskDefPtr disk) ret = 0; cleanup: - virObjectUnref(cfg); return ret; } static int libxlDomainAttachDeviceDiskLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(libxl_driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(libxl_driver); virDomainDiskDefPtr l_disk = dev->data.disk; libxl_device_disk x_disk; int ret = -1; @@ -3098,7 +3072,6 @@ libxlDomainAttachDeviceDiskLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) } cleanup: - virObjectUnref(cfg); return ret; } @@ -3107,7 +3080,7 @@ libxlDomainAttachHostPCIDevice(libxlDriverPrivatePtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); libxl_device_pci pcidev; virDomainHostdevDefPtr found; virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; @@ -3154,7 +3127,6 @@ libxlDomainAttachHostPCIDevice(libxlDriverPrivatePtr driver, vm->def->name, &hostdev, 1, NULL); cleanup: - virObjectUnref(cfg); libxl_device_pci_dispose(&pcidev); return ret; } @@ -3165,7 +3137,7 @@ libxlDomainAttachControllerDevice(libxlDriverPrivatePtr driver, virDomainObjPtr vm, virDomainControllerDefPtr controller) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); const char *type = virDomainControllerTypeToString(controller->type); libxl_device_usbctrl usbctrl; int ret = -1; @@ -3209,7 +3181,6 @@ libxlDomainAttachControllerDevice(libxlDriverPrivatePtr driver, ret = 0; cleanup: - virObjectUnref(cfg); libxl_device_usbctrl_dispose(&usbctrl); return ret; } @@ -3219,7 +3190,7 @@ libxlDomainAttachHostUSBDevice(libxlDriverPrivatePtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); libxl_device_usbdev usbdev; virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; int ret = -1; @@ -3289,7 +3260,6 @@ libxlDomainAttachHostUSBDevice(libxlDriverPrivatePtr driver, vm->def->name, &hostdev, 1); cleanup: - virObjectUnref(cfg); libxl_device_usbdev_dispose(&usbdev); return ret; } @@ -3333,7 +3303,7 @@ libxlDomainAttachHostDevice(libxlDriverPrivatePtr driver, static int libxlDomainDetachDeviceDiskLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(libxl_driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(libxl_driver); virDomainDiskDefPtr l_disk = NULL; libxl_device_disk x_disk; int idx; @@ -3386,7 +3356,6 @@ libxlDomainDetachDeviceDiskLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) } cleanup: - virObjectUnref(cfg); return ret; } @@ -3395,7 +3364,7 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver, virDomainObjPtr vm, virDomainNetDefPtr net) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainNetType actualType; libxl_device_nic nic; int ret = -1; @@ -3476,7 +3445,6 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver, virDomainNetReleaseActualDevice(conn, vm->def, net); } virObjectUnref(conn); - virObjectUnref(cfg); virErrorRestore(&save_err); return ret; } @@ -3644,7 +3612,7 @@ libxlDomainDetachHostPCIDevice(libxlDriverPrivatePtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys; virDomainHostdevSubsysPCIPtr pcisrc = &subsys->u.pci; libxl_device_pci pcidev; @@ -3699,7 +3667,6 @@ libxlDomainDetachHostPCIDevice(libxlDriverPrivatePtr driver, virDomainHostdevDefFree(detach); cleanup: - virObjectUnref(cfg); libxl_device_pci_dispose(&pcidev); return ret; } @@ -3715,7 +3682,7 @@ libxlDomainDetachControllerDevice(libxlDriverPrivatePtr driver, virDomainControllerDefPtr controller = dev->data.controller; const char *type = virDomainControllerTypeToString(controller->type); libxl_device_usbctrl usbctrl; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); libxl_device_usbctrl_init(&usbctrl); @@ -3751,7 +3718,6 @@ libxlDomainDetachControllerDevice(libxlDriverPrivatePtr driver, cleanup: virDomainControllerDefFree(detach); - virObjectUnref(cfg); libxl_device_usbctrl_dispose(&usbctrl); return ret; } @@ -3761,7 +3727,7 @@ libxlDomainDetachHostUSBDevice(libxlDriverPrivatePtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys; virDomainHostdevSubsysUSBPtr usbsrc = &subsys->u.usb; virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; @@ -3819,7 +3785,6 @@ libxlDomainDetachHostUSBDevice(libxlDriverPrivatePtr driver, cleanup: virDomainHostdevDefFree(detach); - virObjectUnref(cfg); libxl_device_usbdev_dispose(&usbdev); return ret; } @@ -3862,7 +3827,7 @@ libxlDomainDetachNetDevice(libxlDriverPrivatePtr driver, virDomainObjPtr vm, virDomainNetDefPtr net) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); int detachidx; virDomainNetDefPtr detach = NULL; libxl_device_nic nic; @@ -3913,7 +3878,6 @@ libxlDomainDetachNetDevice(libxlDriverPrivatePtr driver, } virDomainNetRemove(vm->def, detachidx); } - virObjectUnref(cfg); virErrorRestore(&save_err); return ret; } @@ -4102,7 +4066,7 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm = NULL; virDomainDefPtr vmdef = NULL; virDomainDeviceDefPtr dev = NULL; @@ -4174,7 +4138,6 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, virDomainDefFree(vmdef); virDomainDeviceDefFree(dev); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4190,7 +4153,7 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm = NULL; virDomainDefPtr vmdef = NULL; virDomainDeviceDefPtr dev = NULL; @@ -4264,7 +4227,6 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, virDomainDefFree(vmdef); virDomainDeviceDefFree(dev); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4280,7 +4242,7 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm = NULL; virDomainDefPtr vmdef = NULL; virDomainDeviceDefPtr dev = NULL; @@ -4346,7 +4308,6 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml, virDomainDefFree(vmdef); virDomainDeviceDefFree(dev); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4355,7 +4316,7 @@ libxlNodeGetFreeMemory(virConnectPtr conn) { libxl_physinfo phy_info; libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); unsigned long long ret = 0; libxl_physinfo_init(&phy_info); @@ -4372,7 +4333,6 @@ libxlNodeGetFreeMemory(virConnectPtr conn) cleanup: libxl_physinfo_dispose(&phy_info); - virObjectUnref(cfg); return ret; } @@ -4386,7 +4346,7 @@ libxlNodeGetCellsFreeMemory(virConnectPtr conn, int ret = -1, nr_nodes = 0; libxl_numainfo *numa_info = NULL; libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); if (virNodeGetCellsFreeMemoryEnsureACL(conn) < 0) goto cleanup; @@ -4420,7 +4380,6 @@ libxlNodeGetCellsFreeMemory(virConnectPtr conn, cleanup: libxl_numainfo_list_free(numa_info, nr_nodes); - virObjectUnref(cfg); return ret; } @@ -4485,7 +4444,7 @@ static int libxlDomainSetAutostart(virDomainPtr dom, int autostart) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; char *configFile = NULL, *autostartLink = NULL; int ret = -1; @@ -4549,7 +4508,6 @@ libxlDomainSetAutostart(virDomainPtr dom, int autostart) VIR_FREE(configFile); VIR_FREE(autostartLink); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4557,7 +4515,7 @@ static char * libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; char * ret = NULL; const char *name = NULL; @@ -4604,7 +4562,6 @@ libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams) cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4615,7 +4572,7 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; libxl_domain_sched_params sc_info; libxl_scheduler sched_id; @@ -4666,7 +4623,6 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom, cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4684,7 +4640,7 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; libxl_domain_sched_params sc_info; int sched_id; @@ -4750,7 +4706,6 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom, cleanup: virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -4847,7 +4802,7 @@ libxlDomainGetNumaParameters(virDomainPtr dom, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; libxl_bitmap nodemap; virBitmapPtr nodes = NULL; @@ -4955,7 +4910,6 @@ libxlDomainGetNumaParameters(virDomainPtr dom, virBitmapFree(nodes); libxl_bitmap_dispose(&nodemap); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } #endif @@ -5062,7 +5016,7 @@ libxlDomainGetTotalCPUStats(libxlDriverPrivatePtr driver, virTypedParameterPtr params, unsigned int nparams) { - libxlDriverConfigPtr cfg; + g_autoptr(libxlDriverConfig) cfg = NULL; libxl_dominfo d_info; int ret = -1; @@ -5087,7 +5041,6 @@ libxlDomainGetTotalCPUStats(libxlDriverPrivatePtr driver, cleanup: libxl_dominfo_dispose(&d_info); - virObjectUnref(cfg); return ret; } @@ -5102,7 +5055,7 @@ libxlDomainGetPerCPUStats(libxlDriverPrivatePtr driver, libxl_vcpuinfo *vcpuinfo; int maxcpu, hostcpus; size_t i; - libxlDriverConfigPtr cfg; + g_autoptr(libxlDriverConfig) cfg = NULL; int ret = -1; if (nparams == 0 && ncpus != 0) @@ -5131,7 +5084,6 @@ libxlDomainGetPerCPUStats(libxlDriverPrivatePtr driver, cleanup: if (vcpuinfo) libxl_vcpuinfo_list_free(vcpuinfo, maxcpu); - virObjectUnref(cfg); return ret; } @@ -5183,7 +5135,7 @@ libxlDomainMemoryStats(virDomainPtr dom, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; - libxlDriverConfigPtr cfg; + g_autoptr(libxlDriverConfig) cfg = NULL; virDomainObjPtr vm; libxl_dominfo d_info; unsigned mem, maxmem; @@ -5227,7 +5179,6 @@ libxlDomainMemoryStats(virDomainPtr dom, cleanup: libxl_dominfo_dispose(&d_info); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -6412,7 +6363,7 @@ libxlConnectGetDomainCapabilities(virConnectPtr conn, unsigned int flags) { libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg; + g_autoptr(libxlDriverConfig) cfg = NULL; char *ret = NULL; int virttype = VIR_DOMAIN_VIRT_XEN; virDomainCapsPtr domCaps = NULL; @@ -6473,7 +6424,6 @@ libxlConnectGetDomainCapabilities(virConnectPtr conn, cleanup: virObjectUnref(domCaps); - virObjectUnref(cfg); return ret; } @@ -6484,7 +6434,7 @@ libxlConnectCompareCPU(virConnectPtr conn, unsigned int flags) { libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg; + g_autoptr(libxlDriverConfig) cfg = NULL; int ret = VIR_CPU_COMPARE_ERROR; bool failIncompatible; @@ -6501,7 +6451,6 @@ libxlConnectCompareCPU(virConnectPtr conn, ret = virCPUCompareXML(cfg->caps->host.arch, cfg->caps->host.cpu, xmlDesc, failIncompatible); - virObjectUnref(cfg); return ret; } diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index ac462aaf3f..a105a03b47 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -348,7 +348,7 @@ libxlDoMigrateSrcSend(libxlDriverPrivatePtr driver, unsigned long flags, int sockfd) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); int xl_flags = 0; int ret; @@ -363,7 +363,6 @@ libxlDoMigrateSrcSend(libxlDriverPrivatePtr driver, ret = -1; } - virObjectUnref(cfg); return ret; } @@ -388,7 +387,7 @@ libxlDomainMigrationSrcBegin(virConnectPtr conn, int *cookieoutlen) { libxlDriverPrivatePtr driver = conn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); libxlMigrationCookiePtr mig = NULL; virDomainDefPtr tmpdef = NULL; virDomainDefPtr def; @@ -438,7 +437,6 @@ libxlDomainMigrationSrcBegin(virConnectPtr conn, cleanup: libxlMigrationCookieFree(mig); virDomainDefFree(tmpdef); - virObjectUnref(cfg); return xml; } @@ -447,7 +445,7 @@ libxlDomainMigrationDstPrepareDef(libxlDriverPrivatePtr driver, const char *dom_xml, const char *dname) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virDomainDefPtr def; char *name = NULL; @@ -469,7 +467,6 @@ libxlDomainMigrationDstPrepareDef(libxlDriverPrivatePtr driver, } cleanup: - virObjectUnref(cfg); VIR_FREE(name); return def; } @@ -657,7 +654,7 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn, unsigned int flags) { libxlDriverPrivatePtr driver = dconn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); libxlMigrationCookiePtr mig = NULL; virDomainObjPtr vm = NULL; char *hostname = NULL; @@ -828,7 +825,6 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn, virURIFree(uri); virObjectUnref(args); virDomainObjEndAPI(&vm); - virObjectUnref(cfg); return ret; } @@ -1158,7 +1154,7 @@ libxlDomainMigrationSrcPerformP2P(libxlDriverPrivatePtr driver, bool useParams; virConnectPtr dconn = NULL; virErrorPtr orig_err = NULL; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virObjectUnlock(vm); dconn = virConnectOpenAuth(dconnuri, &virConnectAuthConfig, 0); @@ -1201,7 +1197,6 @@ libxlDomainMigrationSrcPerformP2P(libxlDriverPrivatePtr driver, virErrorPreserveLast(&orig_err); virObjectUnlock(vm); virObjectUnref(dconn); - virObjectUnref(cfg); virObjectLock(vm); virErrorRestore(&orig_err); return ret; @@ -1278,7 +1273,7 @@ libxlDomainMigrationDstFinish(virConnectPtr dconn, int cancelled) { libxlDriverPrivatePtr driver = dconn->privateData; - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); libxlDomainObjPrivatePtr priv = vm->privateData; virObjectEventPtr event = NULL; virDomainPtr dom = NULL; @@ -1368,7 +1363,6 @@ libxlDomainMigrationDstFinish(virConnectPtr dconn, /* EndJob for corresponding BeginJob in prepare phase */ libxlDomainObjEndJob(driver, vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return dom; } @@ -1378,7 +1372,7 @@ libxlDomainMigrationSrcConfirm(libxlDriverPrivatePtr driver, unsigned int flags, int cancelled) { - libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); libxlDomainObjPrivatePtr priv = vm->privateData; virObjectEventPtr event = NULL; int ret = -1; @@ -1424,6 +1418,5 @@ libxlDomainMigrationSrcConfirm(libxlDriverPrivatePtr driver, /* EndJob for corresponding BeginJob in begin phase */ libxlDomainObjEndJob(driver, vm); virObjectEventStateQueue(driver->domainEventState, event); - virObjectUnref(cfg); return ret; } diff --git a/tests/testutilsxen.c b/tests/testutilsxen.c index 6b6b0bf038..ced562996d 100644 --- a/tests/testutilsxen.c +++ b/tests/testutilsxen.c @@ -111,7 +111,8 @@ libxlDriverPrivatePtr testXLInitDriver(void) void testXLFreeDriver(libxlDriverPrivatePtr driver) { - virObjectUnref(driver->config); + if (driver->config) + g_object_unref(driver->config); if (driver->xmlopt) g_object_unref(driver->xmlopt); virMutexDestroy(&driver->lock); -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/hypervisor/virhostdev.c | 31 +++++++++++++++++++++---------- src/hypervisor/virhostdev.h | 13 +++++++++---- src/libxl/libxl_driver.c | 3 ++- src/lxc/lxc_driver.c | 3 ++- src/qemu/qemu_driver.c | 3 ++- 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c index 9017cc3be8..83298e7674 100644 --- a/src/hypervisor/virhostdev.c +++ b/src/hypervisor/virhostdev.c @@ -44,8 +44,21 @@ VIR_LOG_INIT("util.hostdev"); static virHostdevManagerPtr manager; /* global hostdev manager, never freed */ -static virClassPtr virHostdevManagerClass; -static void virHostdevManagerDispose(void *obj); +G_DEFINE_TYPE(virHostdevManager, vir_hostdev_manager, G_TYPE_OBJECT); + +static void virHostdevManagerFinalize(GObject *obj); + +static void vir_hostdev_manager_init(virHostdevManager *mgr G_GNUC_UNUSED) +{ +} + +static void vir_hostdev_manager_class_init(virHostdevManagerClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virHostdevManagerFinalize; +} + static virHostdevManagerPtr virHostdevManagerNew(void); struct virHostdevIsPCINodeDeviceUsedData { @@ -112,9 +125,6 @@ static int virHostdevIsPCINodeDeviceUsed(virPCIDeviceAddressPtr devAddr, void *o static int virHostdevManagerOnceInit(void) { - if (!VIR_CLASS_NEW(virHostdevManager, virClassForObject())) - return -1; - if (!(manager = virHostdevManagerNew())) return -1; @@ -124,9 +134,9 @@ static int virHostdevManagerOnceInit(void) VIR_ONCE_GLOBAL_INIT(virHostdevManager); static void -virHostdevManagerDispose(void *obj) +virHostdevManagerFinalize(GObject *obj) { - virHostdevManagerPtr hostdevMgr = obj; + virHostdevManagerPtr hostdevMgr = VIR_HOSTDEV_MANAGER(obj); virObjectUnref(hostdevMgr->activePCIHostdevs); virObjectUnref(hostdevMgr->inactivePCIHostdevs); @@ -136,6 +146,8 @@ virHostdevManagerDispose(void *obj) virObjectUnref(hostdevMgr->activeMediatedHostdevs); virObjectUnref(hostdevMgr->activeNVMeHostdevs); VIR_FREE(hostdevMgr->stateDir); + + G_OBJECT_CLASS(vir_hostdev_manager_parent_class)->finalize(obj); } static virHostdevManagerPtr @@ -144,8 +156,7 @@ virHostdevManagerNew(void) g_autoptr(virHostdevManager) hostdevMgr = NULL; bool privileged = geteuid() == 0; - if (!(hostdevMgr = virObjectNew(virHostdevManagerClass))) - return NULL; + hostdevMgr = VIR_HOSTDEV_MANAGER(g_object_new(VIR_TYPE_HOSTDEV_MANAGER, NULL)); if (!(hostdevMgr->activePCIHostdevs = virPCIDeviceListNew())) return NULL; @@ -206,7 +217,7 @@ virHostdevManagerGetDefault(void) if (virHostdevManagerInitialize() < 0) return NULL; - return virObjectRef(manager); + return g_object_ref(manager); } /** diff --git a/src/hypervisor/virhostdev.h b/src/hypervisor/virhostdev.h index 811bda40ed..be5345992c 100644 --- a/src/hypervisor/virhostdev.h +++ b/src/hypervisor/virhostdev.h @@ -30,6 +30,7 @@ #include "conf/domain_conf.h" #include "virmdev.h" #include "virnvme.h" +#include <glib-object.h> typedef enum { VIR_HOSTDEV_STRICT_ACS_CHECK = (1 << 0), /* strict acs check */ @@ -41,10 +42,8 @@ typedef enum { } virHostdevFlag; -typedef struct _virHostdevManager virHostdevManager; -typedef virHostdevManager *virHostdevManagerPtr; struct _virHostdevManager { - virObject parent; + GObject parent; char *stateDir; @@ -59,7 +58,13 @@ struct _virHostdevManager { virNVMeDeviceListPtr activeNVMeHostdevs; }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virHostdevManager, virObjectUnref); +#define VIR_TYPE_HOSTDEV_MANAGER vir_hostdev_manager_get_type() +G_DECLARE_FINAL_TYPE(virHostdevManager, + vir_hostdev_manager, + VIR, + HOSTDEV_MANAGER, + GObject); +typedef virHostdevManager *virHostdevManagerPtr; virHostdevManagerPtr virHostdevManagerGetDefault(void); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index eab8945e48..313918acde 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -505,7 +505,8 @@ libxlStateCleanup(void) if (!libxl_driver) return -1; - virObjectUnref(libxl_driver->hostdevMgr); + if (libxl_driver->hostdevMgr) + g_object_unref(libxl_driver->hostdevMgr); if (libxl_driver->xmlopt) g_object_unref(libxl_driver->xmlopt); virObjectUnref(libxl_driver->domains); diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 07bc7219f1..86f84fd152 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -1603,7 +1603,8 @@ static int lxcStateCleanup(void) virSysinfoDefFree(lxc_driver->hostsysinfo); - virObjectUnref(lxc_driver->hostdevMgr); + if (lxc_driver->hostdevMgr) + g_object_unref(lxc_driver->hostdevMgr); if (lxc_driver->caps) g_object_unref(lxc_driver->caps); virObjectUnref(lxc_driver->securityManager); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index bc28f65a3a..630ece6cc6 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1127,7 +1127,8 @@ qemuStateCleanup(void) virPortAllocatorRangeFree(qemu_driver->webSocketPorts); virPortAllocatorRangeFree(qemu_driver->remotePorts); virHashFree(qemu_driver->sharedDevices); - virObjectUnref(qemu_driver->hostdevMgr); + if (qemu_driver->hostdevMgr) + g_object_unref(qemu_driver->hostdevMgr); virObjectUnref(qemu_driver->securityManager); virObjectUnref(qemu_driver->domainEventState); virObjectUnref(qemu_driver->qemuCapsCache); -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/libxl/libxl_migration.c | 57 +++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index a105a03b47..15724bb262 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,28 @@ 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 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->finalize = libxlMigrationDstArgsFinalize; +} static void @@ -226,26 +247,18 @@ libxlMigrationEatCookie(const char *cookiein, } static void -libxlMigrationDstArgsDispose(void *obj) +libxlMigrationDstArgsFinalize(GObject *obj) { - libxlMigrationDstArgs *args = obj; + libxlMigrationDstArgs *args = LIBXL_MIGRATION_DST_ARGS(obj); libxlMigrationCookieFree(args->migcookie); VIR_FREE(args->socks); virObjectUnref(args->conn); virObjectUnref(args->vm); -} -static int -libxlMigrationDstArgsOnceInit(void) -{ - if (!VIR_CLASS_NEW(libxlMigrationDstArgs, virClassForObject())) - return -1; - - return 0; + G_OBJECT_CLASS(libxl_migration_dst_args_parent_class)->finalize(obj); } -VIR_ONCE_GLOBAL_INIT(libxlMigrationDstArgs); static void libxlDoMigrateDstReceive(void *opaque) @@ -277,7 +290,7 @@ libxlDoMigrateDstReceive(void *opaque) } args->nsocks = 0; VIR_FORCE_CLOSE(recvfd); - virObjectUnref(args); + g_object_unref(args); virDomainObjEndAPI(&vm); } @@ -339,7 +352,7 @@ libxlMigrateDstReceive(virNetSocketPtr sock, } args->nsocks = 0; VIR_FORCE_CLOSE(recvfd); - virObjectUnref(args); + g_object_unref(args); } static int @@ -600,8 +613,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); @@ -634,7 +647,8 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dconn, libxlMigrationCookieFree(mig); VIR_FORCE_CLOSE(dataFD[1]); VIR_FORCE_CLOSE(dataFD[0]); - virObjectUnref(args); + if (args) + g_object_unref(args); /* Remove virDomainObj from domain list */ if (vm) virDomainObjListRemove(driver->domains, vm); @@ -765,8 +779,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); @@ -823,7 +837,8 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn, VIR_FREE(hostname); else virURIFree(uri); - virObjectUnref(args); + if (args) + g_object_unref(args); virDomainObjEndAPI(&vm); return ret; } -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/qemu/qemu_blockjob.c | 55 +++++++++++++++++++--------------------- src/qemu/qemu_blockjob.h | 15 +++++++---- src/qemu/qemu_domain.c | 7 +++-- 3 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 2032c0c1c5..7d6aabe554 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -71,8 +71,21 @@ VIR_ENUM_IMPL(qemuBlockjob, "create", "broken"); -static virClassPtr qemuBlockJobDataClass; +G_DEFINE_TYPE(qemuBlockJobData, qemu_block_job_data, G_TYPE_OBJECT); +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->finalize = qemuBlockJobDataFinalize; +} static void qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job) @@ -88,9 +101,9 @@ qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job) static void -qemuBlockJobDataDispose(void *obj) +qemuBlockJobDataFinalize(GObject *obj) { - qemuBlockJobDataPtr job = obj; + qemuBlockJobDataPtr job = QEMU_BLOCK_JOB_DATA(obj); virObjectUnref(job->chain); virObjectUnref(job->mirrorChain); @@ -99,32 +112,17 @@ qemuBlockJobDataDispose(void *obj) 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 +178,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 +207,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 +424,7 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk) if (!job) return NULL; - return virObjectRef(job); + return g_object_ref(job); } @@ -466,7 +463,7 @@ qemuBlockJobStartupFinalize(virDomainObjPtr vm, if (job->state == QEMU_BLOCKJOB_STATE_NEW) qemuBlockJobUnregister(job, vm); - virObjectUnref(job); + g_object_unref(job); } @@ -1738,7 +1735,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 2506fa2eea..14b86388b0 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1165,7 +1165,10 @@ qemuDomainDiskPrivateDispose(void *obj) virObjectUnref(priv->migrSource); VIR_FREE(priv->qomName); VIR_FREE(priv->nodeCopyOnRead); - virObjectUnref(priv->blockjob); + if (priv->blockjob) + g_object_unref(priv->blockjob); + + G_OBJECT_CLASS(qemu_domain_disk_private_parent_class)->finalize(obj); } static virClassPtr qemuDomainStorageSourcePrivateClass; @@ -2214,7 +2217,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 */ -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/qemu/qemu_conf.c | 36 ++++++++++++++++++------------------ src/qemu/qemu_conf.h | 19 ++++++++++++------- src/qemu/qemu_driver.c | 3 ++- tests/domaincapstest.c | 3 ++- tests/testutilsqemu.c | 3 ++- 5 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 68df8a419a..b0e4ac8ef4 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -68,18 +68,21 @@ VIR_LOG_INIT("qemu.qemu_conf"); #define QEMU_MIGRATION_PORT_MIN 49152 #define QEMU_MIGRATION_PORT_MAX 49215 -static virClassPtr virQEMUDriverConfigClass; -static void virQEMUDriverConfigDispose(void *obj); +G_DEFINE_TYPE(virQEMUDriverConfig, vir_qemu_driver_config, G_TYPE_OBJECT); +static void virQEMUDriverConfigFinalize(GObject *obj); -static int virQEMUConfigOnceInit(void) +static void +vir_qemu_driver_config_init(virQEMUDriverConfig *cfg G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(virQEMUDriverConfig, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(virQEMUConfig); +static void +vir_qemu_driver_config_class_init(virQEMUDriverConfigClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virQEMUDriverConfigFinalize; +} static void @@ -105,13 +108,8 @@ qemuDriverUnlock(virQEMUDriverPtr driver) virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged, const char *root) { - g_autoptr(virQEMUDriverConfig) cfg = NULL; - - if (virQEMUConfigInitialize() < 0) - return NULL; - - if (!(cfg = virObjectNew(virQEMUDriverConfigClass))) - return NULL; + g_autoptr(virQEMUDriverConfig) cfg = + VIR_QEMU_DRIVER_CONFIG(g_object_new(VIR_TYPE_QEMU_DRIVER_CONFIG, NULL)); if (root) { cfg->uri = g_strdup_printf("qemu:///embed?root=%s", root); @@ -294,9 +292,9 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged, } -static void virQEMUDriverConfigDispose(void *obj) +static void virQEMUDriverConfigFinalize(GObject *obj) { - virQEMUDriverConfigPtr cfg = obj; + virQEMUDriverConfigPtr cfg = VIR_QEMU_DRIVER_CONFIG(obj); virBitmapFree(cfg->namespaces); @@ -370,6 +368,8 @@ static void virQEMUDriverConfigDispose(void *obj) VIR_FREE(cfg->swtpmStorageDir); virStringListFree(cfg->capabilityfilters); + + G_OBJECT_CLASS(vir_qemu_driver_config_parent_class)->finalize(obj); } @@ -1219,7 +1219,7 @@ virQEMUDriverConfigPtr virQEMUDriverGetConfig(virQEMUDriverPtr driver) { virQEMUDriverConfigPtr conf; qemuDriverLock(driver); - conf = virObjectRef(driver->config); + conf = g_object_ref(driver->config); qemuDriverUnlock(driver); return conf; } diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 14f9b9e81e..e9a60d5628 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -48,15 +48,13 @@ #include "virfile.h" #include "virfilecache.h" #include "virfirmware.h" +#include <glib-object.h> #define QEMU_DRIVER_NAME "QEMU" typedef struct _virQEMUDriver virQEMUDriver; typedef virQEMUDriver *virQEMUDriverPtr; -typedef struct _virQEMUDriverConfig virQEMUDriverConfig; -typedef virQEMUDriverConfig *virQEMUDriverConfigPtr; - /* Main driver config. The data in these object * instances is immutable, so can be accessed * without locking. Threads must, however, hold @@ -65,15 +63,15 @@ typedef virQEMUDriverConfig *virQEMUDriverConfigPtr; * * eg * qemuDriverLock(driver); - * virQEMUDriverConfigPtr cfg = virObjectRef(driver->config); + * virQEMUDriverConfigPtr cfg = g_object_ref(driver->config); * qemuDriverUnlock(driver); * * ...do stuff with 'cfg'.. * - * virObjectUnref(cfg); + * g_object_unref(cfg); */ struct _virQEMUDriverConfig { - virObject parent; + GObject parent; char *uri; char *root; /* The root directory for embed driver, @@ -222,7 +220,14 @@ struct _virQEMUDriverConfig { char **capabilityfilters; }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virQEMUDriverConfig, virObjectUnref); +#define VIR_TYPE_QEMU_DRIVER_CONFIG vir_qemu_driver_config_get_type() +G_DECLARE_FINAL_TYPE(virQEMUDriverConfig, + vir_qemu_driver_config, + VIR, + QEMU_DRIVER_CONFIG, + GObject); +typedef virQEMUDriverConfig *virQEMUDriverConfigPtr; + /* Main driver state */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 630ece6cc6..3e92629d19 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1146,7 +1146,8 @@ qemuStateCleanup(void) if (qemu_driver->lockFD != -1) virPidFileRelease(qemu_driver->config->stateDir, "driver", qemu_driver->lockFD); - virObjectUnref(qemu_driver->config); + if (qemu_driver->config) + g_object_unref(qemu_driver->config); virMutexDestroy(&qemu_driver->lock); VIR_FREE(qemu_driver); diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index d6f0021665..c4440f478b 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -450,7 +450,8 @@ mymain(void) * file has been added, run "VIR_TEST_REGENERATE_OUTPUT=1 make check". */ - virObjectUnref(cfg); + if (cfg) + g_object_unref(cfg); virFileWrapperClearPrefixes(); diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index a37865bc14..7d27bfa72a 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -307,11 +307,12 @@ void qemuTestDriverFree(virQEMUDriver *driver) virFileDeleteTree(driver->config->configDir); } virObjectUnref(driver->qemuCapsCache); + if (driver->config) + g_object_unref(driver->config); if (driver->xmlopt) g_object_unref(driver->xmlopt); if (driver->caps) g_object_unref(driver->caps); - virObjectUnref(driver->config); virObjectUnref(driver->securityManager); } -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/domain_conf.c | 29 ++-- src/conf/domain_conf.h | 18 +- src/qemu/qemu_domain.c | 347 ++++++++++++++++---------------------- src/qemu/qemu_domain.h | 145 +++++++++++----- src/util/virstoragefile.h | 3 +- 5 files changed, 281 insertions(+), 261 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f3a8a36eb2..eb5155f612 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1768,7 +1768,8 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def) virDomainGraphicsListenDefClear(&def->listens[i]); VIR_FREE(def->listens); - virObjectUnref(def->privateData); + if (def->privateData) + g_object_unref(def->privateData); VIR_FREE(def); } @@ -1816,7 +1817,7 @@ static virDomainVcpuDefPtr virDomainVcpuDefNew(virDomainXMLOptionPtr xmlopt) { virDomainVcpuDefPtr ret = NULL; - g_autoptr(virObject) priv = NULL; + g_autoptr(GObject) priv = NULL; if (xmlopt && xmlopt->privateData.vcpuNew && !(priv = xmlopt->privateData.vcpuNew())) @@ -1839,7 +1840,8 @@ virDomainVcpuDefFree(virDomainVcpuDefPtr info) virBitmapFree(info->cpumask); info->cpumask = NULL; - virObjectUnref(info->privateData); + if (info->privateData) + g_object_unref(info->privateData); VIR_FREE(info); } @@ -2141,7 +2143,8 @@ virDomainDiskDefFree(virDomainDiskDefPtr def) VIR_FREE(def->blkdeviotune.group_name); VIR_FREE(def->virtio); virDomainDeviceInfoClear(&def->info); - virObjectUnref(def->privateData); + if (def->privateData) + g_object_unref(def->privateData); VIR_FREE(def); } @@ -2343,7 +2346,8 @@ void virDomainFSDefFree(virDomainFSDefPtr def) VIR_FREE(def->dst); virDomainDeviceInfoClear(&def->info); VIR_FREE(def->virtio); - virObjectUnref(def->privateData); + if (def->privateData) + g_object_unref(def->privateData); VIR_FREE(def->binary); VIR_FREE(def); @@ -2404,7 +2408,8 @@ virDomainVsockDefFree(virDomainVsockDefPtr vsock) if (!vsock) return; - virObjectUnref(vsock->privateData); + if (vsock->privateData) + g_object_unref(vsock->privateData); virDomainDeviceInfoClear(&vsock->info); VIR_FREE(vsock); } @@ -2492,7 +2497,8 @@ virDomainNetDefFree(virDomainNetDefPtr def) if (!def) return; virDomainNetDefClear(def); - virObjectUnref(def->privateData); + if (def->privateData) + g_object_unref(def->privateData); VIR_FREE(def); } @@ -2635,7 +2641,8 @@ virDomainChrSourceDefFinalize(GObject *obj) size_t i; virDomainChrSourceDefClear(def); - virObjectUnref(def->privateData); + if (def->privateData) + g_object_unref(def->privateData); if (def->seclabels) { for (i = 0; i < def->nseclabels; i++) @@ -2881,7 +2888,8 @@ virDomainVideoDefClear(virDomainVideoDefPtr def) if (def->driver) VIR_FREE(def->driver->vhost_user_binary); VIR_FREE(def->driver); - virObjectUnref(def->privateData); + if (def->privateData) + g_object_unref(def->privateData); memset(def, 0, sizeof(*def)); } @@ -26996,7 +27004,8 @@ virDomainRNGDefFree(virDomainRNGDefPtr def) VIR_FREE(def->source.file); break; case VIR_DOMAIN_RNG_BACKEND_EGD: - virObjectUnref(def->source.chardev); + if (def->source.chardev) + g_object_unref(def->source.chardev); break; case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index b6b2a72dd4..ab1e763ab1 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -528,7 +528,7 @@ typedef enum { struct _virDomainDiskDef { virStorageSourcePtr src; /* non-NULL. XXX Allow NULL for empty cdrom? */ - virObjectPtr privateData; + GObject *privateData; int device; /* enum virDomainDiskDevice */ int bus; /* enum virDomainDiskBus */ @@ -837,7 +837,7 @@ struct _virDomainFSDef { virTristateSwitch posix_lock; virTristateSwitch flock; virDomainVirtioOptionsPtr virtio; - virObjectPtr privateData; + GObject *privateData; }; @@ -1056,7 +1056,7 @@ struct _virDomainNetDef { unsigned int mtu; virNetDevCoalescePtr coalesce; virDomainVirtioOptionsPtr virtio; - virObjectPtr privateData; + GObject *privateData; }; typedef enum { @@ -1175,7 +1175,7 @@ struct _virDomainChrSourceReconnectDef { struct _virDomainChrSourceDef { GObject parent; int type; /* virDomainChrType */ - virObjectPtr privateData; + GObject *privateData; union { /* no <source> for null, vc, stdio */ struct { @@ -1478,7 +1478,7 @@ struct _virDomainVideoDriverDef { }; struct _virDomainVideoDef { - virObjectPtr privateData; + GObject *privateData; int type; /* enum virDomainVideoType */ unsigned int ram; /* kibibytes (multiples of 1024) */ @@ -1625,7 +1625,7 @@ struct _virDomainGraphicsListenDef { }; struct _virDomainGraphicsDef { - virObjectPtr privateData; + GObject *privateData; /* Port value discipline: * Value -1 is legacy syntax indicating that it should be auto-allocated. @@ -2303,7 +2303,7 @@ struct _virDomainVcpuDef { virDomainThreadSchedParam sched; - virObjectPtr privateData; + GObject *privateData; }; struct _virDomainBlkiotune { @@ -2401,7 +2401,7 @@ typedef enum { } virDomainVsockModel; struct _virDomainVsockDef { - virObjectPtr privateData; + GObject *privateData; virDomainVsockModel model; unsigned int guest_cid; @@ -2758,7 +2758,7 @@ struct _virDomainDefParserConfig { typedef void *(*virDomainXMLPrivateDataAllocFunc)(void *); typedef void (*virDomainXMLPrivateDataFreeFunc)(void *); -typedef virObjectPtr (*virDomainXMLPrivateDataNewFunc)(void); +typedef GObject* (*virDomainXMLPrivateDataNewFunc)(void); typedef int (*virDomainXMLPrivateDataFormatFunc)(virBufferPtr, virDomainObjPtr); typedef int (*virDomainXMLPrivateDataParseFunc)(xmlXPathContextPtr, diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 14b86388b0..eb0403031d 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1129,38 +1129,32 @@ qemuDomainSecretInfoDestroy(qemuDomainSecretInfoPtr secinfo) } -static virClassPtr qemuDomainDiskPrivateClass; -static void qemuDomainDiskPrivateDispose(void *obj); +G_DEFINE_TYPE(qemuDomainDiskPrivate, qemu_domain_disk_private, G_TYPE_OBJECT); +static void qemuDomainDiskPrivateFinalize(GObject *obj); -static int -qemuDomainDiskPrivateOnceInit(void) +static void +qemu_domain_disk_private_init(qemuDomainDiskPrivate *priv G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(qemuDomainDiskPrivate, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(qemuDomainDiskPrivate); - -static virObjectPtr -qemuDomainDiskPrivateNew(void) +static void +qemu_domain_disk_private_class_init(qemuDomainDiskPrivateClass *klass) { - qemuDomainDiskPrivatePtr priv; - - if (qemuDomainDiskPrivateInitialize() < 0) - return NULL; + GObjectClass *obj = G_OBJECT_CLASS(klass); - if (!(priv = virObjectNew(qemuDomainDiskPrivateClass))) - return NULL; + obj->finalize = qemuDomainDiskPrivateFinalize; +} - return (virObjectPtr) priv; +static GObject * +qemuDomainDiskPrivateNew(void) +{ + return g_object_new(QEMU_TYPE_DOMAIN_DISK_PRIVATE, NULL); } static void -qemuDomainDiskPrivateDispose(void *obj) +qemuDomainDiskPrivateFinalize(GObject *obj) { - qemuDomainDiskPrivatePtr priv = obj; + qemuDomainDiskPrivatePtr priv = QEMU_DOMAIN_DISK(obj); virObjectUnref(priv->migrSource); VIR_FREE(priv->qomName); @@ -1171,323 +1165,282 @@ qemuDomainDiskPrivateDispose(void *obj) G_OBJECT_CLASS(qemu_domain_disk_private_parent_class)->finalize(obj); } -static virClassPtr qemuDomainStorageSourcePrivateClass; -static void qemuDomainStorageSourcePrivateDispose(void *obj); +G_DEFINE_TYPE(qemuDomainStorageSourcePrivate, qemu_domain_storage_source_private, G_TYPE_OBJECT); +static void qemuDomainStorageSourcePrivateFinalize(GObject *obj); -static int -qemuDomainStorageSourcePrivateOnceInit(void) +static void +qemu_domain_storage_source_private_init(qemuDomainStorageSourcePrivate *priv G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(qemuDomainStorageSourcePrivate, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(qemuDomainStorageSourcePrivate); - -virObjectPtr -qemuDomainStorageSourcePrivateNew(void) +static void +qemu_domain_storage_source_private_class_init(qemuDomainStorageSourcePrivateClass *klass) { - qemuDomainStorageSourcePrivatePtr priv; - - if (qemuDomainStorageSourcePrivateInitialize() < 0) - return NULL; + GObjectClass *obj = G_OBJECT_CLASS(klass); - if (!(priv = virObjectNew(qemuDomainStorageSourcePrivateClass))) - return NULL; + obj->finalize = qemuDomainStorageSourcePrivateFinalize; +} - return (virObjectPtr) priv; +GObject * +qemuDomainStorageSourcePrivateNew(void) +{ + return g_object_new(QEMU_TYPE_DOMAIN_STORAGE_SOURCE_PRIVATE, NULL); } static void -qemuDomainStorageSourcePrivateDispose(void *obj) +qemuDomainStorageSourcePrivateFinalize(GObject *obj) { - qemuDomainStorageSourcePrivatePtr priv = obj; + qemuDomainStorageSourcePrivatePtr priv = QEMU_DOMAIN_STORAGE_SOURCE(obj); g_clear_pointer(&priv->secinfo, qemuDomainSecretInfoFree); g_clear_pointer(&priv->encinfo, qemuDomainSecretInfoFree); + + G_OBJECT_CLASS(qemu_domain_storage_source_private_parent_class)->finalize(obj); } -static virClassPtr qemuDomainVcpuPrivateClass; -static void qemuDomainVcpuPrivateDispose(void *obj); +G_DEFINE_TYPE(qemuDomainVcpuPrivate, qemu_domain_vcpu_private, G_TYPE_OBJECT); +static void qemuDomainVcpuPrivateFinalize(GObject *obj); -static int -qemuDomainVcpuPrivateOnceInit(void) +static void +qemu_domain_vcpu_private_init(qemuDomainVcpuPrivate *priv G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(qemuDomainVcpuPrivate, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(qemuDomainVcpuPrivate); - -static virObjectPtr -qemuDomainVcpuPrivateNew(void) +static void +qemu_domain_vcpu_private_class_init(qemuDomainVcpuPrivateClass *klass) { - qemuDomainVcpuPrivatePtr priv; - - if (qemuDomainVcpuPrivateInitialize() < 0) - return NULL; + GObjectClass *obj = G_OBJECT_CLASS(klass); - if (!(priv = virObjectNew(qemuDomainVcpuPrivateClass))) - return NULL; + obj->finalize = qemuDomainVcpuPrivateFinalize; +} - return (virObjectPtr) priv; +static GObject * +qemuDomainVcpuPrivateNew(void) +{ + return g_object_new(QEMU_TYPE_DOMAIN_VCPU_PRIVATE, NULL); } static void -qemuDomainVcpuPrivateDispose(void *obj) +qemuDomainVcpuPrivateFinalize(GObject *obj) { - qemuDomainVcpuPrivatePtr priv = obj; + qemuDomainVcpuPrivatePtr priv = QEMU_DOMAIN_VCPU(obj); VIR_FREE(priv->type); VIR_FREE(priv->alias); virJSONValueFree(priv->props); - return; + + G_OBJECT_CLASS(qemu_domain_vcpu_private_parent_class)->finalize(obj); } -static virClassPtr qemuDomainChrSourcePrivateClass; -static void qemuDomainChrSourcePrivateDispose(void *obj); +G_DEFINE_TYPE(qemuDomainChrSourcePrivate, qemu_domain_chr_source_private, G_TYPE_OBJECT); +static void qemuDomainChrSourcePrivateFinalize(GObject *obj); -static int -qemuDomainChrSourcePrivateOnceInit(void) +static void +qemu_domain_chr_source_private_init(qemuDomainChrSourcePrivate *priv G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(qemuDomainChrSourcePrivate, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(qemuDomainChrSourcePrivate); - -static virObjectPtr -qemuDomainChrSourcePrivateNew(void) +static void +qemu_domain_chr_source_private_class_init(qemuDomainChrSourcePrivateClass *klass) { - qemuDomainChrSourcePrivatePtr priv; - - if (qemuDomainChrSourcePrivateInitialize() < 0) - return NULL; + GObjectClass *obj = G_OBJECT_CLASS(klass); - if (!(priv = virObjectNew(qemuDomainChrSourcePrivateClass))) - return NULL; + obj->finalize = qemuDomainChrSourcePrivateFinalize; +} - return (virObjectPtr) priv; +static GObject * +qemuDomainChrSourcePrivateNew(void) +{ + return g_object_new(QEMU_TYPE_DOMAIN_CHR_SOURCE_PRIVATE, NULL); } static void -qemuDomainChrSourcePrivateDispose(void *obj) +qemuDomainChrSourcePrivateFinalize(GObject *obj) { - qemuDomainChrSourcePrivatePtr priv = obj; + qemuDomainChrSourcePrivatePtr priv = QEMU_DOMAIN_CHR_SOURCE(obj); g_clear_pointer(&priv->secinfo, qemuDomainSecretInfoFree); + + G_OBJECT_CLASS(qemu_domain_chr_source_private_parent_class)->finalize(obj); } -static virClassPtr qemuDomainVsockPrivateClass; -static void qemuDomainVsockPrivateDispose(void *obj); +G_DEFINE_TYPE(qemuDomainVsockPrivate, qemu_domain_vsock_private, G_TYPE_OBJECT); +static void qemuDomainVsockPrivateFinalize(GObject *obj); -static int -qemuDomainVsockPrivateOnceInit(void) +static void +qemu_domain_vsock_private_init(qemuDomainVsockPrivate *priv) { - if (!VIR_CLASS_NEW(qemuDomainVsockPrivate, virClassForObject())) - return -1; - - return 0; + priv->vhostfd = -1; } -VIR_ONCE_GLOBAL_INIT(qemuDomainVsockPrivate); - -static virObjectPtr -qemuDomainVsockPrivateNew(void) +static void +qemu_domain_vsock_private_class_init(qemuDomainVsockPrivateClass *klass) { - qemuDomainVsockPrivatePtr priv; - - if (qemuDomainVsockPrivateInitialize() < 0) - return NULL; - - if (!(priv = virObjectNew(qemuDomainVsockPrivateClass))) - return NULL; + GObjectClass *obj = G_OBJECT_CLASS(klass); - priv->vhostfd = -1; + obj->finalize = qemuDomainVsockPrivateFinalize; +} - return (virObjectPtr) priv; +static GObject * +qemuDomainVsockPrivateNew(void) +{ + return g_object_new(QEMU_TYPE_DOMAIN_VSOCK_PRIVATE, NULL); } static void -qemuDomainVsockPrivateDispose(void *obj G_GNUC_UNUSED) +qemuDomainVsockPrivateFinalize(GObject *obj) { - qemuDomainVsockPrivatePtr priv = obj; + qemuDomainVsockPrivatePtr priv = QEMU_DOMAIN_VSOCK(obj); VIR_FORCE_CLOSE(priv->vhostfd); + + G_OBJECT_CLASS(qemu_domain_vsock_private_parent_class)->finalize(obj); } -static virClassPtr qemuDomainGraphicsPrivateClass; -static void qemuDomainGraphicsPrivateDispose(void *obj); +G_DEFINE_TYPE(qemuDomainGraphicsPrivate, qemu_domain_graphics_private, G_TYPE_OBJECT); +static void qemuDomainGraphicsPrivateFinalize(GObject *obj); -static int -qemuDomainGraphicsPrivateOnceInit(void) +static void +qemu_domain_graphics_private_init(qemuDomainGraphicsPrivate *priv G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(qemuDomainGraphicsPrivate, virClassForObject())) - return -1; - - return 0; } -VIR_ONCE_GLOBAL_INIT(qemuDomainGraphicsPrivate); - -static virObjectPtr -qemuDomainGraphicsPrivateNew(void) +static void +qemu_domain_graphics_private_class_init(qemuDomainGraphicsPrivateClass *klass) { - qemuDomainGraphicsPrivatePtr priv; - - if (qemuDomainGraphicsPrivateInitialize() < 0) - return NULL; + GObjectClass *obj = G_OBJECT_CLASS(klass); - if (!(priv = virObjectNew(qemuDomainGraphicsPrivateClass))) - return NULL; + obj->finalize = qemuDomainGraphicsPrivateFinalize; +} - return (virObjectPtr) priv; +static GObject * +qemuDomainGraphicsPrivateNew(void) +{ + return g_object_new(QEMU_TYPE_DOMAIN_GRAPHICS_PRIVATE, NULL); } static void -qemuDomainGraphicsPrivateDispose(void *obj) +qemuDomainGraphicsPrivateFinalize(GObject *obj) { - qemuDomainGraphicsPrivatePtr priv = obj; + qemuDomainGraphicsPrivatePtr priv = QEMU_DOMAIN_GRAPHICS(obj); VIR_FREE(priv->tlsAlias); g_clear_pointer(&priv->secinfo, qemuDomainSecretInfoFree); -} + G_OBJECT_CLASS(qemu_domain_graphics_private_parent_class)->finalize(obj); +} -static virClassPtr qemuDomainNetworkPrivateClass; -static void qemuDomainNetworkPrivateDispose(void *obj); +G_DEFINE_TYPE(qemuDomainNetworkPrivate, qemu_domain_network_private, G_TYPE_OBJECT); +static void qemuDomainNetworkPrivateFinalize(GObject *obj); -static int -qemuDomainNetworkPrivateOnceInit(void) +static void +qemu_domain_network_private_init(qemuDomainNetworkPrivate *priv G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(qemuDomainNetworkPrivate, virClassForObject())) - return -1; - - return 0; } +static void +qemu_domain_network_private_class_init(qemuDomainNetworkPrivateClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); -VIR_ONCE_GLOBAL_INIT(qemuDomainNetworkPrivate); + obj->finalize = qemuDomainNetworkPrivateFinalize; +} -static virObjectPtr +static GObject * qemuDomainNetworkPrivateNew(void) { - qemuDomainNetworkPrivatePtr priv; - - if (qemuDomainNetworkPrivateInitialize() < 0) - return NULL; - - if (!(priv = virObjectNew(qemuDomainNetworkPrivateClass))) - return NULL; - - return (virObjectPtr) priv; + return g_object_new(QEMU_TYPE_DOMAIN_NETWORK_PRIVATE, NULL); } static void -qemuDomainNetworkPrivateDispose(void *obj G_GNUC_UNUSED) +qemuDomainNetworkPrivateFinalize(GObject *obj) { - qemuDomainNetworkPrivatePtr priv = obj; + qemuDomainNetworkPrivatePtr priv = QEMU_DOMAIN_NETWORK(obj); qemuSlirpFree(priv->slirp); -} + G_OBJECT_CLASS(qemu_domain_network_private_parent_class)->finalize(obj); +} -static virClassPtr qemuDomainFSPrivateClass; -static void qemuDomainFSPrivateDispose(void *obj); +G_DEFINE_TYPE(qemuDomainFSPrivate, qemu_domain_fs_private, G_TYPE_OBJECT); +static void qemuDomainFSPrivateFinalize(GObject *obj); -static int -qemuDomainFSPrivateOnceInit(void) +static void +qemu_domain_fs_private_init(qemuDomainFSPrivate *priv G_GNUC_UNUSED) { - if (!VIR_CLASS_NEW(qemuDomainFSPrivate, virClassForObject())) - return -1; - - return 0; } +static void +qemu_domain_fs_private_class_init(qemuDomainFSPrivateClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); -VIR_ONCE_GLOBAL_INIT(qemuDomainFSPrivate); - + obj->finalize = qemuDomainFSPrivateFinalize; +} -static virObjectPtr +static GObject * qemuDomainFSPrivateNew(void) { - qemuDomainFSPrivatePtr priv; - - if (qemuDomainFSPrivateInitialize() < 0) - return NULL; - - if (!(priv = virObjectNew(qemuDomainFSPrivateClass))) - return NULL; - - return (virObjectPtr) priv; + return g_object_new(QEMU_TYPE_DOMAIN_FS_PRIVATE, NULL); } static void -qemuDomainFSPrivateDispose(void *obj) +qemuDomainFSPrivateFinalize(GObject *obj) { - qemuDomainFSPrivatePtr priv = obj; + qemuDomainFSPrivatePtr priv = QEMU_DOMAIN_FS(obj); g_free(priv->vhostuser_fs_sock); + + G_OBJECT_CLASS(qemu_domain_fs_private_parent_class)->finalize(obj); } -static virClassPtr qemuDomainVideoPrivateClass; -static void qemuDomainVideoPrivateDispose(void *obj); +G_DEFINE_TYPE(qemuDomainVideoPrivate, qemu_domain_video_private, G_TYPE_OBJECT); +static void qemuDomainVideoPrivateFinalize(GObject *obj); +static void +qemu_domain_video_private_init(qemuDomainVideoPrivate *priv) +{ + priv->vhost_user_fd = -1; +} -static int -qemuDomainVideoPrivateOnceInit(void) +static void +qemu_domain_video_private_class_init(qemuDomainVideoPrivateClass *klass) { - if (!VIR_CLASS_NEW(qemuDomainVideoPrivate, virClassForObject())) - return -1; + GObjectClass *obj = G_OBJECT_CLASS(klass); - return 0; + obj->finalize = qemuDomainVideoPrivateFinalize; } -VIR_ONCE_GLOBAL_INIT(qemuDomainVideoPrivate); - -static virObjectPtr +static GObject * qemuDomainVideoPrivateNew(void) { - qemuDomainVideoPrivatePtr priv; - - if (qemuDomainVideoPrivateInitialize() < 0) - return NULL; - - if (!(priv = virObjectNew(qemuDomainVideoPrivateClass))) - return NULL; - - priv->vhost_user_fd = -1; - - return (virObjectPtr) priv; + return g_object_new(QEMU_TYPE_DOMAIN_VIDEO_PRIVATE, NULL); } static void -qemuDomainVideoPrivateDispose(void *obj) +qemuDomainVideoPrivateFinalize(GObject *obj) { - qemuDomainVideoPrivatePtr priv = obj; + qemuDomainVideoPrivatePtr priv = QEMU_DOMAIN_VIDEO(obj); VIR_FORCE_CLOSE(priv->vhost_user_fd); + + G_OBJECT_CLASS(qemu_domain_video_private_parent_class)->finalize(obj); } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index cf19f4d101..7dbd3ffc69 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -433,13 +433,8 @@ struct _qemuDomainObjPrivate { #define QEMU_DOMAIN_PRIVATE(vm) \ ((qemuDomainObjPrivatePtr) (vm)->privateData) -#define QEMU_DOMAIN_DISK_PRIVATE(disk) \ - ((qemuDomainDiskPrivatePtr) (disk)->privateData) - -typedef struct _qemuDomainDiskPrivate qemuDomainDiskPrivate; -typedef qemuDomainDiskPrivate *qemuDomainDiskPrivatePtr; struct _qemuDomainDiskPrivate { - virObject parent; + GObject parent; /* ideally we want a smarter way to interlock block jobs on single qemu disk * in the future, but for now we just disallow any concurrent job on a @@ -457,13 +452,20 @@ struct _qemuDomainDiskPrivate { char *nodeCopyOnRead; /* nodename of the disk-wide copy-on-read blockdev layer */ }; -#define QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src) \ - ((qemuDomainStorageSourcePrivatePtr) (src)->privateData) +#define QEMU_TYPE_DOMAIN_DISK_PRIVATE qemu_domain_disk_private_get_type() +G_DECLARE_FINAL_TYPE(qemuDomainDiskPrivate, + qemu_domain_disk_private, + QEMU, + DOMAIN_DISK, + GObject); +typedef qemuDomainDiskPrivate *qemuDomainDiskPrivatePtr; + +#define QEMU_DOMAIN_DISK_PRIVATE(disk) \ + ((qemuDomainDiskPrivatePtr) (disk)->privateData) + -typedef struct _qemuDomainStorageSourcePrivate qemuDomainStorageSourcePrivate; -typedef qemuDomainStorageSourcePrivate *qemuDomainStorageSourcePrivatePtr; struct _qemuDomainStorageSourcePrivate { - virObject parent; + GObject parent; /* data required for authentication to the storage source */ qemuDomainSecretInfoPtr secinfo; @@ -475,12 +477,23 @@ struct _qemuDomainStorageSourcePrivate { qemuDomainSecretInfoPtr httpcookie; }; -virObjectPtr qemuDomainStorageSourcePrivateNew(void); +#define QEMU_TYPE_DOMAIN_STORAGE_SOURCE_PRIVATE qemu_domain_storage_source_private_get_type() +G_DECLARE_FINAL_TYPE(qemuDomainStorageSourcePrivate, + qemu_domain_storage_source_private, + QEMU, + DOMAIN_STORAGE_SOURCE, + GObject); +typedef qemuDomainStorageSourcePrivate *qemuDomainStorageSourcePrivatePtr; + +#define QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src) \ + ((qemuDomainStorageSourcePrivatePtr) (src)->privateData) + + +GObject *qemuDomainStorageSourcePrivateNew(void); + -typedef struct _qemuDomainVcpuPrivate qemuDomainVcpuPrivate; -typedef qemuDomainVcpuPrivate *qemuDomainVcpuPrivatePtr; struct _qemuDomainVcpuPrivate { - virObject parent; + GObject parent; pid_t tid; /* vcpu thread id */ int enable_id; /* order in which the vcpus were enabled in qemu */ @@ -500,6 +513,14 @@ struct _qemuDomainVcpuPrivate { int vcpus; }; +#define QEMU_TYPE_DOMAIN_VCPU_PRIVATE qemu_domain_vcpu_private_get_type() +G_DECLARE_FINAL_TYPE(qemuDomainVcpuPrivate, + qemu_domain_vcpu_private, + QEMU, + DOMAIN_VCPU, + GObject); +typedef qemuDomainVcpuPrivate *qemuDomainVcpuPrivatePtr; + #define QEMU_DOMAIN_VCPU_PRIVATE(vcpu) \ ((qemuDomainVcpuPrivatePtr) (vcpu)->privateData) @@ -513,77 +534,113 @@ struct qemuDomainDiskInfo { char *nodename; }; -#define QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev) \ - ((qemuDomainChrSourcePrivatePtr) (dev)->privateData) - -typedef struct _qemuDomainChrSourcePrivate qemuDomainChrSourcePrivate; -typedef qemuDomainChrSourcePrivate *qemuDomainChrSourcePrivatePtr; struct _qemuDomainChrSourcePrivate { - virObject parent; + GObject parent; /* for char devices using secret * NB: *not* to be written to qemu domain object XML */ qemuDomainSecretInfoPtr secinfo; }; +#define QEMU_TYPE_DOMAIN_CHR_SOURCE_PRIVATE qemu_domain_chr_source_private_get_type() +G_DECLARE_FINAL_TYPE(qemuDomainChrSourcePrivate, + qemu_domain_chr_source_private, + QEMU, + DOMAIN_CHR_SOURCE, + GObject); +typedef qemuDomainChrSourcePrivate *qemuDomainChrSourcePrivatePtr; + +#define QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev) \ + ((qemuDomainChrSourcePrivatePtr) (dev)->privateData) + -typedef struct _qemuDomainVsockPrivate qemuDomainVsockPrivate; -typedef qemuDomainVsockPrivate *qemuDomainVsockPrivatePtr; struct _qemuDomainVsockPrivate { - virObject parent; + GObject parent; int vhostfd; }; +#define QEMU_TYPE_DOMAIN_VSOCK_PRIVATE qemu_domain_vsock_private_get_type() +G_DECLARE_FINAL_TYPE(qemuDomainVsockPrivate, + qemu_domain_vsock_private, + QEMU, + DOMAIN_VSOCK, + GObject); +typedef qemuDomainVsockPrivate *qemuDomainVsockPrivatePtr; -#define QEMU_DOMAIN_VIDEO_PRIVATE(dev) \ - ((qemuDomainVideoPrivatePtr) (dev)->privateData) -typedef struct _qemuDomainVideoPrivate qemuDomainVideoPrivate; -typedef qemuDomainVideoPrivate *qemuDomainVideoPrivatePtr; struct _qemuDomainVideoPrivate { - virObject parent; + GObject parent; int vhost_user_fd; }; +#define QEMU_TYPE_DOMAIN_VIDEO_PRIVATE qemu_domain_video_private_get_type() +G_DECLARE_FINAL_TYPE(qemuDomainVideoPrivate, + qemu_domain_video_private, + QEMU, + DOMAIN_VIDEO, + GObject); +typedef qemuDomainVideoPrivate *qemuDomainVideoPrivatePtr; + +#define QEMU_DOMAIN_VIDEO_PRIVATE(dev) \ + ((qemuDomainVideoPrivatePtr) (dev)->privateData) -#define QEMU_DOMAIN_GRAPHICS_PRIVATE(dev) \ - ((qemuDomainGraphicsPrivatePtr) (dev)->privateData) -typedef struct _qemuDomainGraphicsPrivate qemuDomainGraphicsPrivate; -typedef qemuDomainGraphicsPrivate *qemuDomainGraphicsPrivatePtr; struct _qemuDomainGraphicsPrivate { - virObject parent; + GObject parent; char *tlsAlias; qemuDomainSecretInfoPtr secinfo; }; +#define QEMU_TYPE_DOMAIN_GRAPHICS_PRIVATE qemu_domain_graphics_private_get_type() +G_DECLARE_FINAL_TYPE(qemuDomainGraphicsPrivate, + qemu_domain_graphics_private, + QEMU, + DOMAIN_GRAPHICS, + GObject); +typedef qemuDomainGraphicsPrivate *qemuDomainGraphicsPrivatePtr; + +#define QEMU_DOMAIN_GRAPHICS_PRIVATE(dev) \ + ((qemuDomainGraphicsPrivatePtr) (dev)->privateData) -#define QEMU_DOMAIN_NETWORK_PRIVATE(dev) \ - ((qemuDomainNetworkPrivatePtr) (dev)->privateData) -typedef struct _qemuDomainNetworkPrivate qemuDomainNetworkPrivate; -typedef qemuDomainNetworkPrivate *qemuDomainNetworkPrivatePtr; struct _qemuDomainNetworkPrivate { - virObject parent; + GObject parent; qemuSlirpPtr slirp; }; +#define QEMU_TYPE_DOMAIN_NETWORK_PRIVATE qemu_domain_network_private_get_type() +G_DECLARE_FINAL_TYPE(qemuDomainNetworkPrivate, + qemu_domain_network_private, + QEMU, + DOMAIN_NETWORK, + GObject); +typedef qemuDomainNetworkPrivate *qemuDomainNetworkPrivatePtr; + +#define QEMU_DOMAIN_NETWORK_PRIVATE(dev) \ + ((qemuDomainNetworkPrivatePtr) (dev)->privateData) -#define QEMU_DOMAIN_FS_PRIVATE(dev) \ - ((qemuDomainFSPrivatePtr) (dev)->privateData) -typedef struct _qemuDomainFSPrivate qemuDomainFSPrivate; -typedef qemuDomainFSPrivate *qemuDomainFSPrivatePtr; struct _qemuDomainFSPrivate { - virObject parent; + GObject parent; char *vhostuser_fs_sock; }; +#define QEMU_TYPE_DOMAIN_FS_PRIVATE qemu_domain_fs_private_get_type() +G_DECLARE_FINAL_TYPE(qemuDomainFSPrivate, + qemu_domain_fs_private, + QEMU, + DOMAIN_FS, + GObject); +typedef qemuDomainFSPrivate *qemuDomainFSPrivatePtr; + +#define QEMU_DOMAIN_FS_PRIVATE(dev) \ + ((qemuDomainFSPrivatePtr) (dev)->privateData) + typedef enum { QEMU_PROCESS_EVENT_WATCHDOG = 0, diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index 7939c09cd5..a744bcbf5c 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -30,6 +30,7 @@ #include "virsecret.h" #include "virenum.h" #include "virpci.h" +#include <glib-object.h> /* Minimum header size required to probe all known formats with * virStorageFileProbeFormat, or obtain metadata from a known format. @@ -304,7 +305,7 @@ struct _virStorageSource { virStorageSourceInitiatorDef initiator; - virObjectPtr privateData; + GObject *privateData; int format; /* virStorageFileFormat in domain backing chains, but * pool-specific enum for storage volumes */ -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/conf/snapshot_conf.c | 3 ++- src/conf/snapshot_conf.h | 2 +- src/conf/virsavecookie.c | 10 ++++---- src/conf/virsavecookie.h | 14 +++++------ src/qemu/qemu_domain.c | 53 +++++++++++++++++++--------------------- src/qemu/qemu_domain.h | 12 ++++++--- src/qemu/qemu_driver.c | 8 +++--- 7 files changed, 52 insertions(+), 50 deletions(-) diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index 37b5c2fdf7..b58c00e86e 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -129,7 +129,8 @@ virDomainSnapshotDefDispose(void *obj) for (i = 0; i < def->ndisks; i++) virDomainSnapshotDiskDefClear(&def->disks[i]); VIR_FREE(def->disks); - virObjectUnref(def->cookie); + if (def->cookie) + g_object_unref(def->cookie); } int diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h index b5b1ef2718..97a7b3b4e5 100644 --- a/src/conf/snapshot_conf.h +++ b/src/conf/snapshot_conf.h @@ -84,7 +84,7 @@ struct _virDomainSnapshotDef { size_t ndisks; /* should not exceed dom->ndisks */ virDomainSnapshotDiskDef *disks; - virObjectPtr cookie; + GObject *cookie; }; G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainSnapshotDef, virObjectUnref); diff --git a/src/conf/virsavecookie.c b/src/conf/virsavecookie.c index bdc22bb324..6cdfa4fc5a 100644 --- a/src/conf/virsavecookie.c +++ b/src/conf/virsavecookie.c @@ -34,7 +34,7 @@ VIR_LOG_INIT("conf.savecookie"); static int virSaveCookieParseNode(xmlXPathContextPtr ctxt, - virObjectPtr *obj, + GObject **obj, virSaveCookieCallbacksPtr saveCookie) { *obj = NULL; @@ -54,7 +54,7 @@ virSaveCookieParseNode(xmlXPathContextPtr ctxt, int virSaveCookieParse(xmlXPathContextPtr ctxt, - virObjectPtr *obj, + GObject **obj, virSaveCookieCallbacksPtr saveCookie) { xmlNodePtr node = ctxt->node; @@ -77,7 +77,7 @@ virSaveCookieParse(xmlXPathContextPtr ctxt, int virSaveCookieParseString(const char *xml, - virObjectPtr *obj, + GObject **obj, virSaveCookieCallbacksPtr saveCookie) { xmlDocPtr doc = NULL; @@ -105,7 +105,7 @@ virSaveCookieParseString(const char *xml, int virSaveCookieFormatBuf(virBufferPtr buf, - virObjectPtr obj, + GObject *obj, virSaveCookieCallbacksPtr saveCookie) { if (!obj || !saveCookie || !saveCookie->format) @@ -125,7 +125,7 @@ virSaveCookieFormatBuf(virBufferPtr buf, char * -virSaveCookieFormat(virObjectPtr obj, +virSaveCookieFormat(GObject *obj, virSaveCookieCallbacksPtr saveCookie) { virBuffer buf = VIR_BUFFER_INITIALIZER; diff --git a/src/conf/virsavecookie.h b/src/conf/virsavecookie.h index eafffbed66..b17701c727 100644 --- a/src/conf/virsavecookie.h +++ b/src/conf/virsavecookie.h @@ -23,14 +23,14 @@ #include <libxml/xpath.h> #include "internal.h" -#include "virobject.h" #include "virbuffer.h" +#include <glib-object.h> typedef int (*virSaveCookieParseFunc)(xmlXPathContextPtr ctxt, - virObjectPtr *obj); + GObject **obj); typedef int (*virSaveCookieFormatFunc)(virBufferPtr buf, - virObjectPtr obj); + GObject *obj); typedef struct _virSaveCookieCallbacks virSaveCookieCallbacks; typedef virSaveCookieCallbacks *virSaveCookieCallbacksPtr; @@ -42,19 +42,19 @@ struct _virSaveCookieCallbacks { int virSaveCookieParse(xmlXPathContextPtr ctxt, - virObjectPtr *obj, + GObject **obj, virSaveCookieCallbacksPtr saveCookie); int virSaveCookieParseString(const char *xml, - virObjectPtr *obj, + GObject **obj, virSaveCookieCallbacksPtr saveCookie); int virSaveCookieFormatBuf(virBufferPtr buf, - virObjectPtr obj, + GObject *obj, virSaveCookieCallbacksPtr saveCookie); char * -virSaveCookieFormat(virObjectPtr obj, +virSaveCookieFormat(GObject *obj, virSaveCookieCallbacksPtr saveCookie); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index eb0403031d..a12ecc0e25 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -162,21 +162,12 @@ struct _qemuDomainLogContext { }; G_DEFINE_TYPE(qemuDomainLogContext, qemu_domain_log_context, G_TYPE_OBJECT); -static virClassPtr qemuDomainSaveCookieClass; +G_DEFINE_TYPE(qemuDomainSaveCookie, qemu_domain_save_cookie, G_TYPE_OBJECT); static void qemuDomainLogContextFinalize(GObject *obj); -static void qemuDomainSaveCookieDispose(void *obj); +static void qemuDomainSaveCookieFinalize(GObject *obj); -static int -qemuDomainOnceInit(void) -{ - if (!VIR_CLASS_NEW(qemuDomainSaveCookie, virClassForObject())) - return -1; - - return 0; -} - static void qemu_domain_log_context_init(qemuDomainLogContext *logctxt G_GNUC_UNUSED) { } @@ -188,8 +179,6 @@ static void qemu_domain_log_context_class_init(qemuDomainLogContextClass *klass) obj->finalize = qemuDomainLogContextFinalize; } -VIR_ONCE_GLOBAL_INIT(qemuDomain); - static void qemuDomainLogContextFinalize(GObject *object) { @@ -203,6 +192,20 @@ qemuDomainLogContextFinalize(GObject *object) G_OBJECT_CLASS(qemu_domain_log_context_parent_class)->finalize(object); } +static void +qemu_domain_save_cookie_init(qemuDomainSaveCookie *cookie G_GNUC_UNUSED) +{ +} + +static void +qemu_domain_save_cookie_class_init(qemuDomainSaveCookieClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = qemuDomainSaveCookieFinalize; +} + + const char * qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job, int phase G_GNUC_UNUSED) @@ -12736,13 +12739,15 @@ qemuDomainGetStorageSourceByDevstr(const char *devstr, static void -qemuDomainSaveCookieDispose(void *obj) +qemuDomainSaveCookieFinalize(GObject *obj) { - qemuDomainSaveCookiePtr cookie = obj; + qemuDomainSaveCookiePtr cookie = QEMU_DOMAIN_SAVE_COOKIE(obj); VIR_DEBUG("cookie=%p", cookie); virCPUDefFree(cookie->cpu); + + G_OBJECT_CLASS(qemu_domain_save_cookie_parent_class)->finalize(obj); } @@ -12752,11 +12757,7 @@ qemuDomainSaveCookieNew(virDomainObjPtr vm) qemuDomainObjPrivatePtr priv = vm->privateData; g_autoptr(qemuDomainSaveCookie) cookie = NULL; - if (qemuDomainInitialize() < 0) - return NULL; - - if (!(cookie = virObjectNew(qemuDomainSaveCookieClass))) - return NULL; + cookie = QEMU_DOMAIN_SAVE_COOKIE(g_object_new(QEMU_TYPE_DOMAIN_SAVE_COOKIE, NULL)); if (priv->origCPU && !(cookie->cpu = virCPUDefCopy(vm->def->cpu))) return NULL; @@ -12772,15 +12773,11 @@ qemuDomainSaveCookieNew(virDomainObjPtr vm) static int qemuDomainSaveCookieParse(xmlXPathContextPtr ctxt G_GNUC_UNUSED, - virObjectPtr *obj) + GObject **obj) { g_autoptr(qemuDomainSaveCookie) cookie = NULL; - if (qemuDomainInitialize() < 0) - return -1; - - if (!(cookie = virObjectNew(qemuDomainSaveCookieClass))) - return -1; + cookie = QEMU_DOMAIN_SAVE_COOKIE(g_object_new(QEMU_TYPE_DOMAIN_SAVE_COOKIE, NULL)); if (virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, &cookie->cpu) < 0) @@ -12788,14 +12785,14 @@ qemuDomainSaveCookieParse(xmlXPathContextPtr ctxt G_GNUC_UNUSED, cookie->slirpHelper = virXPathBoolean("boolean(./slirpHelper)", ctxt) > 0; - *obj = (virObjectPtr) g_steal_pointer(&cookie); + *obj = (GObject *)g_steal_pointer(&cookie); return 0; } static int qemuDomainSaveCookieFormat(virBufferPtr buf, - virObjectPtr obj) + GObject *obj) { qemuDomainSaveCookiePtr cookie = (qemuDomainSaveCookiePtr) obj; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 7dbd3ffc69..65a1f03a2b 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -672,16 +672,20 @@ void qemuProcessEventFree(struct qemuProcessEvent *event); G_DECLARE_FINAL_TYPE(qemuDomainLogContext, qemu_domain_log_context, QEMU, DOMAIN_LOG_CONTEXT, GObject); typedef qemuDomainLogContext *qemuDomainLogContextPtr; -typedef struct _qemuDomainSaveCookie qemuDomainSaveCookie; -typedef qemuDomainSaveCookie *qemuDomainSaveCookiePtr; struct _qemuDomainSaveCookie { - virObject parent; + GObject parent; virCPUDefPtr cpu; bool slirpHelper; }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuDomainSaveCookie, virObjectUnref); +#define QEMU_TYPE_DOMAIN_SAVE_COOKIE qemu_domain_save_cookie_get_type() +G_DECLARE_FINAL_TYPE(qemuDomainSaveCookie, + qemu_domain_save_cookie, + QEMU, + DOMAIN_SAVE_COOKIE, + GObject); +typedef qemuDomainSaveCookie *qemuDomainSaveCookiePtr; typedef struct _qemuDomainXmlNsDef qemuDomainXmlNsDef; typedef qemuDomainXmlNsDef *qemuDomainXmlNsDefPtr; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3e92629d19..2d2c08b18f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2890,7 +2890,7 @@ virQEMUSaveDataNew(char *domXML, data->xml = g_steal_pointer(&domXML); if (cookieObj && - !(data->cookie = virSaveCookieFormat((virObjectPtr) cookieObj, + !(data->cookie = virSaveCookieFormat((GObject *) cookieObj, virDomainXMLOptionGetSaveCookie(xmlopt)))) goto error; @@ -6849,7 +6849,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, g_autoptr(qemuDomainSaveCookie) cookie = NULL; int rc = 0; - if (virSaveCookieParseString(data->cookie, (virObjectPtr *)&cookie, + if (virSaveCookieParseString(data->cookie, (GObject **)&cookie, virDomainXMLOptionGetSaveCookie(driver->xmlopt)) < 0) goto cleanup; @@ -14490,7 +14490,7 @@ qemuDomainSnapshotCreateActiveInternal(virQEMUDriverPtr driver, if (ret < 0) goto cleanup; - if (!(snapdef->cookie = (virObjectPtr) qemuDomainSaveCookieNew(vm))) + if (!(snapdef->cookie = (GObject *) qemuDomainSaveCookieNew(vm))) goto cleanup; if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT) { @@ -15499,7 +15499,7 @@ qemuDomainSnapshotCreateActiveExternal(virQEMUDriverPtr driver, if (!(xml = qemuDomainDefFormatLive(driver, priv->qemuCaps, vm->def, priv->origCPU, true, true)) || - !(snapdef->cookie = (virObjectPtr) qemuDomainSaveCookieNew(vm))) + !(snapdef->cookie = (GObject *) qemuDomainSaveCookieNew(vm))) goto cleanup; if (!(data = virQEMUSaveDataNew(xml, -- 2.25.1

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com> --- src/qemu/qemu_blockjob.c | 71 ++++++++++++++++++--------------------- src/qemu/qemu_domain.c | 13 +++---- src/util/virstoragefile.c | 41 +++++++++++----------- src/util/virstoragefile.h | 6 ++-- 4 files changed, 65 insertions(+), 66 deletions(-) diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 7d6aabe554..767ac54170 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -91,10 +91,10 @@ static void qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job) { if (job->type == QEMU_BLOCKJOB_TYPE_CREATE) - virObjectUnref(job->data.create.src); + g_object_unref(job->data.create.src); if (job->type == QEMU_BLOCKJOB_TYPE_BACKUP) { - virObjectUnref(job->data.backup.store); + g_object_unref(job->data.backup.store); g_free(job->data.backup.bitmap); } } @@ -105,8 +105,10 @@ qemuBlockJobDataFinalize(GObject *obj) { qemuBlockJobDataPtr job = QEMU_BLOCK_JOB_DATA(obj); - virObjectUnref(job->chain); - virObjectUnref(job->mirrorChain); + if (job->chain) + g_object_unref(job->chain); + if (job->mirrorChain) + g_object_unref(job->mirrorChain); qemuBlockJobDataDisposeJobdata(job); @@ -185,7 +187,7 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job, if (disk) { job->disk = disk; - job->chain = virObjectRef(disk->src); + job->chain = g_object_ref(disk->src); QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = g_object_ref(job); } @@ -337,9 +339,9 @@ qemuBlockJobNewCreate(virDomainObjPtr vm, return NULL; if (virStorageSourceIsBacking(chain)) - job->chain = virObjectRef(chain); + job->chain = g_object_ref(chain); - job->data.create.src = virObjectRef(src); + job->data.create.src = g_object_ref(src); if (qemuBlockJobRegister(job, vm, NULL, true) < 0) return NULL; @@ -370,7 +372,7 @@ qemuBlockJobDiskNewCopy(virDomainObjPtr vm, if (!(job = qemuBlockJobDataNew(QEMU_BLOCKJOB_TYPE_COPY, jobname))) return NULL; - job->mirrorChain = virObjectRef(mirror); + job->mirrorChain = g_object_ref(mirror); if (shallow && !reuse) job->data.copy.shallownew = true; @@ -399,7 +401,7 @@ qemuBlockJobDiskNewBackup(virDomainObjPtr vm, return NULL; job->data.backup.bitmap = g_strdup(bitmap); - job->data.backup.store = virObjectRef(store); + job->data.backup.store = g_object_ref(store); /* backup jobs are usually started in bulk by transaction so the caller * shall save the status XML */ @@ -688,14 +690,12 @@ qemuBlockJobRewriteConfigDiskSource(virDomainObjPtr vm, /* discard any detected backing store */ if (virStorageSourceIsBacking(n->backingStore) && n->backingStore->detected) { - virObjectUnref(n->backingStore); - n->backingStore = NULL; + g_clear_object(&n->backingStore); break; } } - virObjectUnref(persistDisk->src); - persistDisk->src = g_steal_pointer(©); + g_set_object(&persistDisk->src, copy); } @@ -729,8 +729,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver, disk->dst); } - virObjectUnref(disk->src); - disk->src = disk->mirror; + g_set_object(&disk->src, disk->mirror); } else { if (disk->mirror) { virDomainLockImageDetach(driver->lockManager, vm, disk->mirror); @@ -740,7 +739,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver, * Remove security driver metadata so that they are not leaked. */ qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->mirror); - virObjectUnref(disk->mirror); + g_object_unref(disk->mirror); } qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->src); @@ -817,8 +816,7 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver, * Remove security driver metadata so that they are not leaked. */ qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->mirror); - virObjectUnref(disk->mirror); - disk->mirror = NULL; + g_clear_object(&disk->mirror); } disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE; disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN; @@ -930,8 +928,8 @@ qemuBlockJobClearConfigChain(virDomainObjPtr vm, if (!virStorageSourceIsSameLocation(disk->src, cfgdisk->src)) return; - virObjectUnref(cfgdisk->src->backingStore); - cfgdisk->src->backingStore = NULL; + if (cfgdisk->src->backingStore) + g_clear_object(&cfgdisk->src->backingStore); } @@ -997,14 +995,16 @@ qemuBlockJobProcessEventCompletedPull(virQEMUDriverPtr driver, if (baseparent) baseparent->backingStore = NULL; qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, tmp); - virObjectUnref(tmp); + if (tmp) + g_object_unref(tmp); if (cfgdisk) { tmp = cfgdisk->src->backingStore; cfgdisk->src->backingStore = cfgbase; if (cfgbaseparent) cfgbaseparent->backingStore = NULL; - virObjectUnref(tmp); + if (tmp) + g_object_unref(tmp); } } @@ -1171,8 +1171,7 @@ qemuBlockJobProcessEventCompletedCommit(virQEMUDriverPtr driver, if (job->data.commit.deleteCommittedImages) qemuBlockJobDeleteImages(driver, vm, job->disk, job->data.commit.top); - virObjectUnref(job->data.commit.top); - job->data.commit.top = NULL; + g_clear_object(&job->data.commit.top); if (cfgbaseparent) { cfgbase = cfgbaseparent->backingStore; @@ -1183,7 +1182,8 @@ qemuBlockJobProcessEventCompletedCommit(virQEMUDriverPtr driver, else cfgdisk->src = cfgbase; - virObjectUnref(cfgtop); + if (cfgtop) + g_object_unref(cfgtop); } } @@ -1249,7 +1249,8 @@ qemuBlockJobProcessEventCompletedActiveCommit(virQEMUDriverPtr driver, cfgbaseparent->backingStore = NULL; cfgdisk->src = cfgbase; cfgdisk->src->readonly = cfgtop->readonly; - virObjectUnref(cfgtop); + if (cfgtop) + g_object_unref(cfgtop); } /* Move security driver metadata */ @@ -1265,11 +1266,9 @@ qemuBlockJobProcessEventCompletedActiveCommit(virQEMUDriverPtr driver, if (job->data.commit.deleteCommittedImages) qemuBlockJobDeleteImages(driver, vm, job->disk, job->data.commit.top); - virObjectUnref(job->data.commit.top); - job->data.commit.top = NULL; + g_clear_object(&job->data.commit.top); /* the mirror element does not serve functional purpose for the commit job */ - virObjectUnref(job->disk->mirror); - job->disk->mirror = NULL; + g_clear_object(&job->disk->mirror); } @@ -1297,8 +1296,7 @@ qemuBlockJobProcessEventConcludedCopyPivot(virQEMUDriverPtr driver, qemuBlockJobRewriteConfigDiskSource(vm, job->disk, job->disk->mirror); qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, job->disk->src); - virObjectUnref(job->disk->src); - job->disk->src = g_steal_pointer(&job->disk->mirror); + g_set_object(&job->disk->src, job->disk->mirror); } @@ -1316,8 +1314,7 @@ qemuBlockJobProcessEventConcludedCopyAbort(virQEMUDriverPtr driver, return; qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, job->disk->mirror); - virObjectUnref(job->disk->mirror); - job->disk->mirror = NULL; + g_clear_object(&job->disk->mirror); } @@ -1338,8 +1335,7 @@ qemuBlockJobProcessEventFailedActiveCommit(virQEMUDriverPtr driver, * not leaking security driver metadata is more important. */ qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->mirror); - virObjectUnref(disk->mirror); - disk->mirror = NULL; + g_clear_object(&disk->mirror); } @@ -1389,8 +1385,7 @@ qemuBlockJobProcessEventConcludedCreate(virQEMUDriverPtr driver, * it will handle further hotplug of the created volume and also that * the 'chain' which was registered is under their control */ if (job->synchronous) { - virObjectUnref(job->chain); - job->chain = NULL; + g_clear_object(&job->chain); return; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a12ecc0e25..7523769d9b 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1159,7 +1159,8 @@ qemuDomainDiskPrivateFinalize(GObject *obj) { qemuDomainDiskPrivatePtr priv = QEMU_DOMAIN_DISK(obj); - virObjectUnref(priv->migrSource); + if (priv->migrSource) + g_object_unref(priv->migrSource); VIR_FREE(priv->qomName); VIR_FREE(priv->nodeCopyOnRead); if (priv->blockjob) @@ -2247,10 +2248,10 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv) virHashRemoveAll(priv->blockjobs); - virObjectUnref(priv->pflash0); - priv->pflash0 = NULL; - virObjectUnref(priv->pflash1); - priv->pflash1 = NULL; + if (priv->pflash0) + g_clear_object(&priv->pflash0); + if (priv->pflash1) + g_clear_object(&priv->pflash1); virDomainBackupDefFree(priv->backup); priv->backup = NULL; @@ -3386,7 +3387,7 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObjPtr vm, if (mirror) { if (disk) - job->mirrorChain = virObjectRef(disk->mirror); + job->mirrorChain = g_object_ref(disk->mirror); else invalidData = true; } diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index ffc8bdb344..d367ebe8c3 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -45,7 +45,21 @@ VIR_LOG_INIT("util.storagefile"); -static virClassPtr virStorageSourceClass; +G_DEFINE_TYPE(virStorageSource, vir_storage_source, G_TYPE_OBJECT); +static void virStorageSourceFinalize(GObject *obj); + +static void +vir_storage_source_init(virStorageSource *src G_GNUC_UNUSED) +{ +} + +static void +vir_storage_source_class_init(virStorageSourceClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + + obj->finalize = virStorageSourceFinalize; +} VIR_ENUM_IMPL(virStorage, VIR_STORAGE_TYPE_LAST, @@ -2682,8 +2696,8 @@ virStorageSourceBackingStoreClear(virStorageSourcePtr def) VIR_FREE(def->backingStoreRaw); /* recursively free backing chain */ - virObjectUnref(def->backingStore); - def->backingStore = NULL; + if (def->backingStore) + g_clear_object(&def->backingStore); } @@ -2739,34 +2753,21 @@ virStorageSourceClear(virStorageSourcePtr def) static void -virStorageSourceDispose(void *obj) +virStorageSourceFinalize(GObject *obj) { - virStorageSourcePtr src = obj; + virStorageSourcePtr src = VIR_STORAGE_SOURCE(obj); virStorageSourceClear(src); -} - -static int -virStorageSourceOnceInit(void) -{ - if (!VIR_CLASS_NEW(virStorageSource, virClassForObject())) - return -1; - - return 0; + G_OBJECT_CLASS(vir_storage_source_parent_class)->finalize(obj); } -VIR_ONCE_GLOBAL_INIT(virStorageSource); - virStorageSourcePtr virStorageSourceNew(void) { - if (virStorageSourceInitialize() < 0) - return NULL; - - return virObjectNew(virStorageSourceClass); + return VIR_STORAGE_SOURCE(g_object_new(VIR_TYPE_STORAGE_SOURCE, NULL)); } diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index a744bcbf5c..ce56e8e18e 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -275,7 +275,7 @@ typedef virStorageSource *virStorageSourcePtr; * IMPORTANT: When adding fields to this struct it's also necessary to add * appropriate code to the virStorageSourceCopy deep copy function */ struct _virStorageSource { - virObject parent; + GObject parent; unsigned int id; /* backing chain identifier, 0 is unset */ int type; /* virStorageType */ @@ -393,7 +393,9 @@ struct _virStorageSource { bool ssh_host_key_check_disabled; }; -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virStorageSource, virObjectUnref); +#define VIR_TYPE_STORAGE_SOURCE vir_storage_source_get_type() +G_DECLARE_FINAL_TYPE(virStorageSource, vir_storage_source, VIR, STORAGE_SOURCE, GObject); + #ifndef DEV_BSIZE -- 2.25.1

On Fri, Apr 03, 2020 at 05:15:28PM +0200, Rafael Fonseca wrote:
This patch series convert various simple instances of virObject to a GObject equivalent.
virDomain is still WIP because it causes some linking problem I am still investigating.
virObjects that work as parent class to other objects will be covered in a next patchset.
virConnectPtr is the one I don't know how we'll solve. virConnectClose requires us to return 0 if the last reference was released, 1 otherwise. g_object_unref returns void :-( I've tried to think about ways to detect the removal of the last reference, but can't figure out a nice solution thus far... Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Fri, 2020-04-03 at 17:03 +0100, Daniel P. Berrangé wrote:
On Fri, Apr 03, 2020 at 05:15:28PM +0200, Rafael Fonseca wrote:
This patch series convert various simple instances of virObject to a GObject equivalent.
virDomain is still WIP because it causes some linking problem I am still investigating.
virObjects that work as parent class to other objects will be covered in a next patchset.
virConnectPtr is the one I don't know how we'll solve.
virConnectClose requires us to return 0 if the last reference was released, 1 otherwise. g_object_unref returns void :-(
I've tried to think about ways to detect the removal of the last reference, but can't figure out a nice solution thus far...
Wouldn't something like g_object_add_weak_pointer() work for this?

On Wed, Apr 08, 2020 at 07:38:33PM -0500, Jonathon Jongsma wrote:
On Fri, 2020-04-03 at 17:03 +0100, Daniel P. Berrangé wrote:
On Fri, Apr 03, 2020 at 05:15:28PM +0200, Rafael Fonseca wrote:
This patch series convert various simple instances of virObject to a GObject equivalent.
virDomain is still WIP because it causes some linking problem I am still investigating.
virObjects that work as parent class to other objects will be covered in a next patchset.
virConnectPtr is the one I don't know how we'll solve.
virConnectClose requires us to return 0 if the last reference was released, 1 otherwise. g_object_unref returns void :-(
I've tried to think about ways to detect the removal of the last reference, but can't figure out a nice solution thus far...
Wouldn't something like g_object_add_weak_pointer() work for this?
I've investigated this and there are thread safety issues here "Note that as with g_object_weak_ref(), the weak references created by this method are not thread-safe: they cannot safely be used in one thread if the object's last g_object_unref() might happen in another thread. Use GWeakRef if thread-safety is required." Possibly GWeakRef might be viable, but I've not investigated that in enough detail to be sure. Thread safety is the real key issue to worry about in general. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Fri, Apr 3, 2020 at 5:16 PM Rafael Fonseca <r4f4rfs@gmail.com> wrote:
virDomain is still WIP because it causes some linking problem I am still investigating.
Gonna ask here since you guys might have some idea from the top of your heads to help me. I converted virDomain to GObject. However, when linking I get the following error: CC libvirt_lxc_la-libvirt-lxc.lo CCLD libvirt-lxc.la CC libvirt_qemu_la-libvirt-qemu.lo CCLD libvirt-qemu.la CCLD virtvboxd /usr/bin/ld: ./.libs/libvirt-lxc.so: undefined reference to `vir_domain_get_type' collect2: error: ld returned 1 exit status If I add `$(DATATYPES_SOURCES)` to `libvirt_lxc_la_SOURCES` in `src/Makefile.am`, then the compilation is successful but virsh tools fail with: $: tools/virsh --connect test:///default list (process:1086311): GLib-GObject-WARNING **: 00:59:47.905: cannot register existing type 'virDomain' (process:1086311): GLib-CRITICAL **: 00:59:47.905: g_once_init_leave: assertion 'result != 0' failed ^C I thought that by linking with libvirt.so, the `vir_domain_get_type` symbol should be found. What am I missing? Att -- Rafael Fonseca

On Mon, Apr 06, 2020 at 01:26:02PM +0200, Rafael Fonseca wrote:
On Fri, Apr 3, 2020 at 5:16 PM Rafael Fonseca <r4f4rfs@gmail.com> wrote:
virDomain is still WIP because it causes some linking problem I am still investigating.
Gonna ask here since you guys might have some idea from the top of your heads to help me.
I converted virDomain to GObject. However, when linking I get the following error:
CC libvirt_lxc_la-libvirt-lxc.lo CCLD libvirt-lxc.la CC libvirt_qemu_la-libvirt-qemu.lo CCLD libvirt-qemu.la CCLD virtvboxd /usr/bin/ld: ./.libs/libvirt-lxc.so: undefined reference to `vir_domain_get_type' collect2: error: ld returned 1 exit status
You'll need to add the vir_$OBJECT_get_type methods to the file src/libvirt_private.syms as you convert each type/ Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
participants (4)
-
Daniel P. Berrangé
-
Jonathon Jongsma
-
Peter Krempa
-
Rafael Fonseca