diff options
author | simonmar <unknown> | 1999-11-25 16:54:15 +0000 |
---|---|---|
committer | simonmar <unknown> | 1999-11-25 16:54:15 +0000 |
commit | 0086477cfe554f9c65ae4c2f1e4e19f4e8c063eb (patch) | |
tree | 506ffebc9496dc64bbc5cf129eea5c2ebbd533c6 /ghc/lib/std/cbits/openFile.c | |
parent | 63b4f50cfaa383118c947445e5afb4fff3cd1c91 (diff) | |
download | haskell-0086477cfe554f9c65ae4c2f1e4e19f4e8c063eb.tar.gz |
[project @ 1999-11-25 16:54:14 by simonmar]
Incremental cleanups & improvements to the I/O subsystem
- Initial fix for problems caused by partial writes
to non-blocking file descriptors. To see this bug,
run ghc/tests/programs/life_space_leak through a pipe.
- remove FILEOBJ_FLUSH, it allegedly has the same meaning
as FILEOBJ_WRITE. This fixes a buf in openFd: it erroneously didn't
set FILEOBJ_FLUSH on writeable file descriptors.
- some ANSIfication
Diffstat (limited to 'ghc/lib/std/cbits/openFile.c')
-rw-r--r-- | ghc/lib/std/cbits/openFile.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/ghc/lib/std/cbits/openFile.c b/ghc/lib/std/cbits/openFile.c index 2491b179ac..d1b0d6d53e 100644 --- a/ghc/lib/std/cbits/openFile.c +++ b/ghc/lib/std/cbits/openFile.c @@ -1,7 +1,7 @@ /* * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998 * - * $Id: openFile.c,v 1.10 1999/09/30 12:35:04 sof Exp $ + * $Id: openFile.c,v 1.11 1999/11/25 16:54:14 simonmar Exp $ * * openFile Runtime Support */ @@ -47,7 +47,7 @@ StgInt rd; fo->buf = NULL; fo->bufWPtr = 0; fo->bufRPtr = 0; - fo->flags = FILEOBJ_STD | ( rd ? FILEOBJ_READ : (FILEOBJ_WRITE | FILEOBJ_FLUSH)); + fo->flags = FILEOBJ_STD | ( rd ? FILEOBJ_READ : FILEOBJ_WRITE); fo->connectedTo = NULL; /* MS Win32 CRT doesn't support fcntl() -- the workaround is to @@ -96,11 +96,11 @@ StgInt binary; case OPENFILE_APPEND: oflags = O_NONBLOCK | O_WRONLY | O_NOCTTY | O_APPEND; for_writing = 1; - flags |= FILEOBJ_WRITE | FILEOBJ_FLUSH; + flags |= FILEOBJ_WRITE; break; case OPENFILE_WRITE: oflags = O_NONBLOCK | O_WRONLY | O_NOCTTY; - flags |= FILEOBJ_WRITE | FILEOBJ_FLUSH; + flags |= FILEOBJ_WRITE; for_writing = 1; break; case OPENFILE_READ_ONLY: @@ -110,7 +110,7 @@ StgInt binary; break; case OPENFILE_READ_WRITE: oflags = O_NONBLOCK | O_RDWR | O_NOCTTY; - flags |= FILEOBJ_READ | FILEOBJ_WRITE | FILEOBJ_FLUSH; + flags |= FILEOBJ_READ | FILEOBJ_WRITE; for_writing = 1; break; default: @@ -280,6 +280,7 @@ StgInt binary; fo->fd = fd; fo->buf = NULL; + fo->bufStart = 0; fo->bufWPtr = 0; fo->bufRPtr = 0; fo->flags = flags; @@ -289,10 +290,7 @@ StgInt binary; /* `Lock' file descriptor and return file object. */ IOFileObject* -openFd(fd,oflags,flags) -StgInt fd; -StgInt oflags; -StgInt flags; +openFd(StgInt fd,StgInt oflags,StgInt flags) { int for_writing; FILE* fp; @@ -318,11 +316,12 @@ StgInt flags; /* See openFileObject() comment */ if ((fo = malloc(sizeof(IOFileObject))) == NULL) return NULL; - fo->fd = fd; - fo->buf = NULL; - fo->bufWPtr = 0; - fo->bufRPtr = 0; - fo->flags = flags | ( oflags & O_RDONLY ? FILEOBJ_READ + fo->fd = fd; + fo->buf = NULL; + fo->bufStart = 0; + fo->bufWPtr = 0; + fo->bufRPtr = 0; + fo->flags = flags | ( oflags & O_RDONLY ? FILEOBJ_READ : oflags & O_RDWR ? FILEOBJ_READ : 0) | ( oflags & O_WRONLY ? FILEOBJ_WRITE |