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