diff options
author | Ben Gamari <ben@smart-cactus.org> | 2017-03-06 15:54:35 -0500 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-03-06 17:23:02 -0500 |
commit | 18312086a48c90b22583c81fdb7bd2d7bfd38991 (patch) | |
tree | 3c66d6732a4b78eefce689aa71ce2249cdbcebc1 /libraries | |
parent | 6177c0d8bdc6f5c0675b2eace592620abb658787 (diff) | |
download | haskell-18312086a48c90b22583c81fdb7bd2d7bfd38991.tar.gz |
base: Kill out-of-date Notes
These were rendered out-of-date by D1103. Resolves #13174.
Diffstat (limited to 'libraries')
-rw-r--r-- | libraries/base/GHC/IO/Unsafe.hs | 27 |
1 files changed, 0 insertions, 27 deletions
diff --git a/libraries/base/GHC/IO/Unsafe.hs b/libraries/base/GHC/IO/Unsafe.hs index 5bb982421b..752353515e 100644 --- a/libraries/base/GHC/IO/Unsafe.hs +++ b/libraries/base/GHC/IO/Unsafe.hs @@ -103,33 +103,6 @@ like 'bracket' cannot be used safely within 'unsafeDupablePerformIO'. unsafeDupablePerformIO :: IO a -> a unsafeDupablePerformIO (IO m) = case runRW# m of (# _, a #) -> a --- Note [unsafeDupablePerformIO is NOINLINE] --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- Why do we NOINLINE unsafeDupablePerformIO? See the comment with --- GHC.ST.runST. Essentially the issue is that the IO computation --- inside unsafePerformIO must be atomic: it must either all run, or --- not at all. If we let the compiler see the application of the IO --- to realWorld#, it might float out part of the IO. - --- Note [unsafeDupablePerformIO has a lazy RHS] --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- Why is there a call to 'lazy' in unsafeDupablePerformIO? --- If we don't have it, the demand analyser discovers the following strictness --- for unsafeDupablePerformIO: C(U(AV)) --- But then consider --- unsafeDupablePerformIO (\s -> let r = f x in --- case writeIORef v r s of (# s1, _ #) -> --- (# s1, r #) ) --- The strictness analyser will find that the binding for r is strict, --- (because of uPIO's strictness sig), and so it'll evaluate it before --- doing the writeIORef. This actually makes libraries/base/tests/memo002 --- get a deadlock, where we specifically wanted to write a lazy thunk --- into the ref cell. --- --- Solution: don't expose the strictness of unsafeDupablePerformIO, --- by hiding it with 'lazy' --- But see discussion in Trac #9390 (comment:33) - {-| 'unsafeInterleaveIO' allows 'IO' computation to be deferred lazily. When passed a value of type @IO a@, the 'IO' will only be performed |