aboutsummaryrefslogtreecommitdiff
path: root/sys/qpoe/qpiowb.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/qpoe/qpiowb.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'sys/qpoe/qpiowb.x')
-rw-r--r--sys/qpoe/qpiowb.x131
1 files changed, 131 insertions, 0 deletions
diff --git a/sys/qpoe/qpiowb.x b/sys/qpoe/qpiowb.x
new file mode 100644
index 00000000..42f6ccc2
--- /dev/null
+++ b/sys/qpoe/qpiowb.x
@@ -0,0 +1,131 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <mach.h>
+include <fset.h>
+include "qpoe.h"
+include "qpio.h"
+
+# QPIO_WBUCKET -- Flush any data currently in the bucket to the datafile,
+# and set up the buffer to receive data for the bucket BKNO. The min/max
+# event structs are updated whenever a bucket is written to disk. IO_EVI
+# is assumed to point to the event following the last event written into
+# in the buffer. Data should always be written sequentially.
+
+procedure qpio_wbucket (io, evi)
+
+pointer io #I QPIO descriptor
+int evi #I evi of next bucket on exit
+
+pointer min_ev[2], max_ev[2], ev, fp, mp, dd
+int sz_event, offset, dtype, nb, flen, nchars, i, j, k
+int fstati()
+
+begin
+ dd = IO_DD(io)
+
+ # Write the current bucket to the datafile if nonempty.
+ if (dd != NULL && IO_EVI(io) > IO_BKFIRSTEV(io)) {
+ # Scan through the events in the bucket and update the min/max
+ # event structs for the event list ([1] below) and for the
+ # bucket ([2] below, stored at the end of the bucket).
+ # Use CHAR pointers to facilitate pointer conversions.
+
+ min_ev[1] = (IO_MINEVL(io) - 1) * SZ_SHORT + 1
+ min_ev[2] = (IO_MINEVB(io) - 1) * SZ_SHORT + 1
+ max_ev[1] = (IO_MAXEVL(io) - 1) * SZ_SHORT + 1
+ max_ev[2] = (IO_MAXEVB(io) - 1) * SZ_SHORT + 1
+ sz_event = DD_STRUCTLEN(dd) * SZ_STRUCT
+
+ do k = 1, 2 {
+ ev = (IO_BP(io) - 1) * SZ_SHORT + 1
+ # If min/max of bucket or first bucket of event list...
+ if (k == 2 || IO_BKNO(io) == 1) {
+ call amovc (Memc[ev], Memc[min_ev[k]], sz_event)
+ call amovc (Memc[ev], Memc[max_ev[k]], sz_event)
+ }
+
+ do j = 1, IO_EVI(io) - IO_BKFIRSTEV(io) {
+ do i = 1, DD_NFIELDS(dd) {
+ # Get the typed offset and datatype of the field.
+ offset = DD_FOFFSET(dd,i)
+ dtype = DD_FTYPE(dd,i)
+
+ # Update the min/max entries for the field.
+ switch (dtype) {
+ case TY_SHORT:
+ fp = (ev - 1) / SZ_SHORT + 1 + offset
+ mp = (min_ev[k] - 1) / SZ_SHORT + 1 + offset
+ if (Mems[fp] < Mems[mp])
+ Mems[mp] = Mems[fp]
+ mp = (max_ev[k] - 1) / SZ_SHORT + 1 + offset
+ if (Mems[fp] > Mems[mp])
+ Mems[mp] = Mems[fp]
+
+ case TY_INT, TY_LONG:
+ fp = (ev - 1) / SZ_INT + 1 + offset
+ mp = (min_ev[k] - 1) / SZ_INT + 1 + offset
+ if (Memi[fp] < Memi[mp])
+ Memi[mp] = Memi[fp]
+ mp = (max_ev[k] - 1) / SZ_INT + 1 + offset
+ if (Memi[fp] > Memi[mp])
+ Memi[mp] = Memi[fp]
+
+ case TY_REAL:
+ fp = (ev - 1) / SZ_REAL + 1 + offset
+ mp = (min_ev[k] - 1) / SZ_REAL + 1 + offset
+ if (Memr[fp] < Memr[mp])
+ Memr[mp] = Memr[fp]
+ mp = (max_ev[k] - 1) / SZ_REAL + 1 + offset
+ if (Memr[fp] > Memr[mp])
+ Memr[mp] = Memr[fp]
+
+ case TY_DOUBLE:
+ fp = (ev - 1) / SZ_DOUBLE + 1 + offset
+ mp = (min_ev[k] - 1) / SZ_DOUBLE + 1 + offset
+ if (Memd[fp] < Memd[mp])
+ Memd[mp] = Memd[fp]
+ mp = (max_ev[k] - 1) / SZ_DOUBLE + 1 + offset
+ if (Memd[fp] > Memd[mp])
+ Memd[mp] = Memd[fp]
+ }
+ }
+
+ ev = ev + sz_event
+ }
+ }
+
+ # Zero out any remaining events.
+ while (ev < min_ev[2]) {
+ call aclrc (Memc[ev], sz_event)
+ ev = ev + sz_event
+ }
+
+ # Write the bucket.
+ nb = IO_SZBBUCKET(io)
+ offset = (IO_BKNO(io) - 1) * nb + IO_FBOFF(io)
+ call fm_lfawrite (IO_CHAN(io), Mems[IO_BP(io)], nb, offset)
+ call fm_lfawait (IO_CHAN(io), nb)
+
+ # Update the file size.
+ flen = fstati (IO_FD(io), F_FILESIZE)
+ nchars = (offset + nb) / SZB_CHAR
+ if (nchars > flen)
+ call fseti (IO_FD(io), F_FILESIZE, nchars)
+
+ # Increment the total event count.
+ IO_NEVENTS(io) = max (IO_NEVENTS(io), IO_EVI(io) - 1)
+ S_NELEM(IO_PSYM(io)) = IO_NEVENTS(io)
+ QP_MODIFIED(IO_QP(io)) = YES
+ }
+
+ # Set up the buffer for the new bucket.
+ IO_BKNO(io) = EVI_TO_BUCKET(io,evi)
+ IO_BKFIRSTEV(io) = BUCKET_TO_EVI(io,IO_BKNO(io))
+ IO_BKLASTEV(io) = IO_BKFIRSTEV(io) + IO_BUCKETLEN(io) - 1
+
+ if (IO_DEBUG(io) > 2) {
+ call eprintf ("wbucket: evi=%d, bkno=%d\n")
+ call pargi(evi)
+ call pargi(IO_BKNO(io))
+ }
+end