From 50a3ac89dc651b98ce13568521b48c7a61d082fc Mon Sep 17 00:00:00 2001 From: sof Date: Fri, 14 Aug 1998 13:01:45 +0000 Subject: [PATCH] [project @ 1998-08-14 13:01:44 by sof] New functions: unsafeIOToST, hConnectTo --- ghc/lib/exts/GlaExts.lhs | 2 +- ghc/lib/exts/IOExts.lhs | 52 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/ghc/lib/exts/GlaExts.lhs b/ghc/lib/exts/GlaExts.lhs index ada0f05..a95a6eb 100644 --- a/ghc/lib/exts/GlaExts.lhs +++ b/ghc/lib/exts/GlaExts.lhs @@ -68,7 +68,7 @@ import PrelIOBase import ByteArray import MutableArray import Monad -import Foreign +import PrelCCall ( Word(..) ) type PrimIO a = IO a primIOToIO io = io diff --git a/ghc/lib/exts/IOExts.lhs b/ghc/lib/exts/IOExts.lhs index d74c21a..8b09456 100644 --- a/ghc/lib/exts/IOExts.lhs +++ b/ghc/lib/exts/IOExts.lhs @@ -1,9 +1,15 @@ % % (c) The AQUA Project, Glasgow University, 1994-1996 % - \section[IOExts]{Module @IOExts@} +@IOExts@ provides useful functionality that fall outside the +standard Haskell IO interface. Expect the contents of IOExts +to be the same for Hugs and GHC (same goes for any other +Hugs/GHC extension libraries, unless a function/type is +explicitly flagged as being implementation specific +extension.) + \begin{code} {-# OPTIONS -fno-implicit-prelude #-} @@ -12,14 +18,12 @@ module IOExts , unsafePerformIO , unsafeInterleaveIO - , IORef - -- instance Eq (IORef a) + , IORef -- instance of: Eq , newIORef , readIORef , writeIORef - , IOArray - -- instance Eq (IOArray ix a) + , IOArray -- instance of: Eq , newIOArray , boundsIOArray , readIOArray @@ -31,25 +35,34 @@ module IOExts , hSetEcho , hGetEcho + , hIsTerminalDevice + , hConnectTo , trace , performGC , reallyUnsafePtrEq + , unsafeIOToST + ) where + \end{code} \begin{code} import PrelBase import PrelIOBase import PrelHandle ( openFileEx, IOModeEx(..), - hSetEcho, hGetEcho + hSetEcho, hGetEcho, getHandleFd ) import PrelST import PrelArr import PrelGHC import Ix +import IO +import PrelHandle +import PrelErr +reallyUnsafePtrEq :: a -> a -> Bool reallyUnsafePtrEq a b = case reallyUnsafePtrEquality# a b of 0# -> False @@ -93,3 +106,30 @@ writeIOArray (IOArray arr) ix elt = stToIO (writeArray arr ix elt) freezeIOArray (IOArray arr) = stToIO (freezeArray arr) \end{code} +\begin{code} +{-# NOINLINE trace #-} +trace :: String -> a -> a +trace string expr = unsafePerformIO $ do + fd <- getHandleFd stderr + hPutStrLn stderr string + _ccall_ PostTraceHook fd + return expr + +\end{code} + +\begin{code} +unsafeIOToST :: IO a -> ST s a +unsafeIOToST (IO io) = ST $ \ s -> + case ((unsafeCoerce# io) s) of + IOok new_s a -> unsafeCoerce# (STret new_s a) + IOfail new_s e -> error ("I/O Error (unsafeIOToST): " ++ showsPrec 0 e "\n") +\end{code} + +Not something you want to call normally, but useful +in the cases where you do want to flush stuff out of +the heap or make sure you've got room enough + +\begin{code} +performGC :: IO () +performGC = _ccall_GC_ StgPerformGarbageCollection +\end{code} -- 1.7.10.4