dup = dup
dup2 = dup2
+-- We used to use System.Posix.Internals.dEFAULT_BUFFER_SIZE, which is
+-- taken from the value of BUFSIZ on the current platform. This value
+-- varies too much though: it is 512 on Windows, 1024 on OS X and 8192
+-- on Linux. So let's just use a decent size on every platform:
+dEFAULT_FD_BUFFER_SIZE :: Int
+dEFAULT_FD_BUFFER_SIZE = 8096
+
instance BufferedIO FD where
- newBuffer _dev state = newByteBuffer dEFAULT_BUFFER_SIZE state
+ newBuffer _dev state = newByteBuffer dEFAULT_FD_BUFFER_SIZE state
fillReadBuffer fd buf = readBuf' fd buf
fillReadBuffer0 fd buf = readBufNonBlocking fd buf
flushWriteBuffer fd buf = writeBuf' fd buf
close :: FD -> IO ()
close fd =
#ifndef mingw32_HOST_OS
- (flip finally) (release fd) $ do
+ (flip finally) (release fd) $
#endif
- let closer realFd =
- throwErrnoIfMinus1Retry_ "GHC.IO.FD.close" $
+ do let closer realFd =
+ throwErrnoIfMinus1Retry_ "GHC.IO.FD.close" $
#ifdef mingw32_HOST_OS
- if fdIsSocket fd then
- c_closesocket (fromIntegral realFd)
- else
+ if fdIsSocket fd then
+ c_closesocket (fromIntegral realFd)
+ else
#endif
- c_close (fromIntegral realFd)
- closeFd closer (fromIntegral (fdFD fd))
+ c_close (fromIntegral realFd)
+ closeFdWith closer (fromIntegral (fdFD fd))
release :: FD -> IO ()
#ifdef mingw32_HOST_OS