aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;