[GHC] #767: withMVar family have a bug

GHC trac at galois.com
Mon May 8 06:12:39 EDT 2006


#767: withMVar family have a bug
-------------------------+--------------------------------------------------
    Reporter:  simonmar  |        Owner:         
        Type:  bug       |       Status:  new    
    Priority:  normal    |    Milestone:         
   Component:  Compiler  |      Version:  6.4.1  
    Severity:  normal    |     Keywords:         
          Os:  Unknown   |   Difficulty:  Unknown
Architecture:  Unknown   |  
-------------------------+--------------------------------------------------
{{{withMVar}}} is defined like this:

 {{{
 withMVar :: MVar a -> (a -> IO b) -> IO b
 withMVar m io =
   block $ do
     a <- takeMVar m
     b <- catch (unblock (io a))
             (\e -> do putMVar m a; throw e)
     putMVar m a
     return b
 }}}

 unfortunately this has a (very rare) bug: {{{catch}}} can raise a stack
 overflow exception, which would leave the {{{MVar}}} empty.

 This is a tricky one.  Perhaps in the event of a stack overflow, catch
 should ensure that the exception is passed directly to its handler, and we
 always add some extra stack space for the handler.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/767>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the Glasgow-haskell-bugs mailing list