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 explicit
+ -- 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,
hPutBuf, -- :: Handle -> Ptr a -> Int -> IO ()
hGetBuf, -- :: Handle -> Ptr a -> Int -> IO Int
#if !defined(__NHC__) && !defined(__HUGS__)
+ hGetBufSome, -- :: Handle -> Ptr a -> Int -> IO Int
hPutBufNonBlocking, -- :: Handle -> Ptr a -> Int -> IO Int
hGetBufNonBlocking, -- :: Handle -> Ptr a -> Int -> IO Int
#endif
#ifdef __GLASGOW_HASKELL__
import GHC.Base
+import GHC.Real
import GHC.IO hiding ( 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.IORef
import GHC.IO.Exception ( userError )
import GHC.IO.Encoding
oflags = oflags1 .|. binary_flags
#endif
-#ifdef __NHC__
+#if defined(__NHC__)
findTempName x = do h <- openFile filepath ReadWriteMode
return (filepath, h)
-#else
+#elif defined(__GLASGOW_HASKELL__)
findTempName x = do
fd <- withFilePath filepath $ \ f ->
c_open f oflags mode
then findTempName (x+1)
else ioError (errnoToIOError loc errno Nothing (Just tmp_dir))
else do
- -- XXX We want to tell fdToHandle what the filepath is,
- -- as any exceptions etc will only be able to report the
- -- fd currently
+
+ (fD,fd_type) <- FD.mkFD (fromIntegral fd) ReadWriteMode Nothing{-no stat-}
+ False{-is_socket-}
+ True{-is_nonblock-}
+
+ h <- mkHandleFromFD fD fd_type filepath ReadWriteMode False{-set non-block-}
+ (Just localeEncoding)
+
+ return (filepath, h)
+#else
h <- fdToHandle fd `onException` c_close fd
return (filepath, h)
#endif
+
where
filename = prefix ++ show x ++ suffix
filepath = tmp_dir `combine` filename
-- $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