> Can someone help me understand how this works? I've been 
> reading the paper "Asynchronous Exceptions in Haskell". This 
> gives a combinator
> 
> finally :: IO a -> IO b -> IO s
> 
> finally a b = 
>    block (do {
>       r <- catch (unblock a) (\e -> do { b; throw e });
>       b;
>       return r; })
> 
> Now suppose we have
> 
> finally (putStrLn "Test Started") (putStrLn "Test Terminated")
> 
> then looking at the semantics, putStrLn can become stuck and 
> therefore can be interrupted. So the interrupt could occur 
> whilst "Test Terminated" is being output and we could end up with
> 
> Test Started
> Test Term
> 
> Is this what could happen? If so, is there a way of making 
> sure that "Test Terminated" is output?

Yes, that's correct.  putStrLn is interruptible, so you can't force it
to run to completion - to do so would introduce a possible deadlock.  

However, I agree that sometimes you really want to be able to do this,
so perhaps we need another form of 'block' which doesn't allow *any*
exceptions to be delivered, for those times when you know that the time
spent waiting in an interruptible operation is going to be bounded.

Cheers,
        Simon

_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to