X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FIO%2FHandle%2FFD.hs;h=0ef0cea62e373133965062dddf2187447cd160a3;hb=595f2cbc9072003f4e86dab6d1c9a408d388f3b7;hp=ec215ec846984026e348819637ac1d1ffec45ec7;hpb=d181127657f46b1d0acd3dc94ccce4c0e6241095;p=ghc-base.git diff --git a/GHC/IO/Handle/FD.hs b/GHC/IO/Handle/FD.hs index ec215ec..0ef0cea 100644 --- a/GHC/IO/Handle/FD.hs +++ b/GHC/IO/Handle/FD.hs @@ -21,16 +21,14 @@ module GHC.IO.Handle.FD ( ) where import GHC.Base -import GHC.Num -import GHC.Real import GHC.Show import Data.Maybe -import Control.Monad +-- import Control.Monad import Foreign.C.Types import GHC.MVar import GHC.IO import GHC.IO.Encoding -import GHC.IO.Exception +-- import GHC.IO.Exception import GHC.IO.Device as IODevice import GHC.IO.Exception import GHC.IO.IOMode @@ -51,6 +49,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 +59,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 +69,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,13 +82,17 @@ 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 -- translation that the CRT IO library does. setBinaryMode :: FD -> IO () #ifdef mingw32_HOST_OS -setBinaryMode fd = do setmode (fdFD fd) True; return () +setBinaryMode fd = do _ <- setmode (fdFD fd) True + return () #else setBinaryMode _ = return () #endif @@ -234,7 +239,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 @@ -249,8 +254,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)