aboutsummaryrefslogtreecommitdiffstats
path: root/mail
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
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')
-rw-r--r--mail/ChangeLog14
-rw-r--r--mail/mail-tools.c12
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 <danw@ximian.com>
+
+ * 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 <ettore@ximian.com>
* 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;