On Fri, Sep 27, 2019 at 06:17:29PM +0100, Daniel P. Berrangé wrote:
Converting from virObject to GObject is reasonably straightforward,
as illustrated by this patch for virIdentity
In the header file
- Remove
typedef struct _virIdentity virIdentity
- Add
#define VIR_TYPE_IDENTITY virIdentity_get_type ()
G_DECLARE_FINAL_TYPE (virIdentity, virIdentity, VIR, IDENTITY, GObject);
Which provides the typedef we just removed, and class
declaration boilerplate and various other constants/macros.
In the source file
- Change 'virObject parent' to 'GObject parent' in the struct
- Remove the virClass variable and its initializing call
- Add
G_DEFINE_TYPE(virIdentity, virIdentity, G_TYPE_OBJECT)
which declares the instance & class constructor functions
- Add an impl of the instance & class constructors
wiring up the finalize method to point to our dispose impl
In all files
- Replace VIR_AUTOUNREF(virIdentityPtr) with g_autoptr(virIdentity)
- Replace virObjectRef/Unref with g_object_ref/unref. Note
the latter functions do *NOT* accept a NULL object where as
libvirt's do. If you replace g_object_unref with g_clear_object
it is NULL safe, but also clears the pointer.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/access/viraccessdriverpolkit.c | 21 +++----
src/admin/admin_server.c | 3 +-
src/qemu/qemu_process.c | 4 +-
src/remote/remote_daemon.c | 3 +-
src/remote/remote_daemon_dispatch.c | 35 ++++--------
src/rpc/virnetserverclient.c | 57 ++++++++-----------
src/rpc/virnetserverprogram.c | 13 +----
src/util/viridentity.c | 87 ++++++++++++++++-------------
src/util/viridentity.h | 7 ++-
tests/viridentitytest.c | 45 ++++++---------
tests/virnetserverclienttest.c | 3 +-
11 files changed, 122 insertions(+), 156 deletions(-)
As Jan pointed out this patch should do the minimal conversion to
GObject to demonstrate the transition. Let's move the cleanup into
separate patch.
I'm OK with using g_autoptr for the new GObject as we don't have to
define anything else for it to work and that's what we want to
eventually use in our code base.
diff --git a/src/util/viridentity.c b/src/util/viridentity.c
index 22e2644c19..467d953e17 100644
--- a/src/util/viridentity.c
+++ b/src/util/viridentity.c
@@ -43,25 +43,29 @@
VIR_LOG_INIT("util.identity");
struct _virIdentity {
- virObject parent;
+ GObject parent;
int nparams;
int maxparams;
virTypedParameterPtr params;
};
-static virClassPtr virIdentityClass;
+G_DEFINE_TYPE(virIdentity, virIdentity, G_TYPE_OBJECT)
+
static virThreadLocal virIdentityCurrent;
-static void virIdentityDispose(void *obj);
+static void virIdentityDispose(GObject *obj);
We should rename it to virIdentityFinalize as there is a difference
between finalize and dispose in glib.
Dispose may be called multiple times and should only remove and clear
references to other objects for cyclic dependencies, finalize is called
only once and should actually free any resources.
-static int virIdentityOnceInit(void)
+static void virIdentityCurrentCleanup(void *ident)
{
- if (!VIR_CLASS_NEW(virIdentity, virClassForObject()))
- return -1;
+ if (ident)
+ g_object_unref(ident);
+}
+static int virIdentityOnceInit(void)
+{
if (virThreadLocalInit(&virIdentityCurrent,
- (virThreadLocalCleanup)virObjectUnref) < 0) {
+ virIdentityCurrentCleanup) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Cannot initialize thread local for current
identity"));
return -1;
@@ -72,13 +76,24 @@ static int virIdentityOnceInit(void)
VIR_ONCE_GLOBAL_INIT(virIdentity);
+static void virIdentity_init(virIdentity *ident G_GNUC_UNUSED)
+{
+}
+
+static void virIdentity_class_init(virIdentityClass *klass)
+{
+ GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+ obj->finalize = virIdentityDispose;
Here we correctly use finalize so lets match the function name to it as
well.
Otherwise looks good.
Pavel