home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 November / VPR9811A.BIN / BENCH / CWSDPMI2 / CWSDPMI2.LZH / SRC.LZH / DALLOC.C < prev    next >
C/C++ Source or Header  |  1996-07-25  |  4KB  |  165 lines

  1. /* Copyright (C) 1995,1996 CW Sandmann (sandmann@clio.rice.edu) 1206 Braelinn, Sugarland, TX 77479
  2. ** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  3. **
  4. ** This file is distributed under the terms listed in the document
  5. ** "copying.cws", available from CW Sandmann at the address above.
  6. ** A copy of "copying.cws" should accompany this file; if not, a copy
  7. ** should be available from where this file was obtained.  This file
  8. ** may not be distributed without a verbatim copy of "copying.cws".
  9. **
  10. ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
  11. ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. */
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <dos.h>
  17. #include <io.h>
  18. #include <string.h>
  19.  
  20. #include "gotypes.h"
  21. #include "dalloc.h"
  22. #include "control.h"
  23.  
  24. #define DA_FREE    0
  25. #define DA_USED    1
  26.  
  27. static word8 map[MAX_DARRAY];
  28. static da_pn first_avail;
  29. static int dfile = -1;
  30. static da_pn disk_used,disk_max;
  31. static word16 paging_pid;
  32.  
  33. static void dset(da_pn i, int b)
  34. {
  35.   unsigned o;
  36.   word8 m;
  37.   o = (unsigned)(i>>3);
  38.   m = 1<<((unsigned)i&7);
  39.   if (b)
  40.     map[o] |= m;
  41.   else
  42.     map[o] &= ~m;
  43. }
  44.  
  45. static word8 dtest(da_pn i)
  46. {
  47.   unsigned o;
  48.   word8 m;
  49.   o = (unsigned)(i>>3);
  50.   m = 1<<((unsigned)i&7);
  51.   return map[o] & m;
  52. }
  53.  
  54. static char* dfilename;
  55.  
  56. void dalloc_file(char *swapname)
  57. {
  58.   dfilename = swapname;
  59. }
  60.  
  61. void dalloc_init(void)
  62. {
  63.   memset(map, 0, sizeof(map));
  64.   disk_used = disk_max = 0;
  65.   first_avail = MAX_DBLOCK + 1;        /* If no paging */
  66.   if(!dfilename || !dfilename[0]) {
  67.     SHOW_MEM_INFO("  No Paging.\n", 0);
  68.     return;
  69.   }
  70.   dfile = _creat(dfilename, 0);
  71.   paging_pid = get_pid();
  72.   if (dfile < 0)
  73.     errmsg("Warning: cannot open swap file %s\n", dfilename);
  74.   else
  75.     first_avail = 0;
  76.   SHOW_MEM_INFO("  Swap space: %ld Kb\n", (dalloc_max_size() * 4L));
  77. }
  78.  
  79. void dalloc_uninit(void)
  80. {
  81.   word16 save_pid = get_pid();
  82.   if (dfile < 0)
  83.     return;
  84.   set_pid(paging_pid);
  85.   _close(dfile);
  86.   set_pid(save_pid);
  87.   dfile = -1;
  88.   unlink(dfilename);
  89. }
  90.  
  91. da_pn dalloc(void)
  92. {
  93.   da_pn pn;
  94.   for (pn=first_avail; pn<=MAX_DBLOCK; pn++)
  95.     if (dtest(pn) == DA_FREE) {
  96.       dset(pn, DA_USED);
  97.       first_avail = pn+1;
  98.       if(first_avail > disk_max)
  99.         disk_max = first_avail;        /* pn+1 since zero based */
  100.       disk_used++;
  101.       return pn;
  102.     }
  103.   errmsg("No swap space!\n");
  104.   cleanup(1);
  105.   return 0;
  106. }
  107.  
  108. void dfree(da_pn pn)
  109. {
  110.   dset(pn, DA_FREE);
  111.   if (pn < first_avail)
  112.     first_avail = pn;
  113.   disk_used--;
  114. }
  115.  
  116. da_pn dalloc_max_size(void)
  117. {
  118.   word32 fr;
  119.   word16 ax,bx,cx;
  120.   if (dfile < 0)
  121.     return 0;
  122.   _DL = dfilename[0] & 0x1f;
  123.   _AH = 0x36;
  124.   geninterrupt(0x21);
  125.   ax = _AX;        /* Sectors per cluster */
  126.   bx = _BX;        /* Number of available clusters */
  127.   cx = _CX;        /* bytes per sector */
  128.   if (ax == 0xffff)
  129.     return 0;
  130.   fr = (word32)(ax * cx) * (word32)bx;
  131.   fr >>= 12;
  132.   fr += (unsigned long)disk_max;
  133.   if (fr > MAX_DBLOCK)
  134.     fr = MAX_DBLOCK;
  135.   return (da_pn)fr;
  136. }
  137.  
  138. da_pn dalloc_used(void)
  139. {
  140.   return (da_pn)disk_used;
  141. }
  142.  
  143. void dwrite(word8 *buf, da_pn block)
  144. {
  145.   int c;
  146.   word16 save_pid = get_pid();
  147.   set_pid(paging_pid);
  148.   lseek(dfile, (long)block << 12, 0);
  149.   c = _write(dfile, buf, 4096);
  150.   set_pid(save_pid);
  151.   if (c < 4096) {
  152.     errmsg("Swap disk full!\n");
  153.     cleanup(1);
  154.   }
  155. }
  156.  
  157. void dread(word8 *buf, da_pn block)
  158. {
  159.   word16 save_pid = get_pid();
  160.   set_pid(paging_pid);
  161.   lseek(dfile, (long)block << 12, 0);
  162.   _read(dfile, buf, 4096);
  163.   set_pid(save_pid);
  164. }
  165.