From 63fecf0aa5d529d4a7e23fd93c1a03964afe42c5 Mon Sep 17 00:00:00 2001
From: simonmar <unknown>
Date: Tue, 20 Apr 2004 15:52:18 +0000
Subject: [PATCH] [project @ 2004-04-20 15:52:18 by simonmar] New version of
 fixIO which does eager blackholing.

---
 libraries/base/System/IO.hs | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/libraries/base/System/IO.hs b/libraries/base/System/IO.hs
index 877623a54f..f2a412c98d 100644
--- a/libraries/base/System/IO.hs
+++ b/libraries/base/System/IO.hs
@@ -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
-- 
GitLab