Control.Concurrent モジュールの MVar を使った簡単なデッドロックなんだが、

main = newEmptyMVar >>= takeMVar

これ、ハングアップするんじゃなくて、
例外 BlockedIndefinitelyOnMVar が投げられるんだな

便利でいいんだが、どういう仕組みでデッドロックを検知してるんだろ
けっこう単純な仕組みなのかな