diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /sys/fmio/fmioextnd.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'sys/fmio/fmioextnd.x')
-rw-r--r-- | sys/fmio/fmioextnd.x | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/sys/fmio/fmioextnd.x b/sys/fmio/fmioextnd.x new file mode 100644 index 00000000..0517eb93 --- /dev/null +++ b/sys/fmio/fmioextnd.x @@ -0,0 +1,82 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <syserr.h> +include <mach.h> +include "fmio.h" + +# FMIO_EXTEND -- Allocate new pages in the datafile. Allocate the new pages +# and modify the in-core page table and lfile pagemap accordingly. The PTI is +# not modified, allocating new pages to store the page table itself, until +# fm_sync is called. The page number of the first page allocated is returned +# as the function value (a contiguous sequence of pages will be allocated). + +int procedure fmio_extend (fm, lfile, npages) + +pointer fm #I FMIO descriptor +int lfile #I lfile getting the new pages +int npages #I number of pages to add + +pointer pt, pm, lf +int npte_perpage, npti +int inc, np, p1, p2, l1, l2, i +int krealloc() + +begin + # Extend the global page table. + p1 = FM_PTNPTE(fm) + 1 + p2 = p1 + npages - 1 + + # Make sure we have enough page table index entries for the new pages. + if (lfile != PT_LFILE) { + npte_perpage = FM_SZBPAGE(fm) / (SZB_CHAR*SZ_SHORT) + np = p2 + FM_PTILEN(fm) + npti = (np + npte_perpage-1) / npte_perpage + if (npti > FM_PTILEN(fm)) { + call fmio_posterr (fm, SYS_FMPTIOVFL, FM_DFNAME(fm)) + return (ERR) + } + } + + # Increase the size of the in-core page table if necessary. + if (p2 > FM_PTLEN(fm)) { + inc = FM_SZBPAGE(fm) / (SZ_SHORT * SZB_CHAR) + FM_PTLEN(fm) = ((p2 + inc-1) / inc) * inc + if (krealloc (FM_PTABLE(fm), FM_PTLEN(fm), TY_SHORT) == ERR) + return (ERR) + } + + # Add the pages to the global page table. + FM_PTNPTE(fm) = p2 + pt = FM_PTABLE(fm) + do i = p1, p2 + Mems[pt+i-1] = lfile + + lf = FM_FTABLE(fm) + lfile * LEN_FTE + pm = LF_PAGEMAP(lf) + + # Extend the lfile page table if the lfile is active. + if (pm != NULL) { + l1 = LF_NPAGES(lf) + 1 + l2 = l1 + npages - 1 + + # Increase the size of the lfile pagemap if necessary. + if (l2 > LF_PMLEN(lf)) { + LF_PMLEN(lf) = (l2 + INC_PMLEN-1) / INC_PMLEN * INC_PMLEN + if (krealloc (LF_PAGEMAP(lf), LF_PMLEN(lf), TY_INT) == ERR) + return (ERR) + pm = LF_PAGEMAP(lf) + } + + # Add the pages to the lfile page table. + LF_NPAGES(lf) = l2 + do i = l1, l2 + Memi[pm+i-1] = p1 + i - l1 + } + + # Update the FTE for lfile zero (the page table file). + lf = FM_FTABLE(fm) + LF_FSIZE(lf) = FM_PTNPTE(fm) * SZ_SHORT * SZB_CHAR + + FM_DHMODIFIED(fm) = YES + return (p1) +end |