From fc13ab0c7ca5ff6d5735e8900f0fbf1dc9d3934f Mon Sep 17 00:00:00 2001 From: Not Zed Date: Fri, 26 Mar 2004 05:23:46 +0000 Subject: Added new maildir flags D for draft and commented P for forwarded. 2004-03-26 Not Zed * providers/local/camel-maildir-summary.c (flagbits[]): Added new maildir flags D for draft and commented P for forwarded. * providers/imap/camel-imap-store.c (get_folder_counts): Instead of looking up the folder in the object bag which will handle reservations and perhaps deadlock, just get the list of opened folders and use them if they're available. Should fix #56045. svn path=/trunk/; revision=25195 --- camel/providers/imap/camel-imap-store.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'camel/providers/imap') diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index 32bb41179b..2d8206b79d 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -2392,7 +2392,19 @@ static void get_folder_counts(CamelImapStore *imap_store, CamelFolderInfo *fi, CamelException *ex) { GSList *q; + GPtrArray *folders; + GHashTable *folders_table; CamelFolder *folder; + int i; + + /* We list rather than use get here, and manage our own lookups outside of the bag, + since get will wait if someone has reserved the name - can cause deadlock */ + folders = camel_object_bag_list(CAMEL_STORE(imap_store)->folders); + folders_table = g_hash_table_new(g_str_hash, g_str_equal); + for (i=0; ilen;i++) { + folder = folders->pdata[i]; + g_hash_table_insert(folders_table, folder->full_name, folder); + } /* non-recursive breath first search */ @@ -2424,15 +2436,12 @@ get_folder_counts(CamelImapStore *imap_store, CamelFolderInfo *fi, CamelExceptio fi->unread = get_folder_status (imap_store, fi->full_name, "UNSEEN"); fi->total = get_folder_status(imap_store, fi->full_name, "MESSAGES"); /* if we have this folder open, and the unread count has changed, update */ - folder = camel_object_bag_get(CAMEL_STORE(imap_store)->folders, fi->full_name); + folder = g_hash_table_lookup(folders_table, fi->full_name); if (folder && fi->unread != camel_folder_get_unread_message_count(folder)) { CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(folder))->refresh_info(folder, ex); fi->unread = camel_folder_get_unread_message_count(folder); fi->total = camel_folder_get_message_count(folder); } - if (folder) - camel_object_unref(folder); - } CAMEL_SERVICE_UNLOCK (imap_store, connect_lock); @@ -2446,6 +2455,11 @@ get_folder_counts(CamelImapStore *imap_store, CamelFolderInfo *fi, CamelExceptio fi = fi->next; } } + + g_hash_table_destroy(folders_table); + for (i=0; ilen;i++) + camel_object_unref(folders->pdata[i]); + g_ptr_array_free(folders, TRUE); } /* imap needs to treat inbox case insensitive */ -- cgit v1.2.3