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

  1. /***
  2. * vmfree.c -
  3. *
  4. *       Copyright (c) 1989-1992, Microsoft Corporation.  All rights reserved.
  5. *
  6. *Purpose:
  7. *
  8. * PUBLIC Function List
  9. *
  10. *       VmFreePageVp
  11. *       This function frees a virtual page at a specific virtual
  12. *       address.
  13. *
  14. *       VmFreePageVpCb
  15. *       This function frees the range of virtual pages starting at the
  16. *       specified virtual address spanning the specified number of bytes.
  17. *
  18. *
  19. *******************************************************************************/
  20.  
  21. #pragma title("Virtual Memory Manager")
  22. #pragma subtitle("Core routines")
  23.  
  24. #include <version.h>
  25. #include <vmassert.h>
  26. #include <system.h>
  27. #include <error.h>
  28. #include <vm.h>
  29. #include <vmp.h>
  30.  
  31. #include <stdlib.h>
  32.  
  33. #pragma page()
  34.  
  35. #if     VMFREE
  36.  
  37. void PUBLIC __VmFreePageVp(VPVOID vp)
  38. {
  39.    HPGD  hpgd;
  40.    PPTE  ppte;
  41.  
  42.    VmTracePrintf(("VmFreePageVp: vp = %08lX.\n", vp));
  43.  
  44.    /* If this page is in memory, then discard it. */
  45.  
  46.    if ((hpgd = __HpgdSearchCache(VpPageOfVp(vp))) != hpgdNil)
  47.    {
  48.       PpgdOfHpgd(hpgd)->cLock   = 0;
  49.  
  50.       if (!(PpgdOfHpgd(hpgd)->Flags & fEmsPgd))
  51.      __VmRemovePgdFromCache(hpgd);
  52.  
  53.       PpgdOfHpgd(hpgd)->Flags  &= ~(fAllocatedPgd | fDirtyPgd);
  54.       PpgdOfHpgd(hpgd)->timeRef = 0;
  55.    }
  56.  
  57.  
  58.    /* Load page table entry for this page to determine current location */
  59.    /* This page better have been allocated previously. */
  60.  
  61.    if (vp < vpptMax)
  62.       ppte = &_ptRoot[PageOfVp(vp)];
  63.    else
  64.       ppte = __PVmLoadVp(VppteOfVp(vp), FALSE);
  65.  
  66.    Assert(ppte != NULL);
  67.    Assert(*ppte & fAllocatedPte);
  68.  
  69.    *ppte &= ~fAllocatedPte;
  70.  
  71.    if (*ppte & fXmsPte)
  72.       __VmFreeXmsPage(ppte);
  73.  
  74.    else if (*ppte & fEmsPte)
  75.       __VmFreeEmsPage(ppte);
  76.  
  77.    else
  78.       __VmFreeDiskPage(ppte);
  79.  
  80. }
  81.  
  82.  
  83. #endif  /* VMFREE */
  84.  
  85. #pragma page()
  86.  
  87. #if     VMFREE
  88.  
  89. void PUBLIC __VmFreePageVpCb(VPVOID vp, unsigned long cb)
  90. {
  91.    unsigned cPage;
  92.    unsigned iPage;
  93.  
  94.    VmTracePrintf(("VmFreePageVpCb: vp = %08lX, cb = %08lX.\n", vp, cb));
  95.  
  96.    Assert((vp & (cbVmPage - 1UL)) == 0);
  97.    Assert(vp + cb > vp);
  98.  
  99.    cPage = (unsigned) ((cb + cbVmPage - 1UL) / cbVmPage);
  100.    for (iPage = 0; iPage < cPage; iPage++)
  101.    {
  102.       __VmFreePageVp(vp);
  103.       vp += cbVmPage;
  104.    }
  105. }
  106.  
  107.  
  108. #endif  /* VMFREE */
  109.