From 6d550803dcc87d017586208024653672401093d2 Mon Sep 17 00:00:00 2001 From: simonmar Date: Mon, 28 Jan 2002 13:47:05 +0000 Subject: [PATCH] [project @ 2002-01-28 13:47:05 by simonmar] Never close std file descriptors. This works around a "problem" in GHCi: if the program reaches EOF on stdin, it might close it, which in turn causes the interactive shell to fall over with a "bad file descriptor" error when it tries to read from stdin. --- ghc/lib/std/PrelHandle.hs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/ghc/lib/std/PrelHandle.hs b/ghc/lib/std/PrelHandle.hs index 875fe4b..fe360a7 100644 --- a/ghc/lib/std/PrelHandle.hs +++ b/ghc/lib/std/PrelHandle.hs @@ -4,7 +4,7 @@ #undef DEBUG -- ----------------------------------------------------------------------------- --- $Id: PrelHandle.hs,v 1.8 2001/12/27 11:30:10 sof Exp $ +-- $Id: PrelHandle.hs,v 1.9 2002/01/28 13:47:05 simonmar Exp $ -- -- (c) The University of Glasgow, 1994-2001 -- @@ -768,17 +768,22 @@ hClose_help handle_ = case haType handle_ of ClosedHandle -> return handle_ _ -> do - let fd = fromIntegral (haFD handle_) + let fd = haFD handle_ + c_fd = fromIntegral fd + flushWriteBufferOnly handle_ - -- close the file descriptor, but not when this is the read side - -- of a duplex handle. + -- close the file descriptor, but not when this is the read + -- side of a duplex handle, and not when this is one of the + -- std file handles. case haOtherSide handle_ of - Nothing -> throwErrnoIfMinus1Retry_ "hClose" + Nothing -> + when (fd /= fd_stdin && fd /= fd_stdout && fd /= fd_stderr) $ + throwErrnoIfMinus1Retry_ "hClose" #ifdef mingw32_TARGET_OS - (closeFd (haIsStream handle_) fd) + (closeFd (haIsStream handle_) c_fd) #else - (c_close fd) + (c_close c_fd) #endif Just _ -> return () @@ -786,7 +791,7 @@ hClose_help handle_ = writeIORef (haBuffers handle_) BufferListNil -- unlock it - unlockFile fd + unlockFile c_fd -- we must set the fd to -1, because the finalizer is going -- to run eventually and try to close/unlock it. -- 1.7.10.4