2 * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
4 * $Id: flushFile.c,v 1.7 2000/04/12 17:33:16 simonmar Exp $
6 * hFlush Runtime Support
13 flushFile(StgForeignPtr ptr)
15 IOFileObject* fo = (IOFileObject*)ptr;
18 if ( (fo->flags & FILEOBJ_WRITE) && FILEOBJ_NEEDS_FLUSHING(fo) ) {
19 rc = writeBuffer(ptr,fo->bufWPtr - fo->bufRPtr);
26 flushBuffer(StgForeignPtr ptr)
28 IOFileObject* fo = (IOFileObject*)ptr;
31 /* If the file object is writeable, or if it's
32 RW *and* the last operation on it was a write,
35 if ( (!FILEOBJ_READABLE(fo) && FILEOBJ_WRITEABLE(fo)) ||
36 (FILEOBJ_RW(fo) && FILEOBJ_JUST_WRITTEN(fo)) ) {
41 /* TODO: shouldn't we do the lseek stuff from flushReadBuffer
45 /* Reset read & write pointer for input buffers */
46 if ( (fo->flags & FILEOBJ_READ) ) {
54 For RW file objects, flushing input buffers doesn't just involve
55 resetting the read & write pointers, we also have to change the
56 underlying file position to point to the effective read position.
58 (Sigh, I now understand the real reason for why stdio opted for
59 the solution of leaving this to the programmer!)
62 flushReadBuffer(StgForeignPtr ptr)
64 IOFileObject* fo = (IOFileObject*)ptr;
67 delta = fo->bufWPtr - fo->bufRPtr;
70 while ( lseek(fo->fd, -delta, SEEK_CUR) == -1) {
85 flushConnectedBuf(StgForeignPtr ptr)
88 IOFileObject* fo = (IOFileObject*)ptr;
90 /* if the stream is connected to an output stream, flush it. */
91 if ( fo->connectedTo != NULL && fo->connectedTo->fd != -1 &&
92 (fo->connectedTo->flags & FILEOBJ_WRITE) ) {
93 rc = flushBuffer((StgForeignPtr)fo->connectedTo);
95 /* Willfully ignore the return code for now. */