home *** CD-ROM | disk | FTP | other *** search
- /***
- * vmdisk.c -
- *
- * Copyright (c) 1989-1992, Microsoft Corporation. All rights reserved.
- *
- *Purpose:
- *
- * PRIVATE Functions:
- *
- * VmInitializeDisk:
- *
- * VmTerminateDisk:
- *
- * FVmAllocateDiskPage:
- *
- * VmSwapInDiskPage:
- *
- * VmSwapOutDiskPage:
- *
- * VmAddFreeDisk:
- *
- * VmGetFreeDisk:
- *
- * VmStoreFD:
- *
- * VmLoadFD:
- *
- *******************************************************************************/
-
- #pragma title("Virtual Memory Manager")
- #pragma subtitle("DOS Disk swapping support")
-
- #include <version.h>
- #include <vmassert.h>
- #include <system.h>
- #include <error.h>
- #include <vm.h>
- #include <vmp.h>
- #include <vmlist.h>
-
- extern char _near _fVmDisableDisk = FALSE;
- extern int _near _fhVm = 0;
- static long _near cbVmDisk;
-
- // disk free list variables
- PFBD _pfbdDiskHead; // head of free list
- PFBD _pfbdDiskCurr; // current item in circular list
- unsigned long _cDiskPageMax; // count of pages in max size free disk block
-
-
- #if VMPROFILE
-
- unsigned long _near _cVmSwapInDisk;
- unsigned long _near _cVmSwapOutDisk;
-
- #endif
-
-
- #pragma page()
-
- void PRIVATE __VmInitializeDisk(void)
- {
- VmTracePrintf(("VmInitializeDisk\n"));
-
- #if VMPROFILE
- _cVmSwapInDisk = _cVmSwapOutDisk = 0;
- #endif
-
- _pfbdDiskHead = pfbdNil;
- _pfbdDiskCurr = pfbdNil;
-
- if (_fVmDisableDisk)
- _fhVm = -1;
- }
-
-
- #pragma page()
-
- void PRIVATE __VmTerminateDisk(void)
- {
- VmTracePrintf(("VmTerminateDisk\n"));
-
- VmProfilePrintf(("VmProfile:\t_cVmSwapInDisk = %lu, _cVmSwapOutDisk = %lu\n",
- _cVmSwapInDisk, _cVmSwapOutDisk));
-
- if ((_fhVm != 0) && (_fhVm != -1))
- __VmCloseTemp(_fhVm);
-
- _fhVm = 0;
- __VmFreeFreeBlock(&_pfbdDiskHead, &_pfbdDiskCurr, &_cDiskPageMax);
- }
-
-
- #pragma page()
-
- void PRIVATE __VmCreateDiskSwapFile(void)
- {
- Assert(_fhVm == 0);
-
- _fhVm = __VmCreateTemp();
- cbVmDisk = 0;
- }
-
- #pragma page()
-
- int PRIVATE __FVmAllocateDiskPage(PPTE ppte)
- {
- VPVOID cbOffset;
-
- Assert(*ppte == 0);
-
- if (_fhVm == 0) /* Has swapfile been created? */
- __VmCreateDiskSwapFile(); /* No, try it */
-
- if (_fhVm == -1) /* Has swapfile creation failed? */
- return(FALSE); /* Yes, can't allocate pages */
-
- if (!__VmGetFreeBlock(&_pfbdDiskHead, &_pfbdDiskCurr, &_cDiskPageMax, 1, &cbOffset))
- {
- if (__FVmExtendTemp(_fhVm, cbVmDisk+cbVmPage))
- return(FALSE); /* Can't grow file */
- cbOffset = cbVmDisk;
- cbVmDisk += cbVmPage;
- }
-
- VmTracePrintf(("FVmAllocateDiskPage\n"));
-
- *ppte = cbOffset | fAllocatedPte | fUnreferencedPte | fDiskPte;
-
- VmTracePrintf(("FVmAllocateDiskPage: SwapLocation = %08lX.\n", *ppte & bitSwapPte));
-
- return(TRUE);
- }
-
- #if VMFREE
-
- void PRIVATE __VmFreeDiskPage(PPTE ppte)
- {
- VmTracePrintf(("VmFreeDiskPage: SwapLocation = %08lX.\n", *ppte & bitSwapPte));
-
- Assert((_fhVm != -1) && (_fhVm != 0) && (*ppte & fDiskPte) && !(*ppte & fAllocatedPte));
-
- __VmAddFreeBlock(&_pfbdDiskHead, &_pfbdDiskCurr, &_cDiskPageMax, 1, *ppte & bitSwapPte);
-
- *ppte = 0;
- }
-
- #endif /* VMFREE */
-
- #pragma page()
-
- int PRIVATE __FVmSwapInDiskPage(PTE pte, HPGD hpgd)
- {
- VmTracePrintf(("VmSwapInDiskPage: pPage = %Fp, SwapLocation = %08lX.\n",
- PPageOfHpgd(hpgd), pte & bitSwapPte));
-
- #if VMPROFILE
- _cVmSwapInDisk++;
- #endif
-
- Assert(pte & fDiskPte);
-
- return(__FVmReadTemp(_fhVm, pte & bitSwapPte, PPageOfHpgd(hpgd), cbVmPage));
- }
-
-
- #pragma page()
-
- int PRIVATE __FVmSwapOutDiskPage(PTE pte, HPGD hpgd)
- {
- VmTracePrintf(("VmSwapOutDiskPage: vp = %08lX, pPage = %Fp, SwapLocation = %08lX.\n",
- PpgdOfHpgd(hpgd)->vp, PPageOfHpgd(hpgd), pte & bitSwapPte));
-
- #if VMPROFILE
- _cVmSwapOutDisk++;
- #endif
-
- Assert(pte & fDiskPte);
-
- return(__FVmWriteTemp(_fhVm, pte & bitSwapPte, PPageOfHpgd(hpgd), cbVmPage));
- }
-
-
-
-