withMVar m io =
block $ do
a <- takeMVar m
- b <- catchAny (unblock (io a))
- (\e -> do putMVar m a; throw e)
+ b <- unblock (io a) `onException` putMVar m a
putMVar m a
return b
modifyMVar_ m io =
block $ do
a <- takeMVar m
- a' <- catchAny (unblock (io a))
- (\e -> do putMVar m a; throw e)
+ a' <- unblock (io a) `onException` putMVar m a
putMVar m a'
{-|
modifyMVar m io =
block $ do
a <- takeMVar m
- (a',b) <- catchAny (unblock (io a))
- (\e -> do putMVar m a; throw e)
+ (a',b) <- unblock (io a) `onException` putMVar m a
putMVar m a'
return b