Re: [evolution-patches] fix for bug #61551




This doesn't look good, shouldn't be poking the other folders internals, more than it already is anyway.

I think it would be better to just not call camel_folder_refresh_info with the connect lock held.  Infact since we're only comparing the current folder which is the only lockable item, it should be safe to remove the connect locks enitrely.  refresh_info will lock in the right order.

On Wed, 2004-07-14 at 15:38 -0400, Jeffrey Stedfast wrote:
http://bugzilla.ximian.com/show_bug.cgi?id=61551

deadlock condition where one thread has the connect_lock and tries to
get the folder_lock and another thread which already has the folder_lock
tries to get the connect_lock.

Jeff

Plain text document attachment (61551.patch)
? 55280.patch
? 61538.patch
? 61551.patch
? ChangeLog.nonximian
? body
? body.c
? body.txt
? body2.txt
? braindamaged.patch
? camel-namespace.patch
? cf.c
? charset-map.c
? charset-map.diff
? class.sh
? cmsutil.c
? date.patch
? flags
? foo
? foo.txt
? foo2.txt
? gw-body.txt
? imap
? invalid-content-id.patch
? iso
? iso.c
? namespace.sh
? patch
? pop3-uidl.patch
? smime
? uid-cache.patch
? providers/tmp
? providers/local/camel-mozilla-folder.c
? providers/local/camel-mozilla-folder.h
? providers/local/camel-mozilla-store.c
? providers/local/camel-mozilla-store.h
? tests/data/camel-mime-tests.tar.gz
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/camel/ChangeLog,v
retrieving revision 1.2219
diff -u -r1.2219 ChangeLog
--- ChangeLog	14 Jul 2004 19:00:37 -0000	1.2219
+++ ChangeLog	14 Jul 2004 19:25:16 -0000
@@ -1,5 +1,11 @@
 2004-07-14  Jeffrey Stedfast  <fejj novell com>
 
+	* providers/imap/camel-imap-folder.c (imap_transfer_online): Grab
+	the folder lock before grabbing the connect_lock when refreshing
+	the dest folder's info to avoid the deadlock in bug #61551.
+
+2004-07-14  Jeffrey Stedfast  <fejj novell com>
+
 	Fix for bug #61538
 
 	* camel-process.c (camel_process_fork): Same.
Index: providers/imap/camel-imap-folder.c
===================================================================
RCS file: /cvs/gnome/evolution/camel/providers/imap/camel-imap-folder.c,v
retrieving revision 1.336
diff -u -r1.336 camel-imap-folder.c
--- providers/imap/camel-imap-folder.c	20 May 2004 19:16:53 -0000	1.336
+++ providers/imap/camel-imap-folder.c	14 Jul 2004 19:25:16 -0000
@@ -1481,11 +1481,13 @@
 		return;
 
 	/* Make the destination notice its new messages */
+	CAMEL_FOLDER_LOCK(dest, lock);
 	CAMEL_SERVICE_LOCK (store, connect_lock);
 	if (store->current_folder != dest ||
 	    camel_folder_summary_count (dest->summary) == count)
 		camel_folder_refresh_info (dest, ex);
 	CAMEL_SERVICE_UNLOCK (store, connect_lock);
+	CAMEL_FOLDER_UNLOCK(dest, lock);
 	
 	if (delete_originals) {
 		for (i = 0; i < uids->len; i++)
--
Michael Zucchi <notzed ximian com>
"born to die, live to work, it's all downhill from here"
Novell's Evolution and Free Software Developer


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]