
Michael Stahl wrote:
here is the simplest thing i could come up with that has threads which are blocked indefinitely but not gc'd.
This example isn't deadlocked: it just waits 10 seconds and then receives the BlockedIndefinitely exception. Can you construct an example that has a real deadlock that isn't detected? Cheers, Simon
module Main where import Control.Monad.STM import Control.Concurrent.STM.TVar import Control.Concurrent.STM.TChan import Control.Concurrent
type Store' = TChan (TVar Int)
main = do (store,store') <- atomically $ do c <- newTChan c' <- dupTChan c v <- newTVar 0 writeTChan c v return (c,c') forkIO $ rule store threadDelay 10000000 -- wait for termination print' store' where rule store = do x <- atomically $ readTChan store forkIO $ match x rule store match x = do atomically $ do readTVar x retry print' store = do x <- atomically $ do v <- readTChan store readTVar v print x print' store