[project @ 2004-04-20 15:52:18 by simonmar]
authorsimonmar <unknown>
Tue, 20 Apr 2004 15:52:18 +0000 (15:52 +0000)
committersimonmar <unknown>
Tue, 20 Apr 2004 15:52:18 +0000 (15:52 +0000)
New version of fixIO which does eager blackholing.

System/IO.hs

index 877623a..f2a412c 100644 (file)
@@ -375,8 +375,17 @@ hPrint hdl         =  hPutStrLn hdl . show
 -- fixIO
 
 #ifdef __GLASGOW_HASKELL__
-fixIO          :: (a -> IO a) -> IO a
-fixIO m         = stToIO (fixST (ioToST . m))
+fixIO :: (a -> IO a) -> IO a
+fixIO k = do
+    ref <- newIORef (throw NonTermination)
+    ans <- unsafeInterleaveIO (readIORef ref)
+    result <- k ans
+    writeIORef ref result
+    return result
+
+-- NOTE: we do our own explicit black holing here, because GHC's lazy
+-- blackholing isn't enough.  In an infinite loop, GHC may run the IO
+-- computation a few times before it notices the loop, which is wrong.
 #endif
 
 -- $locking