{-# LANGUAGE Unsafe #-}{-# LANGUAGE NoImplicitPrelude #-}------------------------------------------------------------------------------- |-- Module : System.IO.Unsafe-- Copyright : (c) The University of Glasgow 2001-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : libraries@haskell.org-- Stability : provisional-- Portability : portable---- \"Unsafe\" IO operations.-------------------------------------------------------------------------------moduleSystem.IO.Unsafe (-- * Unsafe 'System.IO.IO' operationsunsafePerformIO ,unsafeDupablePerformIO ,unsafeInterleaveIO ,unsafeFixIO ,)whereimportGHC.Internal.Base importGHC.Internal.IO importGHC.Internal.IORef importGHC.Internal.Exception importGHC.Internal.Control.Exception -- | A slightly faster version of `GHC.Internal.System.IO.fixIO` that may not be-- safe to use with multiple threads. The unsafety arises when used-- like this:---- > unsafeFixIO $ \r -> do-- > 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.---- @since 4.5.0.0unsafeFixIO ::(a ->IO a )->IO a unsafeFixIO :: forall a. (a -> IO a) -> IO a
unsafeFixIO a -> IO a
k =doref <-a -> IO (IORef a)
forall a. a -> IO (IORef a)
newIORef (NonTermination -> a
forall a e. (HasCallStack, Exception e) => e -> a
throw NonTermination
NonTermination )ans <-unsafeDupableInterleaveIO (readIORef ref )result <-k ans writeIORef ref result return result 

AltStyle によって変換されたページ (->オリジナル) /