
I think the point is that by using atomically inside unsafePerformIO you
risk using atomically inside atomically; that is, the bad case is
atomically inside unsafePerformIO inside atomically. The documentation is
wrong in that it only throws an exception when transactions are nested in
this way.
On Sun, Nov 12, 2017 at 12:48 PM, Andrew Martin
This code works, so I don't think that's the case either:
import Control.Concurrent.STM import Data.IORef import System.IO.Unsafe
main :: IO () main = do ref <- newIORef (6 :: Int) i <- atomically $ do var <- newTVar (unsafePerformIO (readIORef ref)) readTVar var print i
On Sun, Nov 12, 2017 at 11:28 AM, Henning Thielemann < lemming@henning-thielemann.de> wrote:
On Sun, 12 Nov 2017, Andrew Martin wrote:
In the stm package, the docs for atomically read:
You cannot use 'atomically' inside an 'unsafePerformIO' or > 'unsafeInterleaveIO'. Any attempt to do so will result in a runtime > error. (Reason: allowing this would effectively allow a transaction > inside a transaction, depending on exactly when the thunk is > evaluated.)
I always thought that it would be the other way round, i.e. that you cannot call 'unsafePerformIO' inside an 'atomically'. Maybe I mixed something up.
-- -Andrew Thaddeus Martin
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries