File fix-eds-bnc-222908-memleak.diff of Package evolution-data-server-2.6
--- addressbook/libebook/e-book-view-listener-copy.c 2006-11-21 15:14:57.000000000 +0530
+++ addressbook/libebook/e-book-view-listener.c 2006-11-21 15:18:51.000000000 +0530
@@ -349,10 +349,16 @@ e_book_view_listener_dispose (GObject *o
d(printf ("%p: in e_book_view_listener_dispose (%p)\n", g_thread_self(), object));
if (listener->priv) {
+ EBookViewListenerResponse *response;
+
if (listener->priv->idle_id != -1)
g_source_remove (listener->priv->idle_id);
g_mutex_free (listener->priv->idle_mutex);
+
+ /*Free Pending Events */
+ while ((response = g_async_queue_try_pop (listener->priv->queue)) != NULL)
+ free_response (response);
g_async_queue_unref (listener->priv->queue);
--- addressbook/libebook/e-book-copy.c 2006-11-21 15:19:35.000000000 +0530
+++ addressbook/libebook/e-book.c 2006-11-21 15:21:53.000000000 +0530
@@ -3319,6 +3319,8 @@ fetch_corba_book (EBook *book,
for (l = factories; l; l = l->next)
CORBA_Object_release ((CORBA_Object)l->data, NULL);
+ g_list_free (factories);
+
if (rv == TRUE) {
book->priv->corba_book = corba_book;
book->priv->comp_listener = e_component_listener_new (book->priv->corba_book);
--- libedataserverui/e-contact-store-copy.c 2006-11-21 15:32:48.000000000 +0530
+++ libedataserverui/e-contact-store.c 2006-11-21 15:35:07.000000000 +0530
@@ -73,8 +73,6 @@ static gboolean e_contact_store_iter
GtkTreeIter *iter,
GtkTreeIter *child);
-static void stop_view (EContactStore *contact_store, EBookView *view);
-
typedef struct
{
EBook *book;
@@ -87,6 +85,10 @@ typedef struct
}
ContactSource;
+static void free_contact_ptrarray (GPtrArray *contacts);
+static void clear_contact_source (EContactStore *contact_store, ContactSource *source);
+static void stop_view (EContactStore *contact_store, EBookView *view);
+
/* ------------------ *
* Class/object setup *
* ------------------ */
@@ -168,7 +170,23 @@ e_contact_store_init (EContactStore *con
static void
e_contact_store_finalize (GObject *object)
{
- /* TODO: Free stuff */
+ EContactStore *contact_store = E_CONTACT_STORE (object);
+ gint i;
+
+ /* Free sources and cached contacts */
+
+ for (i = 0; i < contact_store->contact_sources->len; i++) {
+ ContactSource *source = &g_array_index (contact_store->contact_sources, ContactSource, i);
+
+ clear_contact_source (contact_store, source);
+
+ free_contact_ptrarray (source->contacts);
+ g_object_unref (source->book);
+ }
+
+ g_array_free (contact_store->contact_sources, TRUE);
+ if (contact_store->query)
+ e_book_query_unref (contact_store->query);
if (G_OBJECT_CLASS (parent_class)->finalize)
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
--- libedataserverui/e-destination-store-copy.c 2006-11-21 15:37:24.000000000 +0530
+++ libedataserverui/e-destination-store.c 2006-11-21 15:39:21.000000000 +0530
@@ -74,6 +74,7 @@ static gboolean e_destination_store_
GtkTreeIter *child);
static void destination_changed (EDestinationStore *destination_store, EDestination *destination);
+static void stop_destination (EDestinationStore *destination_store, EDestination *destination);
/* ------------------ *
* Class/object setup *
@@ -160,7 +161,17 @@ e_destination_store_init (EDestinationSt
static void
e_destination_store_finalize (GObject *object)
{
- /* TODO: Free stuff */
+ EDestinationStore *destination_store = E_DESTINATION_STORE (object);
+ gint i;
+
+ for (i = 0; i < destination_store->destinations->len; i++) {
+ EDestination *destination = g_ptr_array_index (destination_store->destinations, i);
+
+ stop_destination (destination_store, destination);
+ g_object_unref (destination);
+ }
+
+ g_ptr_array_free (destination_store->destinations, TRUE);
if (G_OBJECT_CLASS (parent_class)->finalize)
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
--- libedataserverui/e-name-selector-dialog-copy.c 2006-11-21 15:40:55.000000000 +0530
+++ libedataserverui/e-name-selector-dialog.c 2006-11-21 15:49:10.000000000 +0530
@@ -66,6 +66,7 @@ static void source_selected
static void transfer_button_clicked (ENameSelectorDialog *name_selector_dialog, GtkButton *transfer_button);
static void contact_selection_changed (ENameSelectorDialog *name_selector_dialog);
static void setup_name_selector_model (ENameSelectorDialog *name_selector_dialog);
+static void shutdown_name_selector_model (ENameSelectorDialog *name_selector_dialog);
static void contact_activated (ENameSelectorDialog *name_selector_dialog, GtkTreePath *path);
static void destination_activated (ENameSelectorDialog *name_selector_dialog, GtkTreePath *path,
GtkTreeViewColumn *column, GtkTreeView *tree_view);
@@ -291,11 +292,9 @@ e_name_selector_dialog_dispose (GObject
{
ENameSelectorDialog *name_selector_dialog = E_NAME_SELECTOR_DIALOG (object);
- g_signal_handlers_disconnect_matched (name_selector_dialog->name_selector_model,
- G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL,
- name_selector_dialog);
remove_books (name_selector_dialog);
+ shutdown_name_selector_model (name_selector_dialog);
if (G_OBJECT_CLASS (e_name_selector_dialog_parent_class)->dispose)
G_OBJECT_CLASS (e_name_selector_dialog_parent_class)->dispose (object);
@@ -305,7 +304,11 @@ e_name_selector_dialog_dispose (GObject
static void
e_name_selector_dialog_finalize (GObject *object)
{
- /* TODO: Free stuff */
+ ENameSelectorDialog *name_selector_dialog = E_NAME_SELECTOR_DIALOG (object);
+
+ g_array_free (name_selector_dialog->sections, TRUE);
+ g_object_unref (name_selector_dialog->source_list);
+ g_object_unref (name_selector_dialog->button_size_group);
g_list_free (category_list);
if (G_OBJECT_CLASS (e_name_selector_dialog_parent_class)->finalize)
@@ -419,6 +422,9 @@ remove_books (ENameSelectorDialog *name_
GList *books;
GList *l;
+ if (!name_selector_dialog->name_selector_model)
+ return;
+
contact_store = e_name_selector_model_peek_contact_store (name_selector_dialog->name_selector_model);
/* Remove books (should be just one) being viewed */
@@ -1040,14 +1046,6 @@ setup_name_selector_model (ENameSelector
ETreeModelGenerator *contact_filter;
GList *new_sections;
GList *l;
- gint i;
-
- /* Rid UI of previous destination sections */
-
- for (i = 0; i < name_selector_dialog->sections->len; i++)
- free_section (name_selector_dialog, i);
-
- g_array_set_size (name_selector_dialog->sections, 0);
/* Create new destination sections in UI */
@@ -1083,9 +1081,6 @@ setup_name_selector_model (ENameSelector
/* Create sorting model on top of filter, assign it to view */
- if (name_selector_dialog->contact_sort)
- g_object_unref (name_selector_dialog->contact_sort);
-
name_selector_dialog->contact_sort = GTK_TREE_MODEL_SORT (
gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (contact_filter)));
@@ -1103,6 +1098,36 @@ setup_name_selector_model (ENameSelector
}
static void
+shutdown_name_selector_model (ENameSelectorDialog *name_selector_dialog)
+{
+ gint i;
+
+ /* Rid UI of previous destination sections */
+
+ for (i = 0; i < name_selector_dialog->sections->len; i++)
+ free_section (name_selector_dialog, i);
+
+ g_array_set_size (name_selector_dialog->sections, 0);
+
+ /* Free sorting model */
+
+ if (name_selector_dialog->contact_sort) {
+ g_object_unref (name_selector_dialog->contact_sort);
+ name_selector_dialog->contact_sort = NULL;
+ }
+
+ /* Free backend model */
+
+ if (name_selector_dialog->name_selector_model) {
+ g_signal_handlers_disconnect_matched (name_selector_dialog->name_selector_model,
+ G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, name_selector_dialog);
+
+ g_object_unref (name_selector_dialog->name_selector_model);
+ name_selector_dialog->name_selector_model = NULL;
+ }
+}
+
+static void
deep_free_list (GList *list)
{
GList *l;
@@ -1219,10 +1244,7 @@ e_name_selector_dialog_set_model (ENameS
if (model == name_selector_dialog->name_selector_model)
return;
- g_signal_handlers_disconnect_matched (name_selector_dialog->name_selector_model,
- G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, name_selector_dialog);
-
- g_object_unref (name_selector_dialog->name_selector_model);
+ shutdown_name_selector_model (name_selector_dialog);
name_selector_dialog->name_selector_model = g_object_ref (model);
setup_name_selector_model (name_selector_dialog);
--- libedataserverui/e-name-selector-model-copy.c 2006-11-21 15:51:45.000000000 +0530
+++ libedataserverui/e-name-selector-model.c 2006-11-21 15:53:53.000000000 +0530
@@ -43,6 +43,7 @@ static gint generate_contact_rows (ECon
static void override_email_address (EContactStore *contact_store, GtkTreeIter *iter,
gint permutation_n, gint column, GValue *value,
ENameSelectorModel *name_selector_model);
+static void free_section (ENameSelectorModel *name_selector_model, gint n);
/* ------------------ *
* Class/object setup *
@@ -84,11 +85,17 @@ static void
e_name_selector_model_finalize (GObject *object)
{
ENameSelectorModel *name_selector_model = E_NAME_SELECTOR_MODEL (object);
+ gint i;
- /* TODO: Free sections */
-
+ for (i = 0; i < name_selector_model->sections->len; i++)
+ free_section (name_selector_model, i);
+
+ g_array_free (name_selector_model->sections, TRUE);
g_object_unref (name_selector_model->contact_filter);
+ if (name_selector_model->destination_uid_hash)
+ g_hash_table_destroy (name_selector_model->destination_uid_hash);
+
if (G_OBJECT_CLASS (e_name_selector_model_parent_class)->finalize)
G_OBJECT_CLASS (e_name_selector_model_parent_class)->finalize (object);
}
--- libedataserverui/test-name-selector-copy.c 2006-11-21 15:55:34.000000000 +0530
+++ libedataserverui/test-name-selector.c 2006-11-21 15:57:05.000000000 +0530
@@ -31,20 +31,22 @@
#include <gtk/gtk.h>
#include <camel/camel.h>
+ENameSelectorDialog *name_selector_dialog;
+GtkWidget *name_selector_entry_window;
+
static void
close_dialog (GtkWidget *widget, int response, gpointer data)
{
- GtkWidget *dialog = data;
-
- gtk_widget_destroy (dialog);
- gtk_main_quit ();
+ gtk_widget_destroy (GTK_WIDGET (name_selector_dialog));
+ gtk_widget_destroy (name_selector_entry_window);
+
+ g_timeout_add (4000, (GSourceFunc) gtk_main_quit, NULL);
}
static gboolean
start_test (void)
{
ENameSelectorModel *name_selector_model;
- ENameSelectorDialog *name_selector_dialog;
ENameSelectorEntry *name_selector_entry;
EDestinationStore *destination_store;
GtkWidget *container;
@@ -70,6 +72,8 @@ start_test (void)
gtk_container_add (GTK_CONTAINER (container), GTK_WIDGET (name_selector_entry));
gtk_widget_show_all (container);
+ name_selector_entry_window = container;
+
g_object_unref (name_selector_model);
g_object_unref (destination_store);
return FALSE;