[evolution] Various memory leaks



commit 101305e1c7dc24f5a40e80a900b0777b2634722f
Author: Milan Crha <mcrha redhat com>
Date:   Tue Sep 7 18:39:46 2010 +0200

    Various memory leaks

 composer/e-composer-private.c                 |   25 +++++++++++++++----------
 e-util/e-plugin-ui.c                          |   12 +++++++++---
 e-util/e-plugin.c                             |    5 -----
 em-format/em-format.c                         |    3 ---
 libgnomecanvas/gnome-canvas.c                 |    2 --
 mail/em-format-html.c                         |    4 ++--
 plugins/mail-notification/mail-notification.c |    1 +
 shell/e-shell-content.c                       |    5 +++++
 shell/e-shell-searchbar.c                     |    5 +++++
 shell/e-shell.c                               |    2 +-
 widgets/misc/e-menu-tool-button.c             |    7 ++++++-
 widgets/text/e-text.c                         |    3 +++
 12 files changed, 47 insertions(+), 27 deletions(-)
---
diff --git a/composer/e-composer-private.c b/composer/e-composer-private.c
index ed9e190..d4dcb46 100644
--- a/composer/e-composer-private.c
+++ b/composer/e-composer-private.c
@@ -405,17 +405,22 @@ e_composer_private_constructed (EMsgComposer *composer)
 void
 e_composer_private_dispose (EMsgComposer *composer)
 {
-	GConfBridge *bridge;
-	GArray *array;
-	guint binding_id;
-
-	bridge = gconf_bridge_get ();
-	array = composer->priv->gconf_bridge_binding_ids;
+	if (composer->priv->gconf_bridge_binding_ids) {
+		GConfBridge *bridge;
+		GArray *array;
+		guint binding_id;
+
+		bridge = gconf_bridge_get ();
+		array = composer->priv->gconf_bridge_binding_ids;
+
+		while (array->len > 0) {
+			binding_id = g_array_index (array, guint, 0);
+			gconf_bridge_unbind (bridge, binding_id);
+			g_array_remove_index_fast (array, 0);
+		}
 
-	while (array->len > 0) {
-		binding_id = g_array_index (array, guint, 0);
-		gconf_bridge_unbind (bridge, binding_id);
-		g_array_remove_index_fast (array, 0);
+		g_array_free (composer->priv->gconf_bridge_binding_ids, TRUE);
+		composer->priv->gconf_bridge_binding_ids = NULL;
 	}
 
 	if (composer->priv->shell != NULL) {
diff --git a/e-util/e-plugin-ui.c b/e-util/e-plugin-ui.c
index a03c619..c79220b 100644
--- a/e-util/e-plugin-ui.c
+++ b/e-util/e-plugin-ui.c
@@ -544,7 +544,7 @@ e_plugin_ui_register_manager (GtkUIManager *ui_manager,
 		EPlugin *plugin = plugin_list->data;
 		GSList *iter;
 
-		plugin_list = g_slist_next (plugin_list);
+		plugin_list = g_slist_remove (plugin_list, plugin);
 
 		/* Look for hooks of type EPluginUIHook. */
 		for (iter = plugin->hooks; iter != NULL; iter = iter->next) {
@@ -565,6 +565,8 @@ e_plugin_ui_register_manager (GtkUIManager *ui_manager,
 			plugin_ui_hook_register_manager (
 				hook, ui_manager, id, user_data);
 		}
+
+		g_object_unref (plugin);
 	}
 }
 
@@ -583,7 +585,7 @@ e_plugin_ui_enable_manager (GtkUIManager *ui_manager,
 		EPlugin *plugin = plugin_list->data;
 		GSList *iter;
 
-		plugin_list = g_slist_next (plugin_list);
+		plugin_list = g_slist_remove (plugin_list, plugin);
 
 		/* Look for hooks of type EPluginUIHook. */
 		for (iter = plugin->hooks; iter != NULL; iter = iter->next) {
@@ -594,6 +596,8 @@ e_plugin_ui_enable_manager (GtkUIManager *ui_manager,
 
 			plugin_ui_enable_manager (hook, ui_manager, id);
 		}
+
+		g_object_unref (plugin);
 	}
 }
 
@@ -612,7 +616,7 @@ e_plugin_ui_disable_manager (GtkUIManager *ui_manager,
 		EPlugin *plugin = plugin_list->data;
 		GSList *iter;
 
-		plugin_list = g_slist_next (plugin_list);
+		plugin_list = g_slist_remove (plugin_list, plugin);
 
 		/* Look for hooks of type EPluginUIHook. */
 		for (iter = plugin->hooks; iter != NULL; iter = iter->next) {
@@ -623,5 +627,7 @@ e_plugin_ui_disable_manager (GtkUIManager *ui_manager,
 
 			plugin_ui_disable_manager (hook, ui_manager, id, TRUE);
 		}
+
+		g_object_unref (plugin);
 	}
 }
diff --git a/e-util/e-plugin.c b/e-util/e-plugin.c
index 0da1151..db717e8 100644
--- a/e-util/e-plugin.c
+++ b/e-util/e-plugin.c
@@ -83,9 +83,6 @@ struct _plugin_doc {
 
 	gchar *filename;
 	xmlDocPtr doc;
-
-	GSList *plugin_hooks;	/* EPlugin objects with pending hooks */
-	GSList *plugins;	/* xmlNodePtr's of plugins with unknown type (mono,etc) */
 };
 
 enum {
@@ -359,7 +356,6 @@ ep_load_plugin (xmlNodePtr root, struct _plugin_doc *pdoc)
 		pd(printf("Delaying loading of plugin '%s' unknown type '%s'\n", id, prop));
 		g_free (id);
 		xmlFree (prop);
-		pdoc->plugins = g_slist_prepend (pdoc->plugins, root);
 		return NULL;
 	}
 	xmlFree (prop);
@@ -430,7 +426,6 @@ ep_load (const gchar *filename, gint load_level)
 					ep->flags &= ~E_PLUGIN_FLAGS_SYSTEM_PLUGIN;
 				g_free (is_system_plugin);
 
-				pdoc->plugin_hooks = g_slist_prepend (pdoc->plugin_hooks, ep);
 				ep = NULL;
 			}
 		}
diff --git a/em-format/em-format.c b/em-format/em-format.c
index 0dd45ef..119ac64 100644
--- a/em-format/em-format.c
+++ b/em-format/em-format.c
@@ -348,9 +348,6 @@ emf_class_init (EMFormatClass *class)
 		NULL, NULL,
 		g_cclosure_marshal_VOID__VOID,
 		G_TYPE_NONE, 0);
