> For Concurrent Haskell, with respect to asynchronous 
> exceptions, can a 
> thread receive an asynchronous exception if it's evaluating 
> an expression 
> that could "potentially block on IO" when evaluated within 
> the "block" 
> function?
> 
> Specifically, is interruptibility determined statically in 
> the language definition or dynamically at run time?

"dynamically at runtime", according to the semantics given in our paper.
GHC does actually implement this, although it implements a slightly
different version of throwTo from the one described in the paper (ours
blocks until the exception has been delivered).

> For example, assume a thread is evaluating the following function.
> 
> transfer :: MVar a -> IO (MVar a)
> transfer from =
>     block $ do
>         to <- newEmptyMVar
>         x <- takeMVar from
>         putMVar to x
>         return to
> 
> In general, since putMVar is an IO function, it can 
> potentially block (if 
> its MVar argument is already occupied with a value). However, 
> since "MVar 
> to" will obviously be vacant in this instance, the putMVar 
> can not block on 
> IO.
> 
> Would ghc allow an asynchronous exception to be raised at the 
> point that "putMVar to x" is evaluated?

Not unless the putMVar blocks.  The proof that it never blocks depends
on the behaviour of other threads though: if you have another thread
doing putMVar on the same MVar, then it may block.  Other threads must
be "well-behaved" for it to work.

> If not, then I guess transfer is exception safe.
> 
> Would that answer scale? Could I replace the "putMVar to x" with an 
> arbitrarily large/complex IO function that I might write that 
> is guaranteed 
> (by me at least) to be non-blocking and still be sure that an 
> exception 
> would not be delivered during evaluation of that function?

Yes.

Cheers,
        Simon
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to