Ignore:
Timestamp:
Jan 24, 2000, 7:19:01 PM (26 years ago)
Author:
bird
Message:

Heapchanges: Heap is splitted into a swappable and a resident. The heaps
are dynamically growable.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/win32k/misc/smalloc_avl.c

    r2508 r2511  
    1 /* $Id: smalloc_avl.c,v 1.2 2000-01-24 03:05:14 bird Exp $
     1/* $Id: smalloc_avl.c,v 1.3 2000-01-24 18:19:00 bird Exp $
    22 *
    33 * Swappable Heap - AVL.
     
    1616*   Defined Constants And Macros                                               *
    1717*******************************************************************************/
     18#pragma info(notrd)
    1819#ifdef DEBUG
    1920    #define DEBUG_ALLOC
    20     #define ALLWAYS_HEAPCHECK
    21     #define SOMETIMES_HEAPCHECK
     21    #undef ALLWAYS_HEAPCHECK
     22    #undef SOMETIMES_HEAPCHECK
    2223#endif
    2324
     
    6061#ifdef RING0
    6162    #include "dev32hlp.h"
    62     #include "asmutils.h"
    63 #else
    64     #include <builtin.h>
    65     #define Int3() __interrupt(3)
    6663#endif
     64#include "asmutils.h"
    6765#include "log.h"
    6866#include "smalloc.h"
    6967#include "rmalloc.h"
    70 #include <memory.h>
    7168#include "dev32.h"
    7269#include "avl.h"
    7370#include "macros.h"
     71#include <memory.h>
    7472
    7573
     
    162160static PMEMBLOCK    swpFindUsedBlock(PHEAPANCHOR *ppha, void *pvUser);
    163161static PMEMBLOCK    swpFindWithinUsedBlock(PHEAPANCHOR *ppha, void *pvUser);
     162#ifdef DEBUG_ALLOC
    164163static int          swpCheckAVLTree(PMEMBLOCK pmb);
    165164static int          swpCheckAVLTreeFree(PAVLNODECORE pNode);
     165#endif
    166166static unsigned     _swp_dump_subheaps_callback(PMEMBLOCK pmb, PSUBHEAPS_CALLBACK_PARAM pCb);
    167167static unsigned     _swp_dump_allocated_callback(PMEMBLOCK pmb, PALLOCATED_CALLBACK_PARAM pParam);
     
    185185
    186186    unsigned long *pul;
    187     unsigned long  ul;
    188187    int            i = 0;
    189188    PMEMBLOCKCHUNK pmcLast = NULL;
     
    222221    while (pmc->achBitmap[i/8] & (0x1 << (i%8)))
    223222        i++;
    224     pmc->achBitmap[i/8] |=  0x1 << (i%8);
     223    pmc->achBitmap[i/8] |=  (0x1 << (i%8));
    225224    return &pmc->amb[i];
    226225    #endif
     
    251250        {
    252251            kprintf(("swpReleaseMemblock: the memblock requested to be freed are allread free!\n"));
    253             pmc->cFree++;
     252            pmc->cFree--;
    254253        }
    255254        #endif
    256         pmc->cFree--;
    257         pmc->achBitmap[i / 8] &= pmc->achBitmap[i / 8] & ~(0x1 << i % 8);
    258         #endif
     255        pmc->cFree++;
     256        pmc->achBitmap[i / 8] &= pmc->achBitmap[i / 8] & ~(0x1 << (i % 8));
    259257    }
    260258    else
    261259        kprintf(("swpReleaseMemblock: hmm pmb is not found within any pmc.\n"));
     260    #endif
    262261}
    263262
     
    368367    PMEMBLOCK   pmbRightParent;
    369368    PMEMBLOCK   pmbLeft;
    370     PMEMBLOCK   pmbTmp;
    371369
    372370    pha->cbFree += pmb->u2.cbSize;
     
    753751                    }
    754752                #endif
    755                 #ifdef RING3
    756                     fInited = TRUE;
     753                #ifndef RING0
     754                    fSwpInited = TRUE;
    757755                #endif
    758756
     
    920918                if (pvRet != NULL)
    921919                {
    922                     memcpy(pvRet, pv, pmb->u2.cbSize);
     920                    memcpy(pvRet, pv, pmb->u2.cbSize-CB_SIGNATURES);
    923921                    sfree(pv);
    924922                }
     
    10051003int _swp_validptr(void *pv)
    10061004{
    1007     PHEAPANCHOR pha;
    10081005    PMEMBLOCK   pmb;
    10091006
     
    10291026int _swp_validptr2(void *pv, unsigned cbSize)
    10301027{
    1031     PHEAPANCHOR pha;
    10321028    PMEMBLOCK   pmb;
    10331029
     
    10901086        AVLENUMDATA FreeEnumData;
    10911087        AVLENUMDATA UsedEnumData;
    1092         PMEMBLOCK pmbFree = (PMEMBLOCK)AVLBeginEnumTree(&pha->pcoreFree, &FreeEnumData, TRUE);
    1093         PMEMBLOCK pmbFreeNext = (PMEMBLOCK)AVLGetNextNode(&FreeEnumData);
    1094         PMEMBLOCK pmbUsed = (PMEMBLOCK)AVLBeginEnumTree(&pha->pcoreUsed, &UsedEnumData, TRUE);
    1095         PMEMBLOCK pmbUsedNext = (PMEMBLOCK)AVLGetNextNode(&UsedEnumData);
     1088        PMEMBLOCK pmbFree = (PMEMBLOCK)AVLBeginEnumTree(&pha->pcoreFree,
     1089                                                        (PAVLENUMDATA)SSToDS(&FreeEnumData), TRUE);
     1090        PMEMBLOCK pmbFreeNext = (PMEMBLOCK)AVLGetNextNode((PAVLENUMDATA)SSToDS(&FreeEnumData));
     1091        PMEMBLOCK pmbUsed = (PMEMBLOCK)AVLBeginEnumTree(&pha->pcoreUsed,
     1092                                                        (PAVLENUMDATA)SSToDS(&UsedEnumData), TRUE);
     1093        PMEMBLOCK pmbUsedNext = (PMEMBLOCK)AVLGetNextNode((PAVLENUMDATA)SSToDS(&UsedEnumData));
    10961094        PMEMBLOCK pmbLast = NULL;
    10971095        unsigned  cbFree = 0;
     
    12041202                pmbLast = pmbUsed;
    12051203                pmbUsed = pmbUsedNext;
    1206                 pmbUsedNext = (PMEMBLOCK)AVLGetNextNode(&UsedEnumData);
     1204                pmbUsedNext = (PMEMBLOCK)AVLGetNextNode((PAVLENUMDATA)SSToDS(&UsedEnumData));
    12071205            }
    12081206            else
     
    12441242                pmbLast = pmbFree;
    12451243                pmbFree = pmbFreeNext;
    1246                 pmbFreeNext = (PMEMBLOCK)AVLGetNextNode(&FreeEnumData);
     1244                pmbFreeNext = (PMEMBLOCK)AVLGetNextNode((PAVLENUMDATA)SSToDS(&FreeEnumData));
    12471245            }
    12481246        }
     
    13051303}
    13061304
    1307 
     1305#ifdef DEBUG_ALLOC
    13081306/**
    13091307 * Check the integrity of the a Free/Used AVL tree where Key == node pointer.
     
    13161314    {
    13171315        kprintf(("swpCheckAVLTree: Invalid Key!\n"));
     1316        Int3();
     1317        return -1;
     1318    }
     1319    if (pmb->u1.uData % ALIGNMENT != 0)
     1320    {
     1321        kprintf(("swpCheckAVLTree: Data is not correctly aligned, uData=0x%08x\n", pmb->u1.uData));
    13181322        Int3();
    13191323        return -1;
     
    13991403    return 0;
    14001404}
     1405#endif
    14011406
    14021407
     
    14061411void _swp_heapmin(void)
    14071412{
     1413    PMEMBLOCKCHUNK pmcLast;
     1414    PMEMBLOCKCHUNK pmc;
    14081415    PHEAPANCHOR pha = phaLast;
    14091416
     
    14381445            pha = pha->pPrev;
    14391446    }
     1447
     1448    pmcLast = NULL;
     1449    pmc = pmcFirst;
     1450    while (pmc != NULL)
     1451    {
     1452        #ifdef DEBUG_ALLOC
     1453        if (pmc->cFree > MEMBLOCKS_PER_CHUNK)
     1454        {
     1455            kprintf(("_swp_heapmin: internal heap error - pmc->cFree(%d) > MEMBLOCKS_PER_CHUNK(%d)\n",
     1456                     pmc->cFree, MEMBLOCKS_PER_CHUNK));
     1457        }
     1458        #endif
     1459        if (pmc->cFree == MEMBLOCKS_PER_CHUNK && pmcLast != NULL)
     1460        {
     1461            pmcLast->pNext = pmc->pNext;
     1462            rfree(pmc);
     1463            pmc = pmcLast->pNext;
     1464        }
     1465        else
     1466        {
     1467            pmcLast = pmc;
     1468            pmc = pmc->pNext;
     1469        }
     1470    }
    14401471}
    14411472
     
    14661497    while (pha != NULL)
    14671498    {
    1468         PMEMBLOCK pmb;
    1469         SUBHEAPS_CALLBACK_PARAM FreeParam = {0};
    1470         SUBHEAPS_CALLBACK_PARAM UsedParam = {0};
     1499        SUBHEAPS_CALLBACK_PARAM FreeParam = {0, 0};
     1500        SUBHEAPS_CALLBACK_PARAM UsedParam = {0, 0};
    14711501
    14721502        AVLDoWithAll(&pha->pcoreUsed, 1,
    1473                      (PAVLCALLBACK)_swp_dump_subheaps_callback, &UsedParam);
     1503                     (PAVLCALLBACK)_swp_dump_subheaps_callback, SSToDS(&UsedParam));
    14741504        AVLDoWithAll(&pha->pcoreFree, 1,
    1475                      (PAVLCALLBACK)_swp_dump_subheaps_callback, &FreeParam);
     1505                     (PAVLCALLBACK)_swp_dump_subheaps_callback, SSToDS(&FreeParam));
    14761506
    14771507        kprintf(("HeapAnchor %2d addr=0x%08x cbSize=%6d cbFree=%6d cbUsed=%6d cUsed=%4d cFree=%d\n",
     
    15151545{
    15161546    PHEAPANCHOR pha;
    1517     ALLOCATED_CALLBACK_PARAM Param = {0};
     1547    ALLOCATED_CALLBACK_PARAM Param = {cb, 0, 0};
    15181548
    15191549    kprintf(("----------------------------\n"
     
    15261556        /* iterate thru tree using callback */
    15271557        AVLDoWithAll((PPAVLNODECORE)&pha->pcoreUsed, TRUE,
    1528                      (PAVLCALLBACK)_swp_dump_allocated_callback, &Param);
     1558                     (PAVLCALLBACK)_swp_dump_allocated_callback, SSToDS(&Param));
    15291559
    15301560        /* next */
Note: See TracChangeset for help on using the changeset viewer.