-
-	class->type_handlers = g_hash_table_new (g_str_hash, g_str_equal);
-	emf_builtin_init (class);
 }
 
 static void
diff --git a/libgnomecanvas/gnome-canvas.c b/libgnomecanvas/gnome-canvas.c
index c335b9f..7188c77 100644
--- a/libgnomecanvas/gnome-canvas.c
+++ b/libgnomecanvas/gnome-canvas.c
@@ -3226,8 +3226,6 @@ paint (GnomeCanvas *canvas)
 	visible_rect.x1 = visible_rect.x0 + allocation.width;
 	visible_rect.y1 = visible_rect.y0 + allocation.height;
 
-	region = gdk_region_new ();
-
 	for (i = 0; i < n_rects; i++) {
 		ArtIRect clipped;
 
diff --git a/mail/em-format-html.c b/mail/em-format-html.c
index fb0bc0a..8962de2 100644
--- a/mail/em-format-html.c
+++ b/mail/em-format-html.c
@@ -604,13 +604,13 @@ efh_finalize (GObject *object)
 {
 	EMFormatHTML *efh = EM_FORMAT_HTML (object);
 
-	/* FIXME: check for leaked stuff */
-
 	em_format_html_clear_pobject (efh);
 	efh_gtkhtml_destroy (GTK_HTML (efh->priv->web_view), efh);
 
 	g_hash_table_destroy (efh->priv->text_inline_parts);
 
+	g_mutex_free (efh->priv->lock);
+
 	/* Chain up to parent's finalize() method. */
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
diff --git a/plugins/mail-notification/mail-notification.c b/plugins/mail-notification/mail-notification.c
index 5015e9c..a75a522 100644
--- a/plugins/mail-notification/mail-notification.c
+++ b/plugins/mail-notification/mail-notification.c
@@ -159,6 +159,7 @@ send_dbus_message (const gchar *name,
 	#undef add_named_param
 
 	g_dbus_message_set_body (message, g_variant_builder_end (builder));
+	g_variant_builder_unref (builder);
 
 	/* Sends the message */
 	g_dbus_connection_send_message (
diff --git a/shell/e-shell-content.c b/shell/e-shell-content.c
index 5173ee8..527ef25 100644
--- a/shell/e-shell-content.c
+++ b/shell/e-shell-content.c
@@ -142,6 +142,11 @@ shell_content_dispose (GObject *object)
 		priv->shell_view = NULL;
 	}
 
+	if (priv->user_filename) {
+		g_free (priv->user_filename);
+		priv->user_filename = NULL;
+	}
+
 	/* Chain up to parent's dispose() method. */
 	G_OBJECT_CLASS (e_shell_content_parent_class)->dispose (object);
 }
diff --git a/shell/e-shell-searchbar.c b/shell/e-shell-searchbar.c
index cb525f8..9a7800f 100644
--- a/shell/e-shell-searchbar.c
+++ b/shell/e-shell-searchbar.c
@@ -648,6 +648,11 @@ shell_searchbar_dispose (GObject *object)
 		priv->search_option = NULL;
 	}
 
+	if (priv->state_group) {
+		g_free (priv->state_group);
+		priv->state_group = NULL;
+	}
+
 	/* Chain up to parent's dispose() method. */
 	G_OBJECT_CLASS (e_shell_searchbar_parent_class)->dispose (object);
 }
