[gnome-shell] Squash epic memory leak
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] Squash epic memory leak
- Date: Tue, 6 Apr 2010 01:10:25 +0000 (UTC)
commit 44ede8c9427697e40a9e910d3bd27cbaedf4e3fe
Author: Colin Walters <walters verbum org>
Date: Fri Apr 2 09:39:05 2010 -0400
Squash epic memory leak
StThemeNode holds a reference to its parent, but we never released
that reference. This could cause us to hold onto whole chains
of theme nodes with rather dire memory usage implications.
Also move the other g_object_unref into _dispose.
https://bugzilla.gnome.org/show_bug.cgi?id=614660
src/st/st-theme-node.c | 41 +++++++++++++++++++++++++++++++++++------
src/st/st-widget.c | 1 +
2 files changed, 36 insertions(+), 6 deletions(-)
---
diff --git a/src/st/st-theme-node.c b/src/st/st-theme-node.c
index cf6769a..d742c6b 100644
--- a/src/st/st-theme-node.c
+++ b/src/st/st-theme-node.c
@@ -9,6 +9,7 @@
static void st_theme_node_init (StThemeNode *node);
static void st_theme_node_class_init (StThemeNodeClass *klass);
+static void st_theme_node_dispose (GObject *object);
static void st_theme_node_finalize (GObject *object);
static const ClutterColor BLACK_COLOR = { 0, 0, 0, 0xff };
@@ -27,9 +28,43 @@ st_theme_node_class_init (StThemeNodeClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ object_class->dispose = st_theme_node_dispose;
object_class->finalize = st_theme_node_finalize;
}
+
+static void
+st_theme_node_dispose (GObject *gobject)
+{
+ StThemeNode *node = ST_THEME_NODE (gobject);
+
+ if (node->context)
+ {
+ g_object_unref (node->context);
+ node->context = NULL;
+ }
+
+ if (node->theme)
+ {
+ g_object_unref (node->theme);
+ node->theme = NULL;
+ }
+
+ if (node->parent_node)
+ {
+ g_object_unref (node->parent_node);
+ node->parent_node = NULL;
+ }
+
+ if (node->border_image)
+ {
+ g_object_unref (node->border_image);
+ node->border_image = NULL;
+ }
+
+ G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject);
+}
+
static void
st_theme_node_finalize (GObject *object)
{
@@ -59,12 +94,6 @@ st_theme_node_finalize (GObject *object)
node->font_desc = NULL;
}
- if (node->border_image)
- {
- g_object_unref (node->border_image);
- node->border_image = NULL;
- }
-
if (node->shadow)
{
st_shadow_free (node->shadow);
diff --git a/src/st/st-widget.c b/src/st/st-widget.c
index dba5a04..75da099 100644
--- a/src/st/st-widget.c
+++ b/src/st/st-widget.c
@@ -253,6 +253,7 @@ st_widget_dispose (GObject *gobject)
if (priv->theme_node)
{
+ g_object_run_dispose (G_OBJECT (priv->theme_node));
g_object_unref (priv->theme_node);
priv->theme_node = NULL;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]