X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FIO%2FHandle%2FFD.hs;h=fd188a852db879c6b5fa698a9de5e2dd22e19ad8;hb=41e8fba828acbae1751628af50849f5352b27873;hp=6922732a8001ec7a5e481ad6805c1786af49e7b7;hpb=6e20be4ad2cb641f29e9972aaacd775f82487719;p=ghc-base.git diff --git a/GHC/IO/Handle/FD.hs b/GHC/IO/Handle/FD.hs index 6922732..fd188a8 100644 --- a/GHC/IO/Handle/FD.hs +++ b/GHC/IO/Handle/FD.hs @@ -1,4 +1,5 @@ -{-# OPTIONS_GHC -XNoImplicitPrelude #-} +{-# LANGUAGE CPP, NoImplicitPrelude, PatternGuards #-} + ----------------------------------------------------------------------------- -- | -- Module : GHC.IO.Handle.FD @@ -21,8 +22,6 @@ module GHC.IO.Handle.FD ( ) where import GHC.Base -import GHC.Num -import GHC.Real import GHC.Show import Data.Maybe -- import Control.Monad @@ -51,6 +50,7 @@ import qualified System.Posix.Internals as Posix -- | A handle managing input from the Haskell program's standard input channel. stdin :: Handle +{-# NOINLINE stdin #-} stdin = unsafePerformIO $ do -- ToDo: acquire lock setBinaryMode FD.stdin @@ -60,6 +60,7 @@ stdin = unsafePerformIO $ do -- | A handle managing output to the Haskell program's standard output channel. stdout :: Handle +{-# NOINLINE stdout #-} stdout = unsafePerformIO $ do -- ToDo: acquire lock setBinaryMode FD.stdout @@ -69,6 +70,7 @@ stdout = unsafePerformIO $ do -- | A handle managing output to the Haskell program's standard error channel. stderr :: Handle +{-# NOINLINE stderr #-} stderr = unsafePerformIO $ do -- ToDo: acquire lock setBinaryMode FD.stderr @@ -81,6 +83,9 @@ stdHandleFinalizer :: FilePath -> MVar Handle__ -> IO () stdHandleFinalizer fp m = do h_ <- takeMVar m flushWriteBuffer h_ + case haType h_ of + ClosedHandle -> return () + _other -> closeTextCodecs h_ putMVar m (ioe_finalizedHandle fp) -- We have to put the FDs into binary mode on Windows to avoid the newline @@ -235,7 +240,7 @@ fdToHandle' fdint mb_type is_socket filepath iomode binary = do Just RegularFile -> Nothing -- no stat required for streams etc.: Just other -> Just (other,0,0) - (fd,fd_type) <- FD.mkFD (fromIntegral fdint) iomode mb_stat + (fd,fd_type) <- FD.mkFD fdint iomode mb_stat is_socket is_socket mkHandleFromFD fd fd_type filepath iomode is_socket @@ -250,8 +255,8 @@ fdToHandle' fdint mb_type is_socket filepath iomode binary = do -- translation instead. fdToHandle :: Posix.FD -> IO Handle fdToHandle fdint = do - iomode <- Posix.fdGetMode (fromIntegral fdint) - (fd,fd_type) <- FD.mkFD (fromIntegral fdint) iomode Nothing + iomode <- Posix.fdGetMode fdint + (fd,fd_type) <- FD.mkFD fdint iomode Nothing False{-is_socket-} -- NB. the is_socket flag is False, meaning that: -- on Windows we're guessing this is not a socket (XXX)