The documentation of withMVar (in Control.Concurrent.MVar module of base package) says:
{-|
'withMVar' is an exception-safe wrapper for operating on the contents
of an 'MVar'. This operation is exception-safe: it will replace the
original contents of the 'MVar' if an exception is raised (see
"Control.Exception"). However, it is only atomic if there are no
other producers for this 'MVar'.
-}
withMVar :: MVar a -> (a -> IO b) -> IO b
withMVar m io =
mask $ \restore -> do
a <- takeMVar m
b <- restore (io a) `onException` putMVar m a
putMVar m a
return b
Can someone shed some light on what is meant by the statement -
"However, it is only atomic if there are no other producers for this 'MVar'."?
I hope this is the right mailing list for this question.
Thanks,
Harendra