aboutsummaryrefslogtreecommitdiff
path: root/sys/fio/fioclean.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /sys/fio/fioclean.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'sys/fio/fioclean.x')
-rw-r--r--sys/fio/fioclean.x130
1 files changed, 130 insertions, 0 deletions
diff --git a/sys/fio/fioclean.x b/sys/fio/fioclean.x
new file mode 100644
index 00000000..4b4671a3
--- /dev/null
+++ b/sys/fio/fioclean.x
@@ -0,0 +1,130 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <config.h>
+include <fset.h>
+include <error.h>
+include <fio.h>
+
+# FIO_CLEANUP -- Clean up FIO after a crash, or upon normal termination of
+# a task. Flush all open files (harmless on read only files, closed files).
+# Close all open user files, unless the KEEP flag bit is set. Delete any
+# partial new files, and all temporary files. Since this routine is called
+# during error restart, convert any errors into warning messages to avoid an
+# infinite loop.
+
+procedure fio_cleanup (status)
+
+int status
+
+int fd
+bool stddev
+int mode, ref_count
+include <fio.com>
+errchk close
+
+begin
+ call flush (STDERR)
+ call fio_qflush (STDOUT, status)
+ call fio_qflush (STDGRAPH, status)
+ call fio_qflush (STDIMAGE, status)
+ call fio_qflush (STDPLOT, status)
+
+ for (fd=1; fd < FIRST_FD; fd=fd+1) {
+ # Cancel any pushback on the standard streams.
+ if (and (fflags[fd], FF_PUSHBACK) != 0)
+ call fcanpb (fd)
+
+ # If any of the standard streams have been redirected locally (>0),
+ # cancel the redirection and close the redirection files.
+ # If streams were redirected by parent (<0), cancel the flag as
+ # the duration of the flag is only until task termination.
+
+ if (redir_fd[fd] > 0) {
+ iferr (call close (fd))
+ ;
+ } else if (redir_fd[fd] < 0)
+ redir_fd[fd] = 0
+ }
+
+ # Restore the default no flush on newline attribute to STDOUT.
+ call fseti (STDOUT, F_FLUSHNL, NO)
+
+ # Delete any files opened TEMP_FILE during program execution.
+ iferr (call frmtmp())
+ call erract (EA_WARN)
+
+ # Close all open user files unless the F_KEEP (keep open) flag has
+ # been set.
+
+ for (fd=FIRST_FD; fd <= LAST_FD; fd=fd+1) {
+ fp = fiodes[fd]
+
+ if (fp != NULL) { # file open?
+ # Do nothing if file is to be kept open.
+ if (and (FF_KEEP, fflags[fd]) != 0)
+ next
+
+ # Do not try to flush the output of a string file, or it
+ # will cause error recursion. The mode of the string file
+ # is reset to READ_ONLY to avoid writing the EOS at the end
+ # of the string buffer, as if the file is being closed during
+ # cleanup following task termination (which should not
+ # normally be the case) the buffer may no longer exist.
+
+ if (FTYPE(fp) == STRING_FILE) {
+ call strsetmode (fd, READ_ONLY)
+ call close (fd)
+ next
+ } else if (FTYPE(fp) == SPOOL_FILE) {
+ call close (fd)
+ next
+ }
+
+ iferr (call fio_qflush (fd, status))
+ call erract (EA_WARN) # keep open?
+
+ stddev = (FDEV(fp)==TX_DRIVER || FDEV(fp)==BF_DRIVER)
+ call strcpy (FNAME(fp), pathname, SZ_PATHNAME)
+ ref_count = FREFCNT(fp) - 1
+ mode = FMODE(fp)
+
+ iferr {
+ call close (fd)
+
+ # Delete any new files that have been only partially
+ # written into.
+
+ if (stddev && mode == NEW_FILE && ref_count <= 0)
+ call delete (pathname)
+ } then
+ call erract (EA_WARN)
+ }
+ }
+end
+
+
+# FIO_QFLUSH -- If cleanup is being performed following normal task completion
+# (status is OK), flush any buffered output to file. If cleanup occurs during
+# error restart, cancel any buffered output.
+
+procedure fio_qflush (fd, status)
+
+int fd, status
+pointer bp
+include <fio.com>
+
+begin
+ if (status == OK) {
+ # Flush any buffered output.
+ call flush (fd)
+
+ } else {
+ # Cancel any buffered output.
+ call fcanpb (fd)
+
+ bp = bufptr[fd]
+ itop[fd] = bp
+ otop[fd] = bp
+ iop[fd] = bp
+ }
+end