diff --git a/ghc/lib/cbits/freeFile.lc b/ghc/lib/cbits/freeFile.lc new file mode 100644 index 0000000000000000000000000000000000000000..5c780769460d7cef873d637c459e603d0540d40e --- /dev/null +++ b/ghc/lib/cbits/freeFile.lc @@ -0,0 +1,52 @@ +% +% (c) The GRASP/AQUA Project, Glasgow University, 1997 +% +\subsection[freeFile.lc]{Giving up files} + +\begin{code} + +#include "rtsdefs.h" +#include "stgio.h" + +/* sigh, the standard channels are handled differently, + we don't want them freed via the ForeignObj finaliser, + as we probably want to use these channels before we + *really* shutdown (dumping stats etc.) +*/ +void freeStdChannel(fp) +StgForeignObj fp; +{ return; } + +void freeFile(fp) +StgForeignObj fp; +{ + int rc; + + if ( fp == NULL || (rc = unlockFile(fileno((FILE *)fp))) ) { + /* If the file handle has been explicitly closed + * (via closeFile()) or freed, we will have given + * up our process lock, so we silently return here. + */ + return; + } + + /* + * The finaliser for the FILEs embedded in Handles. The RTS + * assumes that the finaliser runs without problems, so all + * we can do here is fclose(), and hope nothing went wrong. + * + * Assume fclose() flushes output stream. + */ + + rc = fclose((FILE *)fp); + /* Error or no error, we don't care.. */ + + /* + if ( rc == EOF ) { + fprintf(stderr. "Warning: file close ran into trouble\n"); + } + */ + + return; +} +\end{code}