diff --git a/shell/e-shell.c b/shell/e-shell.c
index db9efc9..93832ec 100644
--- a/shell/e-shell.c
+++ b/shell/e-shell.c
@@ -329,7 +329,7 @@ shell_ready_for_quit (EShell *shell,
 		shell_ready_for_quit, shell);
 
 	/* Finalize the activity. */
-	g_object_ref (activity);
+	g_object_unref (activity);
 
 	/* Destroy all watched windows.  Note, we iterate over a -copy-
 	 * of the watched windows list because the act of destroying a
diff --git a/widgets/misc/e-menu-tool-button.c b/widgets/misc/e-menu-tool-button.c
index 7ca38bc..612ed80 100644
--- a/widgets/misc/e-menu-tool-button.c
+++ b/widgets/misc/e-menu-tool-button.c
@@ -47,6 +47,7 @@ static GtkMenuItem *
 menu_tool_button_get_first_menu_item (GtkMenuToolButton *menu_tool_button)
 {
 	GtkWidget *menu;
+	GtkMenuItem *item;
 	GList *children;
 
 	menu = gtk_menu_tool_button_get_menu (menu_tool_button);
@@ -57,7 +58,11 @@ menu_tool_button_get_first_menu_item (GtkMenuToolButton *menu_tool_button)
 	if (children == NULL)
 		return NULL;
 
-	return GTK_MENU_ITEM (children->data);
+	item = GTK_MENU_ITEM (children->data);
+
+	g_list_free (children);
+
+	return item;
 }
 
 static void
diff --git a/widgets/text/e-text.c b/widgets/text/e-text.c
index 0383b00..bb9b2dd 100644
--- a/widgets/text/e-text.c
+++ b/widgets/text/e-text.c
@@ -429,6 +429,9 @@ reset_layout (EText *text)
 		cairo_font_options_destroy (font_options);
 		pango_layout_context_changed (text->layout);
 
+		if (text->font_desc) {
+			pango_font_description_free (text->font_desc);
+		}
 		text->font_desc = pango_font_description_new ();
 		if (!pango_font_description_get_size_is_absolute (style->font_desc))
 			pango_font_description_set_size (text->font_desc,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]