Repository : ssh://darcs.haskell.org//srv/darcs/packages/base On branch : master
http://hackage.haskell.org/trac/ghc/changeset/8174ee234f971daa7e477139fc026693ceae038f >--------------------------------------------------------------- commit 8174ee234f971daa7e477139fc026693ceae038f Author: Simon Marlow <[email protected]> Date: Mon Nov 7 09:19:09 2011 +0000 add unsafeFixIO (#5421) >--------------------------------------------------------------- System/IO/Unsafe.hs | 25 ++++++++++++++++++++++++- 1 files changed, 24 insertions(+), 1 deletions(-) diff --git a/System/IO/Unsafe.hs b/System/IO/Unsafe.hs index b420662..33620a3 100644 --- a/System/IO/Unsafe.hs +++ b/System/IO/Unsafe.hs @@ -20,10 +20,15 @@ module System.IO.Unsafe ( unsafePerformIO, -- :: IO a -> a unsafeDupablePerformIO, -- :: IO a -> a unsafeInterleaveIO, -- :: IO a -> IO a + unsafeFixIO, ) where #ifdef __GLASGOW_HASKELL__ -import GHC.IO (unsafePerformIO, unsafeInterleaveIO, unsafeDupablePerformIO) +import GHC.Base +import GHC.IO +import GHC.IORef +import GHC.Exception +import Control.Exception #endif #ifdef __HUGS__ @@ -36,3 +41,21 @@ import NHC.Internal (unsafePerformIO, unsafeInterleaveIO) unsafeDupablePerformIO = unsafePerformIO #endif +-- | A slightly faster version of `System.IO.fixIO` that may not be +-- safe to use with multiple threads. The unsafety arises when used +-- like this: +-- +-- > unsafeFixIO $ \r -> +-- > forkIO (print r) +-- > return (...) +-- +-- In this case, the child thread will receive a @NonTermination@ +-- exception instead of waiting for the value of @r@ to be computed. +-- +unsafeFixIO :: (a -> IO a) -> IO a +unsafeFixIO k = do + ref <- newIORef (throw NonTermination) + ans <- unsafeDupableInterleaveIO (readIORef ref) + result <- k ans + writeIORef ref result + return result _______________________________________________ Cvs-libraries mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-libraries
