From 82351a952651260ee912c491c7b05b6160c4646b Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Sun, 1 Jul 2001 19:59:02 +0000 Subject: 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 --- mail/ChangeLog | 14 ++++++++++++++ mail/mail-tools.c | 12 +++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/mail/ChangeLog b/mail/ChangeLog index def5296a7c..d181b145d6 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,17 @@ +2001-07-01 Dan Winship + + * 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. + 2001-06-30 Ettore Perazzoli * folder-browser-ui.c: Get MailNext/MailPrevious to use 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; -- cgit v1.2.3