home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / mslang / vm / src / vmdisk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-15  |  4.0 KB  |  185 lines

  1. /***
  2. * vmdisk.c -
  3. *
  4. *       Copyright (c) 1989-1992, Microsoft Corporation.  All rights reserved.
  5. *
  6. *Purpose:
  7. *
  8. * PRIVATE Functions:
  9. *
  10. *       VmInitializeDisk:
  11. *
  12. *       VmTerminateDisk:
  13. *
  14. *       FVmAllocateDiskPage:
  15. *
  16. *       VmSwapInDiskPage:
  17. *
  18. *       VmSwapOutDiskPage:
  19. *
  20. *       VmAddFreeDisk:
  21. *
  22. *       VmGetFreeDisk:
  23. *
  24. *       VmStoreFD:
  25. *
  26. *       VmLoadFD:
  27. *
  28. *******************************************************************************/
  29.  
  30. #pragma title("Virtual Memory Manager")
  31. #pragma subtitle("DOS Disk swapping support")
  32.  
  33. #include <version.h>
  34. #include <vmassert.h>
  35. #include <system.h>
  36. #include <error.h>
  37. #include <vm.h>
  38. #include <vmp.h>
  39. #include <vmlist.h>
  40.  
  41. extern char     _near _fVmDisableDisk = FALSE;
  42. extern int      _near _fhVm = 0;
  43. static long     _near cbVmDisk;
  44.  
  45. // disk free list variables
  46. PFBD _pfbdDiskHead;                             // head of free list
  47. PFBD _pfbdDiskCurr;                             // current item in circular list
  48. unsigned long _cDiskPageMax;    // count of pages in max size free disk block
  49.  
  50.  
  51. #if     VMPROFILE
  52.  
  53. unsigned long  _near _cVmSwapInDisk;
  54. unsigned long  _near _cVmSwapOutDisk;
  55.  
  56. #endif
  57.  
  58.  
  59. #pragma page()
  60.  
  61. void PRIVATE __VmInitializeDisk(void)
  62. {
  63.    VmTracePrintf(("VmInitializeDisk\n"));
  64.  
  65. #if     VMPROFILE
  66.    _cVmSwapInDisk = _cVmSwapOutDisk = 0;
  67. #endif
  68.  
  69.     _pfbdDiskHead = pfbdNil;
  70.     _pfbdDiskCurr = pfbdNil;
  71.  
  72.    if (_fVmDisableDisk)
  73.       _fhVm = -1;
  74. }
  75.  
  76.  
  77. #pragma page()
  78.  
  79. void PRIVATE __VmTerminateDisk(void)
  80. {
  81.    VmTracePrintf(("VmTerminateDisk\n"));
  82.  
  83.    VmProfilePrintf(("VmProfile:\t_cVmSwapInDisk = %lu, _cVmSwapOutDisk = %lu\n",
  84.             _cVmSwapInDisk, _cVmSwapOutDisk));
  85.  
  86.    if ((_fhVm != 0) && (_fhVm != -1))
  87.       __VmCloseTemp(_fhVm);
  88.  
  89.    _fhVm = 0;
  90.     __VmFreeFreeBlock(&_pfbdDiskHead, &_pfbdDiskCurr, &_cDiskPageMax);
  91. }
  92.  
  93.  
  94. #pragma page()
  95.  
  96. void PRIVATE __VmCreateDiskSwapFile(void)
  97. {
  98.    Assert(_fhVm == 0);
  99.  
  100.    _fhVm = __VmCreateTemp();
  101.    cbVmDisk = 0;
  102. }
  103.  
  104. #pragma page()
  105.  
  106. int PRIVATE __FVmAllocateDiskPage(PPTE ppte)
  107. {
  108.     VPVOID cbOffset;
  109.  
  110.    Assert(*ppte == 0);
  111.  
  112.    if (_fhVm == 0)                     /* Has swapfile been created? */
  113.       __VmCreateDiskSwapFile();        /* No, try it */
  114.  
  115.    if (_fhVm == -1)                    /* Has swapfile creation failed? */
  116.       return(FALSE);                   /* Yes, can't allocate pages */
  117.  
  118.     if (!__VmGetFreeBlock(&_pfbdDiskHead, &_pfbdDiskCurr, &_cDiskPageMax, 1, &cbOffset))
  119.     {
  120.        if (__FVmExtendTemp(_fhVm, cbVmDisk+cbVmPage))
  121.        return(FALSE);                      /* Can't grow file */
  122.         cbOffset = cbVmDisk;
  123.        cbVmDisk += cbVmPage;
  124.     }
  125.  
  126.    VmTracePrintf(("FVmAllocateDiskPage\n"));
  127.  
  128.    *ppte = cbOffset | fAllocatedPte | fUnreferencedPte | fDiskPte;
  129.  
  130.    VmTracePrintf(("FVmAllocateDiskPage: SwapLocation = %08lX.\n", *ppte & bitSwapPte));
  131.  
  132.    return(TRUE);
  133. }
  134.  
  135. #if     VMFREE
  136.  
  137. void PRIVATE __VmFreeDiskPage(PPTE ppte)
  138. {
  139.    VmTracePrintf(("VmFreeDiskPage: SwapLocation = %08lX.\n", *ppte & bitSwapPte));
  140.  
  141.    Assert((_fhVm != -1) && (_fhVm != 0) && (*ppte & fDiskPte) && !(*ppte & fAllocatedPte));
  142.  
  143.     __VmAddFreeBlock(&_pfbdDiskHead, &_pfbdDiskCurr, &_cDiskPageMax, 1, *ppte & bitSwapPte);
  144.  
  145.    *ppte = 0;
  146. }
  147.  
  148. #endif  /* VMFREE */
  149.  
  150. #pragma page()
  151.  
  152. int PRIVATE __FVmSwapInDiskPage(PTE pte, HPGD hpgd)
  153. {
  154.    VmTracePrintf(("VmSwapInDiskPage:  pPage = %Fp, SwapLocation = %08lX.\n",
  155.           PPageOfHpgd(hpgd), pte & bitSwapPte));
  156.  
  157. #if     VMPROFILE
  158.    _cVmSwapInDisk++;
  159. #endif
  160.  
  161.    Assert(pte & fDiskPte);
  162.  
  163.    return(__FVmReadTemp(_fhVm, pte & bitSwapPte, PPageOfHpgd(hpgd), cbVmPage));
  164. }
  165.  
  166.  
  167. #pragma page()
  168.  
  169. int PRIVATE __FVmSwapOutDiskPage(PTE pte, HPGD hpgd)
  170. {
  171.    VmTracePrintf(("VmSwapOutDiskPage:  vp = %08lX, pPage = %Fp, SwapLocation = %08lX.\n",
  172.           PpgdOfHpgd(hpgd)->vp, PPageOfHpgd(hpgd), pte & bitSwapPte));
  173.  
  174. #if     VMPROFILE
  175.    _cVmSwapOutDisk++;
  176. #endif
  177.  
  178.    Assert(pte & fDiskPte);
  179.  
  180.    return(__FVmWriteTemp(_fhVm, pte & bitSwapPte, PPageOfHpgd(hpgd), cbVmPage));
  181. }
  182.  
  183.  
  184.  
  185.