aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog9
-rw-r--r--camel/camel-object.c32
-rw-r--r--camel/camel-object.h1
-rw-r--r--camel/providers/imap/camel-imap-store.c32
4 files changed, 51 insertions, 23 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 9f7ea67b15..d8eeab1a19 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,5 +1,14 @@
2004-03-29 Not Zed <NotZed@Ximian.com>
+ * providers/imap/camel-imap-store.c (get_folder_counts): use
+ object_bag_peek instead of _get, since we dont want to clash/wait
+ for reservations. More #56045 related fixes.
+ (get_folder_counts): revert the lookup/hashtable stuff for the
+ folder, and use object_bag_peek.
+
+ * camel-object.c (camel_object_bag_peek): new method to get an
+ object bag entry without worrying about if its reserved or not.
+
* camel-gpg-context.c (gpg_verify): get the content-type off of
the multipart-signed, not its container. This seems wrong
... but might fix #56084.
diff --git a/camel/camel-object.c b/camel/camel-object.c
index 4875774652..f4469f8d9d 100644
--- a/camel/camel-object.c
+++ b/camel/camel-object.c
@@ -1812,6 +1812,38 @@ camel_object_bag_get(CamelObjectBag *bag, const void *key)
}
/**
+ * camel_object_bag_peek:
+ * @bag:
+ * @key:
+ *
+ * Lookup the object @key in @bag, ignoring any reservations. If it
+ * isn't committed, then it isn't considered. This should only be
+ * used where reliable transactional-based state is not required.
+ *
+ * Unlike other 'peek' operations, the object is still reffed if
+ * found.
+ *
+ * Return value: A referenced object, or NULL if @key is not
+ * present in the bag.
+ **/
+void *
+camel_object_bag_peek(CamelObjectBag *bag, const void *key)
+{
+ CamelObject *o;
+
+ E_LOCK(type_lock);
+
+ o = g_hash_table_lookup(bag->object_table, key);
+ if (o) {
+ /* we use the same lock as the refcount */
+ o->ref_count++;
+ }
+ E_UNLOCK(type_lock);
+
+ return o;
+}
+
+/**
* camel_object_bag_reserve:
* @bag:
* @key:
diff --git a/camel/camel-object.h b/camel/camel-object.h
index cb5a5470aa..9b7b62f624 100644
--- a/camel/camel-object.h
+++ b/camel/camel-object.h
@@ -254,6 +254,7 @@ typedef void *(*CamelCopyFunc)(const void *vo);
CamelObjectBag *camel_object_bag_new(GHashFunc hash, GEqualFunc equal, CamelCopyFunc keycopy, GFreeFunc keyfree);
void *camel_object_bag_get(CamelObjectBag *bag, const void *key);
+void *camel_object_bag_peek(CamelObjectBag *bag, const void *key);
void *camel_object_bag_reserve(CamelObjectBag *bag, const void *key);
void camel_object_bag_add(CamelObjectBag *bag, const void *key, void *o);
void camel_object_bag_abort(CamelObjectBag *bag, const void *key);
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index bf8a3152c5..4120c3303c 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -2358,7 +2358,7 @@ fill_fi(CamelStore *store, CamelFolderInfo *fi, guint32 flags)
fi->unread = -1;
fi->total = -1;
- folder = camel_object_bag_get(store->folders, fi->full_name);
+ folder = camel_object_bag_peek(store->folders, fi->full_name);
if (folder) {
if ((flags & CAMEL_STORE_FOLDER_INFO_FAST) == 0)
/* we use connect lock for everything, so this should be safe */
@@ -2394,19 +2394,7 @@ 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; i<folders->len;i++) {
- folder = folders->pdata[i];
- g_hash_table_insert(folders_table, folder->full_name, folder);
- }
/* non-recursive breath first search */
@@ -2437,11 +2425,14 @@ 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 = 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);
+ folder = camel_object_bag_peek(CAMEL_STORE(imap_store)->folders, fi->full_name);
+ if (folder) {
+ if (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);
+ }
+ camel_object_unref(folder);
}
}
} else {
@@ -2454,11 +2445,6 @@ get_folder_counts(CamelImapStore *imap_store, CamelFolderInfo *fi, CamelExceptio
fi = fi->next;
}
}
-
- g_hash_table_destroy(folders_table);
- for (i=0; i<folders->len;i++)
- camel_object_unref(folders->pdata[i]);
- g_ptr_array_free(folders, TRUE);
}
/* imap needs to treat inbox case insensitive */