On 2.12.2009, at 18:27, Jim Thomason wrote:

>> It shouldn't deadlock. The doc for -lock says: "If you lock (or successfully 
>> tryLock) a managed object context, the thread in which the lock call is made 
>> must have a retain until it invokes unlock. If you do not properly retain a 
>> context in a multi-threaded environment, this will result in deadlock." Did 
>> you heed it?
> 
> It didn't matter one way or the other. Incidentally, I've seen that
> warning too, but in this case I was sharing the [document
> managedObjectContext] across threads, so it was guaranteed to exist as
> long as the window was open.
So I take it that you have code in place that postpones window closing while 
your background thread works with the context?
> What was the need to retain it in that
> case, anyway?
To safe writing above code.
> 
> Sigh. Nevermind, I'm an idiot. My worker thread that refreshes my
> graph does 3 different things in it. 1 is fairly old and has been
> around for months, the other 2 things are newly added.
> 
> The original one ended up calling rearrangeObjects on an array
> controller, and since that's not threadsafe (right?) I dispatched the
> call to the main thread, and helpfully set waitUntilDone:YES. That was
> fine originally, since the app was guaranteed not to be looking at the
> context in the main thread, and basically I got lucky and could get
> away with it.
> 
> But now, due to additional processing in the main thread, it was
> looking at the context. So my worker thread would happily chug along
> until it reached the rearrangeObjects call. It'd hand it off to the
> main thread and wait for it to finish. But the main thread was paused
> since my worker thread had the lock on the context. And blamo.
> Deadlock.
> 
> Solution? Disturbingly easy to see now 12 hours into trying to fix it.
> Just do the rearrangeObjects on the main thread as before, but set
> waitUntilDone:NO. All problems miraculously fixed.

And an important lesson learned: blocking or waiting in any way while holding a 
lock is a dangerous thing to do.

Kai

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to