% % (c) The GRASP/AQUA Project, Glasgow University, 1997 % \subsection[freeFile.lc]{Giving up files} \begin{code} #include "rtsdefs.h" #include "stgio.h" /* sigh, the FILEs attached to the standard descriptors are handled differently. We don't want them freed via the ForeignObj finaliser, as we probably want to use these before we *really* shut down (dumping stats etc.) */ void freeStdFile(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}