On 31/03/11 11:03, Gregory Collins wrote:
I'm guessing the trigger condition for
"BlockedIndefinitelyOnMVar" is "blocked and mvar refcount == 1"
It's not simply a reference count (the thread that's blocked forever can hold multiple references to the MVar and it's still blocked indefinitely). Here's how I understand it.

Blocked threads are not counted as roots during the GC. Therefore for a blocked thread to survive a round of GC without being collected, something reachable from a root has to point to the thread. The only thing that points to a thread blocked on an MVar (same idea for TVars, too) is the MVar itself. Therefore, something that's reachable from a GC root (a running thread is a root, I think) must point to the MVar to allow the thread to survive the GC. If a thread would be garbage collected, it is instead woken up with a BlockedIndefinitelyOnMVar exception.

I think if you put an MVar into a StablePtr, that may prevent threads waiting on it from being woken up with that exception.

Thanks,

Neil.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to