[evolution-data-server/gnome-3-2] Bug #638810 - Crash in camel_folder_search_set_folder with IMAP account
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/gnome-3-2] Bug #638810 - Crash in camel_folder_search_set_folder with IMAP account
- Date: Fri, 6 Jan 2012 17:58:25 +0000 (UTC)
commit f7d9edad7b7054c45d05b659b986493a5bffe449
Author: Milan Crha <mcrha redhat com>
Date: Fri Jan 6 18:56:46 2012 +0100
Bug #638810 - Crash in camel_folder_search_set_folder with IMAP account
camel/camel-folder-search.c | 23 +++++++++++++++++++--
camel/camel-object-bag.c | 45 ++++++++++++++++++++++++------------------
2 files changed, 46 insertions(+), 22 deletions(-)
---
diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c
index 5d71725..4cd08f5 100644
--- a/camel/camel-folder-search.c
+++ b/camel/camel-folder-search.c
@@ -266,6 +266,8 @@ void
camel_folder_search_set_folder (CamelFolderSearch *search,
CamelFolder *folder)
{
+ g_return_if_fail (search != NULL);
+
search->folder = folder;
}
@@ -283,6 +285,8 @@ void
camel_folder_search_set_summary (CamelFolderSearch *search,
GPtrArray *summary)
{
+ g_return_if_fail (search != NULL);
+
search->summary = summary;
}
@@ -300,6 +304,8 @@ void
camel_folder_search_set_body_index (CamelFolderSearch *search,
CamelIndex *index)
{
+ g_return_if_fail (search != NULL);
+
if (search->body_index)
g_object_unref (search->body_index);
search->body_index = index;
@@ -334,8 +340,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 */
@@ -436,7 +445,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);
@@ -595,7 +608,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 79ca4a2..b369dd4 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]