aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-tools.c
diff options
context:
space:
mode:
authorDan Winship <danw@src.gnome.org>2001-07-02 03:59:02 +0800
committerDan Winship <danw@src.gnome.org>2001-07-02 03:59:02 +0800
commit82351a952651260ee912c491c7b05b6160c4646b (patch)
tree31615e86e98f14ea6fad358228e004464103bbea /mail/mail-tools.c
parent6eb77485e73d131f7c68a17193bcb73793dd06d1 (diff)
downloadgsoc2013-evolution-82351a952651260ee912c491c7b05b6160c4646b.tar
gsoc2013-evolution-82351a952651260ee912c491c7b05b6160c4646b.tar.gz
gsoc2013-evolution-82351a952651260ee912c491c7b05b6160c4646b.tar.bz2
gsoc2013-evolution-82351a952651260ee912c491c7b05b6160c4646b.tar.lz
gsoc2013-evolution-82351a952651260ee912c491c7b05b6160c4646b.tar.xz
gsoc2013-evolution-82351a952651260ee912c491c7b05b6160c4646b.tar.zst
gsoc2013-evolution-82351a952651260ee912c491c7b05b6160c4646b.zip
Ref the folder before proxying the event, in case there's only one
* mail-tools.c (update_unread_count): Ref the folder before proxying the event, in case there's only one reference to it and it gets unreffed before the other end of the event handler runs. (update_unread_count_main): And unref it when we're done. (mail_tool_uri_to_folder): Only hold the lock around the hash table operations, not the entire function. Holding the lock the whole time can cause deadlock when resolving vfolders, and the CamelSession and CamelStore locks ensure that multiple threads calling this function will end up with the same CamelFolder object at the end anyway, so we just need to lock and re-check the cache at the end before adding the folder to the cache. svn path=/trunk/; revision=10661
Diffstat (limited to 'mail/mail-tools.c')
-rw-r--r--mail/mail-tools.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/mail/mail-tools.c b/mail/mail-tools.c
index 5c458e0b2a..578ba96026 100644
--- a/mail/mail-tools.c
+++ b/mail/mail-tools.c
@@ -270,6 +270,7 @@ update_unread_count_main (CamelObject *object, gpointer event_data,
fci->unread != 0);
g_free (name);
gtk_object_unref (GTK_OBJECT (storage));
+ camel_object_unref (object);
}
static void
@@ -284,6 +285,7 @@ update_unread_count (CamelObject *object, gpointer event_data,
if (unread == fci->unread)
return;
fci->unread = unread;
+ camel_object_ref (object);
mail_proxy_event (update_unread_count_main, object, event_data, user_data);
}
@@ -344,13 +346,15 @@ mail_tool_uri_to_folder (const char *uri, CamelException *ex)
struct folder_cache_info *fci;
fci = g_hash_table_lookup (folders, uri);
+ g_static_mutex_unlock (&folders_lock);
if (fci) {
camel_object_ref (CAMEL_OBJECT (fci->folder));
- g_static_mutex_unlock (&folders_lock);
return fci->folder;
}
- } else
+ } else {
folders = g_hash_table_new (g_str_hash, g_str_equal);
+ g_static_mutex_unlock (&folders_lock);
+ }
if (!strncmp (uri, "vtrash:", 7))
offset = 7;
@@ -396,7 +400,9 @@ mail_tool_uri_to_folder (const char *uri, CamelException *ex)
}
camel_url_free (url);
- cache_folder (folder, uri);
+ g_static_mutex_lock (&folders_lock);
+ if (!g_hash_table_lookup (folders, uri))
+ cache_folder (folder, uri);
g_static_mutex_unlock (&folders_lock);
return folder;