
#8804: BlockedIndefinitelyOnMVar thrown for an MVar which is still weakly accessible from another thread ------------------------------------------------+-------------------------- Reporter: bholst | Owner: Type: bug | simonmar Priority: normal | Status: closed Component: Runtime System | Milestone: Resolution: invalid | Version: 7.6.3 Operating System: Unknown/Multiple | Keywords: Type of failure: Incorrect result at runtime | Architecture: Test Case: | Unknown/Multiple Blocking: | Difficulty: | Unknown | Blocked By: | Related Tickets: ------------------------------------------------+-------------------------- Comment (by bholst): You mean the waiting thread is garbage collected in this example and that's why the MVar will never be filled? Then keeping the thread reachable through another MVar should do the trick? {{{ import Control.Concurrent import System.Mem.Weak import Data.Maybe import Control.Monad main = do my <- myThreadId m <- newEmptyMVar w <- mkWeakMVar m (return ()) o <- newEmptyMVar _ <- forkIO $ do threadDelay 1000000 n <- deRefWeak w when (isJust n) $ putMVar (fromJust n) () putMVar o () takeMVar m takeMVar o }}} This program has exactly the same output. I understand that the ''MVar m'' is not reachable from the other thread, but nevertheless the main thread is not blocked indefinately on this MVar. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8804#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler