X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=System%2FIO.hs;h=ab52244eff0560556fc69178957a350953c30da4;hb=509f28cc93b980d30aca37008cbe66c677a0d6f6;hp=a543f2b1f6c27454f635fef63d0817d34eba3396;hpb=4dc0a6fa50f56444c76e84387a16b179df2549ee;p=ghc-base.git diff --git a/System/IO.hs b/System/IO.hs index a543f2b..ab52244 100644 --- a/System/IO.hs +++ b/System/IO.hs @@ -1,4 +1,5 @@ -{-# OPTIONS_GHC -XNoImplicitPrelude #-} +{-# LANGUAGE CPP, NoImplicitPrelude #-} + ----------------------------------------------------------------------------- -- | -- Module : System.IO @@ -25,6 +26,15 @@ module System.IO ( Handle, -- abstract, instance of: Eq, Show. + -- | GHC note: a 'Handle' will be automatically closed when the garbage + -- collector detects that it has become unreferenced by the program. + -- However, relying on this behaviour is not generally recommended: + -- the garbage collector is unpredictable. If possible, use + -- an explicit 'hClose' to close 'Handle's when they are no longer + -- required. GHC does not currently attempt to free up file + -- descriptors when they have run out, it is your responsibility to + -- ensure that this doesn't happen. + -- ** Standard handles -- | Three handles are allocated during program initialisation, @@ -235,13 +245,12 @@ import System.Posix.Types #ifdef __GLASGOW_HASKELL__ import GHC.Base -import GHC.Real -import GHC.IO hiding ( onException ) +import GHC.IO hiding ( bracket, onException ) import GHC.IO.IOMode import GHC.IO.Handle.FD import qualified GHC.IO.FD as FD import GHC.IO.Handle -import GHC.IO.Handle.Text ( hGetBufSome ) +import GHC.IO.Handle.Text ( hGetBufSome, hPutStrLn ) import GHC.IORef import GHC.IO.Exception ( userError ) import GHC.IO.Encoding @@ -317,8 +326,7 @@ putStr s = hPutStr stdout s -- | The same as 'putStr', but adds a newline character. putStrLn :: String -> IO () -putStrLn s = do putStr s - putChar '\n' +putStrLn s = hPutStrLn stdout s -- | The 'print' function outputs a value of any printable type to the -- standard output device. @@ -416,13 +424,6 @@ readIO s = case (do { (x,t) <- reads s ; hReady :: Handle -> IO Bool hReady h = hWaitForInput h 0 --- | The same as 'hPutStr', but adds a newline character. - -hPutStrLn :: Handle -> String -> IO () -hPutStrLn hndl str = do - hPutStr hndl str - hPutChar hndl '\n' - -- | Computation 'hPrint' @hdl t@ writes the string representation of @t@ -- given by the 'shows' function to the file or channel managed by @hdl@ -- and appends a newline. @@ -440,7 +441,9 @@ hPrint hdl = hPutStrLn hdl . show -- | @'withFile' name mode act@ opens a file using 'openFile' and passes -- the resulting handle to the computation @act@. The handle will be -- closed on exit from 'withFile', whether by normal termination or by --- raising an exception. +-- raising an exception. If closing the handle raises an exception, then +-- this exception will be raised by 'withFile' rather than any exception +-- raised by 'act'. withFile :: FilePath -> IOMode -> (Handle -> IO r) -> IO r withFile name mode = bracket (openFile name mode) hClose @@ -564,7 +567,7 @@ openTempFile' loc tmp_dir template binary mode = do else ioError (errnoToIOError loc errno Nothing (Just tmp_dir)) else do - (fD,fd_type) <- FD.mkFD (fromIntegral fd) ReadWriteMode Nothing{-no stat-} + (fD,fd_type) <- FD.mkFD fd ReadWriteMode Nothing{-no stat-} False{-is_socket-} True{-is_nonblock-} @@ -615,8 +618,7 @@ foreign import ccall "getpid" c_getpid :: IO Int -- $locking -- Implementations should enforce as far as possible, at least locally to the -- Haskell process, multiple-reader single-writer locking on files. --- That is, /there may either be many handles on the same file which manage --- input, or just one handle on the file which manages output/. If any +-- That is, /there may either be many handles on the same file which manage input, or just one handle on the file which manages output/. If any -- open or semi-closed handle is managing a file for output, no new -- handle can be allocated for that file. If any open or semi-closed -- handle is managing a file for input, new handles can only be allocated