From 35a7c23baabda073fea6da3a593fb718c9ac8c89 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 7 Jul 2006 17:48:16 +0000 Subject: =?UTF-8?q?Bug=20344766=20=E2=80=93=20Memory=20leak=20in=20get=5Fr?= =?UTF-8?q?uleset()=20in=20modules/basic/basic-fc.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2006-07-07 Behdad Esfahbod Bug 344766 – Memory leak in get_ruleset() in modules/basic/basic-fc.c * pango/pango-ot-private.h: Rename PANGO_OT_IS_RULESET is PANGO_IS_OT_RULESET. * pango/pango-ot-ruleset.c (pango_ot_ruleset_finalize), (pango_ot_ruleset_new), (pango_ot_ruleset_add_feature), (pango_ot_ruleset_substitute), (pango_ot_ruleset_position): Use weak pointers to reference ruleset->info, to avoid circular dependency. --- ChangeLog | 13 +++++++++++++ pango/pango-ot-private.h | 4 ++-- pango/pango-ot-ruleset.c | 17 ++++++++++++----- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index c1f78aca..d87e0754 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2006-07-07 Behdad Esfahbod + + Bug 344766 – Memory leak in get_ruleset() in modules/basic/basic-fc.c + + * pango/pango-ot-private.h: Rename PANGO_OT_IS_RULESET is + PANGO_IS_OT_RULESET. + + * pango/pango-ot-ruleset.c (pango_ot_ruleset_finalize), + (pango_ot_ruleset_new), (pango_ot_ruleset_add_feature), + (pango_ot_ruleset_substitute), (pango_ot_ruleset_position): + Use weak pointers to reference ruleset->info, to avoid circular + dependency. + 2006-07-07 Behdad Esfahbod * pango/pango-matrix.c: New file. diff --git a/pango/pango-ot-private.h b/pango/pango-ot-private.h index 5e5e7023..e51294f6 100644 --- a/pango/pango-ot-private.h +++ b/pango/pango-ot-private.h @@ -59,8 +59,8 @@ struct _PangoOTInfoClass #define PANGO_TYPE_OT_RULESET (pango_ot_ruleset_get_type ()) #define PANGO_OT_RULESET(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_OT_RULESET, PangoOTRuleset)) #define PANGO_OT_RULESET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_OT_RULESET, PangoOTRulesetClass))f -#define PANGO_OT_IS_RULESET(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_OT_RULESET)) -#define PANGO_OT_IS_RULESET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_OT_RULESET)) +#define PANGO_IS_OT_RULESET(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_OT_RULESET)) +#define PANGO_IS_OT_RULESET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_OT_RULESET)) #define PANGO_OT_RULESET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_OT_RULESET, PangoOTRulesetClass)) typedef struct _PangoOTRulesetClass PangoOTRulesetClass; diff --git a/pango/pango-ot-ruleset.c b/pango/pango-ot-ruleset.c index da876e35..449dfd0b 100644 --- a/pango/pango-ot-ruleset.c +++ b/pango/pango-ot-ruleset.c @@ -88,7 +88,8 @@ pango_ot_ruleset_finalize (GObject *object) PangoOTRuleset *ruleset = PANGO_OT_RULESET (object); g_array_free (ruleset->rules, TRUE); - g_object_unref (ruleset->info); + if (ruleset->info) + g_object_remove_weak_pointer (ruleset->info, &ruleset->info); parent_class->finalize (object); } @@ -107,9 +108,12 @@ pango_ot_ruleset_new (PangoOTInfo *info) { PangoOTRuleset *ruleset; + g_return_val_if_fail (info != NULL, NULL); + ruleset = g_object_new (PANGO_TYPE_OT_RULESET, NULL); - ruleset->info = g_object_ref (info); + ruleset->info = info; + g_object_add_weak_pointer (ruleset->info, &ruleset->info); return ruleset; } @@ -133,7 +137,8 @@ pango_ot_ruleset_add_feature (PangoOTRuleset *ruleset, { PangoOTRule tmp_rule; - g_return_if_fail (PANGO_OT_IS_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_INFO (ruleset->info)); tmp_rule.table_type = table_type; tmp_rule.feature_index = feature_index; @@ -160,7 +165,8 @@ pango_ot_ruleset_substitute (PangoOTRuleset *ruleset, HB_GSUB gsub = NULL; - g_return_if_fail (PANGO_OT_IS_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_INFO (ruleset->info)); for (i = 0; i < ruleset->rules->len; i++) { @@ -203,7 +209,8 @@ pango_ot_ruleset_position (PangoOTRuleset *ruleset, HB_GPOS gpos = NULL; - g_return_if_fail (PANGO_OT_IS_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_RULESET (ruleset)); + g_return_if_fail (PANGO_IS_OT_INFO (ruleset->info)); for (i = 0; i < ruleset->rules->len; i++) { -- cgit v1.2.1