From 97cc556b6b82e90104d202cef3f65e02ba79ca4c Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 28 Dec 2019 12:52:27 +0100 Subject: [PATCH] Added private functions ZakAudit::dispose and ::finalize. --- src/audit.c | 58 ++++++++++++++++++++++++++++++++++++++++++----- src/libzakaudit.h | 3 --- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/audit.c b/src/audit.c index b5e0139..870730e 100644 --- a/src/audit.c +++ b/src/audit.c @@ -69,10 +69,16 @@ typedef struct GHashTable *fields_updated; } RecordUpdated; +G_DEFINE_BOXED_TYPE (ZakAuditDatasource, zak_audit_datasource, zak_audit_datasource_copy, zak_audit_datasource_free) +G_DEFINE_BOXED_TYPE (ZakAuditTable, zak_audit_table, zak_audit_table_copy, zak_audit_table_free) +G_DEFINE_BOXED_TYPE (ZakAuditField, zak_audit_field, zak_audit_field_copy, zak_audit_field_free) + +static void zak_audit_dispose (GObject *gobject); +static void zak_audit_finalize (GObject *gobject); + static void zak_audit_class_init (ZakAuditClass *klass); static void zak_audit_init (ZakAudit *zak_audit); -static ZakAudit *zak_audit_new_ (void); static gboolean load_fields (ZakAudit *zak_audit, ZakAuditDatasource *datasource, ZakAuditTable *table); @@ -159,6 +165,8 @@ zak_audit_class_init (ZakAuditClass *klass) object_class->set_property = zak_audit_set_property; object_class->get_property = zak_audit_get_property; + object_class->dispose = zak_audit_dispose; + object_class->finalize = zak_audit_finalize; } static void @@ -667,6 +675,46 @@ zak_audit_get_property (GObject *object, guint property_id, GValue *value, GPara } } +static void +zak_audit_dispose (GObject *gobject) +{ + ZakAudit *zak_audit = ZAK_AUDIT (gobject); + ZakAuditPrivate *priv = ZAK_AUDIT_GET_PRIVATE (zak_audit); + + /* In dispose(), you are supposed to free all types referenced from this + * object which might themselves hold a reference to self. Generally, + * the most simple solution is to unref all members on which you own a + * reference. + */ + + /* dispose() might be called multiple times, so we must guard against + * calling g_object_unref() on an invalid GObject by setting the member + * NULL; g_clear_object() does this for us. + */ + /*g_clear_object (&priv->input_stream);*/ + gdaex_free (priv->gdaex); + + /* Always chain up to the parent class; there is no need to check if + * the parent class implements the dispose() virtual function: it is + * always guaranteed to do so + */ + G_OBJECT_CLASS (zak_audit_parent_class)->dispose (gobject); +} + +static void +zak_audit_finalize (GObject *gobject) +{ + ZakAudit *zak_audit = ZAK_AUDIT (gobject); + ZakAuditPrivate *priv = ZAK_AUDIT_GET_PRIVATE (zak_audit); + + g_list_free_full (priv->datasources, zak_audit_datasource_free); + + /* Always chain up to the parent class; as with dispose(), finalize() + * is guaranteed to exist on the parent's class virtual function table + */ + G_OBJECT_CLASS (zak_audit_parent_class)->finalize (gobject); +} + /* PUBLIC */ /** * zak_audit_new_with_datasources: @@ -2192,8 +2240,6 @@ zak_audit_destroy (ZakAudit *zak_audit) { ZakAuditPrivate *priv = ZAK_AUDIT_GET_PRIVATE (zak_audit); - gdaex_free (priv->gdaex); - g_object_unref (zak_audit); } @@ -2360,9 +2406,9 @@ void zak_audit_table_free (ZakAuditTable *table) { g_free (table->name); - g_list_free_full (table->fields, g_free); + g_list_free_full (table->fields, zak_audit_field_free); g_free (table->fields_sql); - g_list_free_full (table->keys, g_free); + g_list_free_full (table->keys, zak_audit_field_free); g_free (table->keys_sql); g_slice_free (ZakAuditTable, table); } @@ -2388,6 +2434,6 @@ zak_audit_datasource_free (ZakAuditDatasource *datasource) g_free (datasource->name); g_free (datasource->cnc_string); g_object_unref (datasource->gdaex); - g_list_free_full (datasource->tables, g_free); + g_list_free_full (datasource->tables, zak_audit_table_free); g_slice_free (ZakAuditDatasource, datasource); } diff --git a/src/libzakaudit.h b/src/libzakaudit.h index f39e527..eabef8c 100644 --- a/src/libzakaudit.h +++ b/src/libzakaudit.h @@ -150,9 +150,6 @@ typedef struct ZakAuditDatasource *zak_audit_datasource_copy (ZakAuditDatasource *datasource); void zak_audit_datasource_free (ZakAuditDatasource *datasource); -G_DEFINE_BOXED_TYPE (ZakAuditDatasource, zak_audit_datasource, zak_audit_datasource_copy, zak_audit_datasource_free); - - G_END_DECLS -- 2.49.0