[Haskell-cafe] Asynchronous exception wormholes kill modularity
Twan van Laarhoven
twanvl at gmail.com
Thu Mar 25 10:19:31 EDT 2010
Bas van Dijk wrote:
> ...
> However now comes the problem I would like to talk about. What if I
> want to use modifyMVar_ as part of a bigger atomic transaction. As in:
>
> block $ do ...
> modifyMVar_ m f
> ...
>
>>From a quick glanse at this code it looks like asynchronous exceptions
> can't be thrown to this transaction because we block them. However the
> unblock in modifyMVar_ opens an asynchronous exception "wormhole"
> right into our blocked computation. This destroys modularity.
Would it work if 'block' adds a layer of blocking and 'unblock' removes one
layer of blocking? So
block a = do
modifyIORef blockLevel (+1)
result <- a
modifyIORef blockLevel (-1)
return result
unblock a = do
modifyIORef blockLevel (-1)
result <- a
modifyIORef blockLevel (+1)
return result
canThrowExceptions = (<= 0) `liftM` readIORef blockLevel
Although it is probably a better idea to not use block/unblock at all in user code.
Twan
More information about the Libraries
mailing list