[evolution-data-server] Bug #638810 - Crash in camel_folder_search_set_folder with IMAP account



commit 3ee0ee8a293c00d8a17f52fad9cb249d10e838e4
Author: Milan Crha <mcrha redhat com>
Date:   Fri Jan 6 18:57:35 2012 +0100

    Bug #638810 - Crash in camel_folder_search_set_folder with IMAP account

 camel/camel-folder-search.c |   17 +++++++++++++--
 camel/camel-object-bag.c    |   45 ++++++++++++++++++++++++------------------
 2 files changed, 40 insertions(+), 22 deletions(-)
---
diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c
index 3be7b3d..973130a 100644
--- a/camel/camel-folder-search.c
+++ b/camel/camel-folder-search.c
@@ -345,8 +345,11 @@ camel_folder_search_execute_expression (CamelFolderSearch *search,
 	GPtrArray *matches;
 	gint i;
 	GHashTable *results;
-	CamelFolderSearchPrivate *p = search->priv;
+	CamelFolderSearchPrivate *p;
+
+	g_return_val_if_fail (search != NULL, NULL);
 
+	p = search->priv;
 	p->error = error;
 
 	/* only re-parse if the search has changed */
@@ -446,7 +449,11 @@ camel_folder_search_count (CamelFolderSearch *search,
 	GHashTable *results;
 	guint32 count = 0;
 
-	CamelFolderSearchPrivate *p = search->priv;
+	CamelFolderSearchPrivate *p;
+
+	g_return_val_if_fail (search != NULL, 0);
+
+	p = search->priv;
 
 	g_assert (search->folder);
 
@@ -605,7 +612,11 @@ camel_folder_search_search (CamelFolderSearch *search,
 	gchar *sql_query, *tmp, *tmp1;
 	GHashTable *results;
 
-	CamelFolderSearchPrivate *p = search->priv;
+	CamelFolderSearchPrivate *p;
+
+	g_return_val_if_fail (search != NULL, NULL);
+
+	p = search->priv;
 
 	g_assert (search->folder);
 
diff --git a/camel/camel-object-bag.c b/camel/camel-object-bag.c
index 03029f6..d9b6b33 100644
--- a/camel/camel-object-bag.c
+++ b/camel/camel-object-bag.c
@@ -87,28 +87,36 @@ key_reservation_free (CamelObjectBag *bag,
 }
 
 static void
-object_bag_notify (CamelObjectBag *bag,
-                   GObject *where_the_object_was)
+object_bag_toggle_notify (gpointer user_data,
+			  GObject *object,
+			  gboolean is_last_ref)
 {
+	CamelObjectBag *bag = user_data;
 	gpointer key;
 
-	g_mutex_lock (bag->mutex);
+	if (is_last_ref) {
+		g_mutex_lock (bag->mutex);
 
-	key = g_hash_table_lookup (bag->key_table, where_the_object_was);
-	if (key != NULL) {
-		g_hash_table_remove (bag->key_table, where_the_object_was);
-		g_hash_table_remove (bag->object_table, key);
-	}
+		/* first remove from bag */
+		key = g_hash_table_lookup (bag->key_table, object);
+		if (key != NULL) {
+			g_hash_table_remove (bag->key_table, object);
+			g_hash_table_remove (bag->object_table, key);
+		}
 
-	g_mutex_unlock (bag->mutex);
+		g_mutex_unlock (bag->mutex);
+
+		/* then free the object */
+		g_object_remove_toggle_ref (object, object_bag_toggle_notify, bag);
+	}
 }
 
 static void
-object_bag_weak_unref (gpointer key,
-                       GObject *object,
-                       CamelObjectBag *bag)
+object_bag_toggle_unref (gpointer key,
+			 GObject *object,
+			 CamelObjectBag *bag)
 {
-	g_object_weak_unref (object, (GWeakNotify) object_bag_notify, bag);
+	g_object_remove_toggle_ref (object, object_bag_toggle_notify, bag);
 }
 
 static void
@@ -362,9 +370,8 @@ camel_object_bag_add (CamelObjectBag *bag,
 		g_hash_table_insert (bag->object_table, copied_key, object);
 		object_bag_unreserve (bag, key);
 
-		g_object_weak_ref (
-			G_OBJECT (object), (GWeakNotify)
-			object_bag_notify, bag);
+		g_object_add_toggle_ref (G_OBJECT (object),
+			object_bag_toggle_notify, bag);
 	}
 
 	g_mutex_unlock (bag->mutex);
@@ -492,7 +499,7 @@ camel_object_bag_remove (CamelObjectBag *bag,
 
 	key = g_hash_table_lookup (bag->key_table, object);
 	if (key != NULL) {
-		object_bag_weak_unref (key, object, bag);
+		object_bag_toggle_unref (key, object, bag);
 		g_hash_table_remove (bag->key_table, object);
 		g_hash_table_remove (bag->object_table, key);
 	}
@@ -513,10 +520,10 @@ camel_object_bag_destroy (CamelObjectBag *bag)
 	g_return_if_fail (bag != NULL);
 	g_return_if_fail (bag->reserved == NULL);
 
-	/* Drop remaining weak references. */
+	/* Drop remaining toggle references. */
 	g_hash_table_foreach (
 		bag->object_table, (GHFunc)
-		object_bag_weak_unref, bag);
+		object_bag_toggle_unref, bag);
 
 	g_hash_table_destroy (bag->key_table);
 	g_hash_table_destroy (bag->object_table);



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