[project @ 2001-05-18 16:54:04 by simonmar]
authorsimonmar <unknown>
Fri, 18 May 2001 16:54:11 +0000 (16:54 +0000)
committersimonmar <unknown>
Fri, 18 May 2001 16:54:11 +0000 (16:54 +0000)
commitd9af408e5c512501cfa991f5e4a76c9154bca917
tree627365b7dad9c2a5e1d892a1f631690b46e24a11
parent5f6f90850d5c82dc56d13bbc035d635e1cb2106b
[project @ 2001-05-18 16:54:04 by simonmar]
I/O library rewrite
-------------------

This commit replaces the old C/Haskell I/O implementation with a new
Haskell-only one using the new FFI & hsc2hs.

main points:

   - lots of code deleted: we're about 3000 lines of C lighter,
     but the amount of Haskell code is about the same.

   - performance is ok: some operations are faster, others are
     slower.  There's still some tuning to do, though.

   - the new library is designed to handle read/write streams
     much better: a read/write stream gets a special kind of
     handle internally called a "DuplexHandle", which actually
     contains two separate handles, one for writing and one for
     reading.  The upshot is that you can do simultaneous reading
     and writing to/from a socket or FIFO without any locking
     problems.  The effect is similar to calling socketToHandle
     twice, except that finalization works properly (creating
     two separate Handles could lead to the socket being closed
     too early when one of the Handles is GC'd).

   - hConnectTo and withHandleFor are gone (no one responded to
     my mail on GHC users, but we can always bring 'em back if
     necessary).

   - I made a half-hearted attempt at keeping the system-specific
     code in one place: see PrelPosix.hsc.

   - I've rearranged the I/O tests and added lots more.
     ghc/tests/lib/IO now contains Haskell 98-only IO tests,
     ghc/test/lib/{IOExts, Directory, Time} now contain tests for
     the relevant libraries.  I haven't quite finished in here yet,
     the IO tests work but the others don't yet.

   - I haven't done anything about Unicode yet, but now we can
     start to discuss what needs doing here.  The new library
     is using MutableByteArrays for its buffers because that
     turned out to be a *lot* easier (and quicker) than malloc'd
     buffers - I hope this won't cause trouble for unicode
     translations though.

WARNING: Windows users refrain from updating until we've had a chance
to fix any issues that arise.

Testing: the basic H98 stuff has been pretty thoroughly tested, but
the new duplex handle stuff is still a little green.
179 files changed:
ghc/compiler/prelude/PrelNames.lhs
ghc/lib/std/CPUTime.hsc
ghc/lib/std/Directory.hsc
ghc/lib/std/IO.lhs
ghc/lib/std/Makefile
ghc/lib/std/Monad.lhs
ghc/lib/std/PrelBits.lhs
ghc/lib/std/PrelByteArr.lhs
ghc/lib/std/PrelCError.lhs
ghc/lib/std/PrelCString.lhs
ghc/lib/std/PrelCTypes.lhs
ghc/lib/std/PrelCTypesISO.lhs
ghc/lib/std/PrelConc.lhs
ghc/lib/std/PrelErr.lhs
ghc/lib/std/PrelForeign.lhs
ghc/lib/std/PrelHandle.hsc [new file with mode: 0644]
ghc/lib/std/PrelHandle.lhs [deleted file]
ghc/lib/std/PrelIO.hsc [new file with mode: 0644]
ghc/lib/std/PrelIO.lhs [deleted file]
ghc/lib/std/PrelIOBase.lhs
ghc/lib/std/PrelInt.lhs
ghc/lib/std/PrelMain.lhs
ghc/lib/std/PrelMarshalAlloc.lhs
ghc/lib/std/PrelMarshalArray.lhs
ghc/lib/std/PrelMarshalError.lhs
ghc/lib/std/PrelMarshalUtils.lhs
ghc/lib/std/PrelPosix.hsc [new file with mode: 0644]
ghc/lib/std/PrelStorable.lhs
ghc/lib/std/PrelWord.lhs
ghc/lib/std/Prelude.lhs
ghc/lib/std/System.lhs
ghc/lib/std/Time.hsc
ghc/lib/std/cbits/HsStd.h
ghc/lib/std/cbits/closeFile.c [deleted file]
ghc/lib/std/cbits/echoAux.c [deleted file]
ghc/lib/std/cbits/errno.c
ghc/lib/std/cbits/fileEOF.c [deleted file]
ghc/lib/std/cbits/fileGetc.c [deleted file]
ghc/lib/std/cbits/fileLookAhead.c [deleted file]
ghc/lib/std/cbits/fileObject.c [deleted file]
ghc/lib/std/cbits/fileObject.h [deleted file]
ghc/lib/std/cbits/filePosn.c [deleted file]
ghc/lib/std/cbits/filePutc.c [deleted file]
ghc/lib/std/cbits/fileSize.c [deleted file]
ghc/lib/std/cbits/flushFile.c [deleted file]
ghc/lib/std/cbits/freeFile.c [deleted file]
ghc/lib/std/cbits/getBufferMode.c [deleted file]
ghc/lib/std/cbits/inputReady.c
ghc/lib/std/cbits/lockFile.c [moved from ghc/lib/std/cbits/getLock.c with 63% similarity]
ghc/lib/std/cbits/lockFile.h [new file with mode: 0644]
ghc/lib/std/cbits/openFile.c [deleted file]
ghc/lib/std/cbits/progargs.c
ghc/lib/std/cbits/readFile.c [deleted file]
ghc/lib/std/cbits/seekFile.c [deleted file]
ghc/lib/std/cbits/setBinaryMode.c [deleted file]
ghc/lib/std/cbits/setBuffering.c [deleted file]
ghc/lib/std/cbits/system.c
ghc/lib/std/cbits/tcSetAttr.c [deleted file]
ghc/lib/std/cbits/writeError.c
ghc/lib/std/cbits/writeFile.c [deleted file]
ghc/tests/deSugar/should_compile/ds046.hs
ghc/tests/io/should_run/io001.hs [deleted file]
ghc/tests/io/should_run/io007.hs [deleted file]
ghc/tests/io/should_run/io007.stdout [deleted file]
ghc/tests/io/should_run/io013.hs [deleted file]
ghc/tests/io/should_run/io013.stdout [deleted file]
ghc/tests/io/should_run/io015.hs [deleted file]
ghc/tests/io/should_run/io016.hs [deleted file]
ghc/tests/io/should_run/io016.stdout [deleted file]
ghc/tests/io/should_run/io017.hs [deleted file]
ghc/tests/io/should_run/io018.stdout [deleted file]
ghc/tests/io/should_run/io023.stdout [deleted file]
ghc/tests/io/should_run/io026.hs [deleted file]
ghc/tests/io/should_run/io035.stdout [deleted file]
ghc/tests/lib/CPUTime/CPUTime001.hs [moved from ghc/tests/io/should_run/io012.hs with 100% similarity]
ghc/tests/lib/CPUTime/CPUTime001.stdout [moved from ghc/tests/io/should_run/io012.stdout with 100% similarity]
ghc/tests/lib/Directory/currentDirectory001.hs [moved from ghc/tests/io/should_run/io010.hs with 100% similarity]
ghc/tests/lib/Directory/currentDirectory001.stdout [moved from ghc/tests/io/should_run/io006.stdout with 100% similarity]
ghc/tests/lib/Directory/directory001.hs [moved from ghc/tests/io/should_run/io011.hs with 100% similarity]
ghc/tests/lib/Directory/directory001.stdout [moved from ghc/tests/io/should_run/io010.stdout with 100% similarity]
ghc/tests/lib/Directory/getDirectoryContents001.hs [moved from ghc/tests/io/should_run/io009.hs with 100% similarity]
ghc/tests/lib/Directory/getDirectoryContents001.stdout [moved from ghc/tests/io/should_run/io009.stdout with 100% similarity]
ghc/tests/lib/Directory/getPermissions001.hs [moved from ghc/tests/io/should_run/io034.hs with 100% similarity]
ghc/tests/lib/Directory/getPermissions001.stdout [moved from ghc/tests/io/should_run/io034.stdout with 100% similarity]
ghc/tests/lib/Directory/getPermissions001.stdout-mingw [moved from ghc/tests/io/should_run/io034.stdout-mingw with 100% similarity]
ghc/tests/lib/IO/IOError001.hs [moved from ghc/tests/io/should_run/io035.hs with 100% similarity]
ghc/tests/lib/IO/IOError001.stdout [new file with mode: 0644]
ghc/tests/lib/IO/IOError001.stdout-mingw [moved from ghc/tests/io/should_run/io035.stdout-mingw with 100% similarity]
ghc/tests/lib/IO/Makefile [new file with mode: 0644]
ghc/tests/lib/IO/finalization001.hs [moved from ghc/tests/io/should_run/io033.hs with 91% similarity]
ghc/tests/lib/IO/finalization001.stdout [moved from ghc/tests/io/should_run/io033.stdout with 100% similarity]
ghc/tests/lib/IO/hClose001.hs [moved from ghc/tests/io/should_run/io006.hs with 100% similarity]
ghc/tests/lib/IO/hClose001.stdout [moved from ghc/tests/io/should_run/io011.stdout with 100% similarity]
ghc/tests/lib/IO/hFileSize001.hs [new file with mode: 0644]
ghc/tests/lib/IO/hFileSize001.stdout [new file with mode: 0644]
ghc/tests/lib/IO/hFileSize002.hs [moved from ghc/tests/io/should_run/io024.hs with 96% similarity]
ghc/tests/lib/IO/hFileSize002.stdout [moved from ghc/tests/io/should_run/io024.stdout with 100% similarity]
ghc/tests/lib/IO/hFlush001.hs [moved from ghc/tests/io/should_run/io029.hs with 65% similarity]
ghc/tests/lib/IO/hFlush001.stdout [moved from ghc/tests/io/should_run/io029.stdout with 100% similarity]
ghc/tests/lib/IO/hGetBuffering001.hs [moved from ghc/tests/io/should_run/io014.hs with 100% similarity]
ghc/tests/lib/IO/hGetBuffering001.stdout [moved from ghc/tests/io/should_run/io014.stdout with 100% similarity]
ghc/tests/lib/IO/hGetChar001.hs [new file with mode: 0644]
ghc/tests/lib/IO/hGetChar001.stdin [moved from ghc/tests/io/should_run/io017.stdin with 100% similarity]
ghc/tests/lib/IO/hGetChar001.stdout [moved from ghc/tests/io/should_run/io017.stdout with 100% similarity]
ghc/tests/lib/IO/hGetLine001.hs [new file with mode: 0644]
ghc/tests/lib/IO/hGetLine001.stdout [new file with mode: 0644]
ghc/tests/lib/IO/hGetPosn001.hs [moved from ghc/tests/io/should_run/io008.hs with 73% similarity]
ghc/tests/lib/IO/hGetPosn001.in [moved from ghc/tests/io/should_run/io008.in with 100% similarity]
ghc/tests/lib/IO/hGetPosn001.stdout [moved from ghc/tests/io/should_run/io008.stdout with 100% similarity]
ghc/tests/lib/IO/hIsEOF001.hs [moved from ghc/tests/io/should_run/io027.hs with 86% similarity]
ghc/tests/lib/IO/hIsEOF001.stdout [moved from ghc/tests/io/should_run/io027.stdout with 100% similarity]
ghc/tests/lib/IO/hIsEOF002.hs [new file with mode: 0644]
ghc/tests/lib/IO/hIsEOF002.stdout [new file with mode: 0644]
ghc/tests/lib/IO/hReady001.hs [new file with mode: 0644]
ghc/tests/lib/IO/hSeek001.hs [new file with mode: 0644]
ghc/tests/lib/IO/hSeek001.in [moved from ghc/tests/io/should_run/io013.in with 100% similarity]
ghc/tests/lib/IO/hSeek001.stdout [new file with mode: 0644]
ghc/tests/lib/IO/hSeek002.hs [moved from ghc/tests/io/should_run/io025.hs with 90% similarity]
ghc/tests/lib/IO/hSeek002.stdout [moved from ghc/tests/io/should_run/io025.stdout with 100% similarity]
ghc/tests/lib/IO/hSeek003.hs [moved from ghc/tests/io/should_run/io030.hs with 97% similarity]
ghc/tests/lib/IO/hSeek003.stdout [moved from ghc/tests/io/should_run/io030.stdout with 100% similarity]
ghc/tests/lib/IO/hSeek004.hs [new file with mode: 0644]
ghc/tests/lib/IO/hSeek004.stdout [new file with mode: 0644]
ghc/tests/lib/IO/hSetBuffering002.hs [moved from ghc/tests/io/should_run/io021.hs with 100% similarity]
ghc/tests/lib/IO/hSetBuffering002.stdout [moved from ghc/tests/io/should_run/io021.stdout with 100% similarity]
ghc/tests/lib/IO/hSetBuffering003.hs [moved from ghc/tests/io/should_run/io028.hs with 100% similarity]
ghc/tests/lib/IO/hSetBuffering003.stderr [moved from ghc/tests/io/should_run/io028.stderr with 100% similarity]
ghc/tests/lib/IO/hSetBuffering003.stdout [moved from ghc/tests/io/should_run/io028.stdout with 100% similarity]
ghc/tests/lib/IO/ioeGetErrorString001.hs [new file with mode: 0644]
ghc/tests/lib/IO/ioeGetErrorString001.stdout [new file with mode: 0644]
ghc/tests/lib/IO/ioeGetFileName001.hs [new file with mode: 0644]
ghc/tests/lib/IO/ioeGetFileName001.stdout [new file with mode: 0644]
ghc/tests/lib/IO/ioeGetHandle001.hs [new file with mode: 0644]
ghc/tests/lib/IO/ioeGetHandle001.stdout [new file with mode: 0644]
ghc/tests/lib/IO/isEOF001.hs [new file with mode: 0644]
ghc/tests/lib/IO/isEOF001.stdout [moved from ghc/tests/io/should_run/io020.stdout with 100% similarity]
ghc/tests/lib/IO/misc001.hs [new file with mode: 0644]
ghc/tests/lib/IO/misc001.stdout [moved from ghc/tests/io/should_run/io004.stdout with 100% similarity]
ghc/tests/lib/IO/openFile001.hs [new file with mode: 0644]
ghc/tests/lib/IO/openFile001.stdout [new file with mode: 0644]
ghc/tests/lib/IO/openFile002.hs [new file with mode: 0644]
ghc/tests/lib/IO/openFile002.stderr [new file with mode: 0644]
ghc/tests/lib/IO/openFile003.hs [new file with mode: 0644]
ghc/tests/lib/IO/openFile003.stdout [new file with mode: 0644]
ghc/tests/lib/IO/openFile004.hs [new file with mode: 0644]
ghc/tests/lib/IO/openFile004.stdout [new file with mode: 0644]
ghc/tests/lib/IO/openFile005.hs [new file with mode: 0644]
ghc/tests/lib/IO/openFile005.stdout [new file with mode: 0644]
ghc/tests/lib/IO/openFile006.hs [new file with mode: 0644]
ghc/tests/lib/IO/openFile006.stdout [new file with mode: 0644]
ghc/tests/lib/IO/putStr001.hs [moved from ghc/tests/io/should_run/io023.hs with 66% similarity]
ghc/tests/lib/IO/putStr001.stdout [moved from ghc/tests/io/should_run/io001.stdout with 100% similarity]
ghc/tests/lib/IO/readwrite001.hs [moved from ghc/tests/io/should_run/io031.hs with 70% similarity]
ghc/tests/lib/IO/readwrite001.stdout [moved from ghc/tests/io/should_run/io031.stdout with 100% similarity]
ghc/tests/lib/IO/readwrite002.hs [moved from ghc/tests/io/should_run/io018.hs with 88% similarity]
ghc/tests/lib/IO/readwrite002.stdout [new file with mode: 0644]
ghc/tests/lib/IOExts/echo001.hs [moved from ghc/tests/io/should_run/io022.hs with 100% similarity]
ghc/tests/lib/IOExts/echo001.stdout [moved from ghc/tests/io/should_run/io022.stdout with 100% similarity]
ghc/tests/lib/IOExts/trace001.hs [moved from ghc/tests/io/should_run/io032.hs with 100% similarity]
ghc/tests/lib/IOExts/trace001.stderr [moved from ghc/tests/io/should_run/io032.stderr with 100% similarity]
ghc/tests/lib/IOExts/trace001.stdout [moved from ghc/tests/io/should_run/io032.stdout with 100% similarity]
ghc/tests/lib/System/Makefile [moved from ghc/tests/io/should_run/Makefile with 100% similarity]
ghc/tests/lib/System/exitWith001.hs [moved from ghc/tests/io/should_run/io004.hs with 100% similarity]
ghc/tests/lib/System/exitWith001.stdout [moved from ghc/tests/io/should_run/io015.stdout with 100% similarity]
ghc/tests/lib/System/getArgs001.hs [moved from ghc/tests/io/should_run/io003.hs with 100% similarity]
ghc/tests/lib/System/getArgs001.stdout [moved from ghc/tests/io/should_run/io003.stdout with 100% similarity]
ghc/tests/lib/System/getArgs001.stdout-mingw [moved from ghc/tests/io/should_run/io003.stdout-mingw with 100% similarity]
ghc/tests/lib/System/getEnv001.hs [moved from ghc/tests/io/should_run/io002.hs with 100% similarity]
ghc/tests/lib/System/getEnv001.stdout [moved from ghc/tests/io/should_run/io002.stdout with 100% similarity]
ghc/tests/lib/System/system001.hs [moved from ghc/tests/io/should_run/io005.hs with 100% similarity]
ghc/tests/lib/System/system001.stdout [moved from ghc/tests/io/should_run/io005.stdout with 100% similarity]
ghc/tests/lib/Time/time001.hs [moved from ghc/tests/lib/should_run/time001.hs with 100% similarity]
ghc/tests/lib/Time/time001.stdout [moved from ghc/tests/lib/should_run/time001.stdout with 100% similarity]
ghc/tests/lib/Time/time002.hs [moved from ghc/tests/lib/should_run/time002.hs with 100% similarity]
ghc/tests/lib/Time/time002.stdout [moved from ghc/tests/lib/should_run/time002.stdout with 100% similarity]
ghc/tests/lib/Time/time003.hs [moved from ghc/tests/io/should_run/io019.hs with 100% similarity]
ghc/tests/lib/Time/time003.stdout [moved from ghc/tests/io/should_run/io019.stdout with 100% similarity]
ghc/tests/lib/Time/time004.hs [moved from ghc/tests/io/should_run/io020.hs with 100% similarity]
ghc/tests/lib/Time/time004.stdout [moved from ghc/tests/io/should_run/io026.stdout with 100% similarity]