Changeset 2508


Ignore:
Timestamp:
Jan 24, 2000, 4:05:14 AM (25 years ago)
Author:
bird
Message:

Corrections. Still some bugs in smalloc_avl.c.

Location:
trunk/src/win32k/misc
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/win32k/misc/heaptest.c

    r2507 r2508  
    1 /* $Id: heaptest.c,v 1.3 2000-01-24 01:45:20 bird Exp $
     1/* $Id: heaptest.c,v 1.4 2000-01-24 03:05:13 bird Exp $
    22 *
    33 * Test of resident and swappable heaps.
     
    4747    int           fResRandom = 0;
    4848    int           fSwpTests = 1;
    49     int           fSwpSimple = 1;
     49    int           fSwpSimple = 0;
    5050    int           fSwpRandom = 1;
     51    enum   {malloc,realloc, free, unknown} enmLast = unknown;
    5152
    5253    /*
     
    9091                    acb[i] += 1024*260;
    9192                apv[i] = rmalloc(acb[i]);
     93                enmLast = malloc;
    9294                if (apv[i] == NULL)
    9395                {
     
    112114                    printf("size of avp[%d] (%d) != acb[%d] (%d)\n", i, cb, i, acb[i]);
    113115                rfree(apv[i]);
     116                enmLast = free;
    114117            }
    115118
     
    168171                            acb[j] += 1024*256;
    169172                        apv[j] = rmalloc(acb[j]);
     173                        enmLast = malloc;
    170174                        if (apv[j] == NULL)
    171175                        {
     
    224228                            */
    225229                            pv = rrealloc(apv[j], cb);
     230                            enmLast = realloc;
    226231                            if (pv == NULL)
    227232                            {
     
    235240                        {   /* free */
    236241                            rfree(apv[j]);
     242                            enmLast = free;
    237243                            apv[j] = NULL;
    238244                            cAllocations--;
     
    286292                    acb[i] += 1024*260;
    287293                apv[i] = smalloc(acb[i]);
     294                enmLast = malloc;
    288295                if (apv[i] == NULL)
    289296                {
     
    308315                    printf("size of avp[%d] (%d) != acb[%d] (%d)\n", i, cb, i, acb[i]);
    309316                sfree(apv[i]);
     317                enmLast = free;
    310318            }
    311319
     
    364372                            acb[j] += 1024*256;
    365373                        apv[j] = smalloc(acb[j]);
     374                        enmLast = malloc;
    366375                        if (apv[j] == NULL)
    367376                        {
     
    420429                            */
    421430                            pv = srealloc(apv[j], cb);
     431                            enmLast = realloc;
    422432                            if (pv == NULL)
    423433                            {
     
    431441                        {   /* free */
    432442                            sfree(apv[j]);
     443                            enmLast = free;
    433444                            apv[j] = NULL;
    434445                            cAllocations--;
  • TabularUnified trunk/src/win32k/misc/rmalloc_avl.c

    r2507 r2508  
    1 /* $Id: rmalloc_avl.c,v 1.3 2000-01-24 01:45:20 bird Exp $
     1/* $Id: rmalloc_avl.c,v 1.4 2000-01-24 03:05:14 bird Exp $
    22 *
    33 * Resident Heap - AVL.
     
    121121******************************************************************************/
    122122static PHEAPANCHOR  phaFirst;           /* Pointer to the first anchor block.*/
    123 static PHEAPANCHOR  phaLast;            /* Pointer to the first anchor block.*/
     123static PHEAPANCHOR  phaLast;            /* Pointer to the last anchor block.*/
    124124static unsigned     cbResHeapMax;       /* Maximum amount of memory used by the heap. */
    125125
  • TabularUnified trunk/src/win32k/misc/smalloc_avl.c

    r2507 r2508  
    1 /* $Id: smalloc_avl.c,v 1.1 2000-01-24 01:45:21 bird Exp $
     1/* $Id: smalloc_avl.c,v 1.2 2000-01-24 03:05:14 bird Exp $
    22 *
    33 * Swappable Heap - AVL.
     
    4040                                ((PMEMBLOCK)((unsigned)(a) - (unsigned)(&((PMEMBLOCK)0)->u2.coreFree)))
    4141
    42 #define BLOCKSIZE (1024*256)            /* 256KB */
    43 #define ALIGNMENT (sizeof(unsigned))
     42#define BLOCKSIZE               (1024*256)            /* 256KB */
     43#define ALIGNMENT               (sizeof(unsigned))
     44#define MEMBLOCKS_PER_CHUNK     (256)
    4445
    4546
     
    7677*   Structures and Typedefs                                                    *
    7778*******************************************************************************/
    78 #pragma pack(1)
     79#pragma pack(4)
    7980typedef struct _MEMBLOCK /* mb */
    8081{
     
    9394    struct _MEMBLOCK   *pmbNext;        /* Pointer to list of blocks with the same size */
    9495} MEMBLOCK, *PMEMBLOCK;
    95 #pragma pack()
     96
    9697
    9798typedef struct _HeapAnchor /* ha */
     
    113114
    114115
     116typedef struct _MemblockChunk /* mc */
     117{
     118    struct _MemblockChunk * pNext;      /* Pointer to next chunk */
     119    unsigned            cFree;          /* Number of free memblocks */
     120    char                achBitmap[MEMBLOCKS_PER_CHUNK/8]; /* Used(1)/Free(0) bitmap */
     121    MEMBLOCK            amb[MEMBLOCKS_PER_CHUNK]; /* Array of memblocks */
     122} MEMBLOCKCHUNK, *PMEMBLOCKCHUNK;
     123
     124
    115125typedef struct _SubHeaps_Callback_param
    116126{
     
    131141******************************************************************************/
    132142static PHEAPANCHOR  phaFirst;           /* Pointer to the first anchor block.*/
    133 static PHEAPANCHOR  phaLast;            /* Pointer to the first anchor block.*/
     143static PHEAPANCHOR  phaLast;            /* Pointer to the last anchor block.*/
    134144static unsigned     cbSwpHeapMax;       /* Maximum amount of memory used by the heap. */
     145static PMEMBLOCKCHUNK pmcFirst;          /* Pointer to the first memblock chunk. */
    135146
    136147#ifndef RING0
     
    165176_Inline PMEMBLOCK swpAllocateMemblock(void)
    166177{
     178    #if 0
    167179    PMEMBLOCK pmb = (PMEMBLOCK)rmalloc(sizeof(MEMBLOCK));
    168180    if (pmb != NULL)
    169181        memset(pmb, 0, sizeof(*pmb));
    170182    return pmb;
     183
     184    #else
     185
     186    unsigned long *pul;
     187    unsigned long  ul;
     188    int            i = 0;
     189    PMEMBLOCKCHUNK pmcLast = NULL;
     190    PMEMBLOCKCHUNK pmc = pmcFirst;
     191    while (pmc != NULL && pmc->cFree == 0)
     192    {
     193        pmcLast =  pmc;
     194        pmc = pmc->pNext;
     195    }
     196
     197    /* allocate another chunk? */
     198    if (pmc == NULL)
     199    {
     200        pmc = rmalloc(sizeof(*pmc));
     201        if (pmc != NULL)
     202        {
     203            memset(pmc, 0, sizeof(*pmc));
     204            pmc->cFree = MEMBLOCKS_PER_CHUNK;
     205            if (pmcLast == NULL)
     206                pmcFirst = pmc;
     207            else
     208                pmcLast->pNext = pmc;
     209        }
     210        else
     211        {
     212            kprintf(("swpAllocateMemblock: rmalloc failed\n"));
     213            return NULL;
     214        }
     215    }
     216
     217    /* find first free */
     218    pmc->cFree--;
     219    pul = (unsigned long*)pmc->achBitmap;
     220    while (*pul == 0xFFFFFFFF)
     221        pul++, i += 8*4;
     222    while (pmc->achBitmap[i/8] & (0x1 << (i%8)))
     223        i++;
     224    pmc->achBitmap[i/8] |=  0x1 << (i%8);
     225    return &pmc->amb[i];
     226    #endif
    171227}
    172228
     
    179235_Inline void swpReleaseMemblock(PMEMBLOCK pmb)
    180236{
     237    #if 0
    181238    if (pmb != NULL)
    182239        rfree(pmb);
     240    #else
     241    int             i;
     242    PMEMBLOCKCHUNK  pmc = pmcFirst;
     243    while (pmc != NULL && !((void*)pmc < (void*)pmb && (unsigned)pmc + sizeof(*pmc) > (unsigned)pmb))
     244        pmc = pmc->pNext;
     245
     246    if (pmc != NULL)
     247    {
     248        i = ((unsigned)pmb - (unsigned)pmc->amb) / sizeof(pmc->amb[0]);
     249        #ifdef DEBUG
     250        if ((pmc->achBitmap[i / 8] & (1 << (i % 8))) == 0)
     251        {
     252            kprintf(("swpReleaseMemblock: the memblock requested to be freed are allread free!\n"));
     253            pmc->cFree++;
     254        }
     255        #endif
     256        pmc->cFree--;
     257        pmc->achBitmap[i / 8] &= pmc->achBitmap[i / 8] & ~(0x1 << i % 8);
     258        #endif
     259    }
     260    else
     261        kprintf(("swpReleaseMemblock: hmm pmb is not found within any pmc.\n"));
    183262}
    184263
     
    626705int swpHeapInit(unsigned cbSizeInit, unsigned cbSizeMax)
    627706{
    628     unsigned  cbSize = MAX(BLOCKSIZE, cbSizeInit);
    629     PMEMBLOCK pmbFree = swpAllocateMemblock();
     707    PMEMBLOCK pmbFree;
    630708    cbSwpHeapMax = cbSizeMax;
    631 
     709    pmcFirst = NULL;
     710    pmbFree = swpAllocateMemblock();
    632711    if (pmbFree != NULL)
    633712    {
     
    635714        if (phaFirst != NULL)
    636715        {
     716            unsigned  cbSize = MAX(BLOCKSIZE, cbSizeInit);
    637717            memset(phaFirst, 0, sizeof(*phaFirst));
    638718            #ifdef RING0
     
    648728                phaFirst->ulSignature = HEAPANCHOR_SIGNATURE;
    649729                #endif
    650                 phaFirst->cbSize = cbSizeInit;
     730                phaFirst->cbSize = cbSize;
    651731
    652732                /* free memblock */
    653733                pmbFree->u1.uData = (unsigned)phaFirst->pvBlock;
    654                 pmbFree->u2.cbSize = cbSizeInit;
     734                pmbFree->u2.cbSize = cbSize;
    655735                #ifdef DEBUG_ALLOC
    656736                pmbFree->u1.puData[0] = SIGNATURE_START;
     
    694774    }
    695775    else
    696         kprintf(("swpHeapInit: swpAllocateMemblock failed\n"));
     776        kprintf(("swpHeapInit: swpAllocateMemblock failed.\n"));
    697777    return -1;
    698778}
     
    752832    }
    753833    #endif
    754     pmb = swpFindUsedBlock(SSToDS(&pha), pv));
     834    pmb = swpFindUsedBlock(SSToDS(&pha), pv);
    755835    if (pmb != NULL)
    756836    {
     
    771851                    pmb->u2.cbSize = cbNew;
    772852                    #ifdef DEBUG_ALLOC
     853                    pmbNew->u1.puData[-1] = SIGNATURE_END;
    773854                    pmbNew->u1.puData[0] = SIGNATURE_START;
    774855                    pmbNew->u1.puData[(pmbNew->u2.cbSize / sizeof(unsigned)) - 1] = SIGNATURE_END;
     
    803884                pvRet = pv;
    804885                /* split the free block? */
    805                 if (pmbRight->u2.cbSize + pmb->u2.cbSize + CB_SIGNATURES > cbNew)
     886                if (pmbRight->u2.cbSize + pmb->u2.cbSize - CB_SIGNATURES > cbNew)
    806887                {
    807888                    pha->cbFree -= pmbRight->u2.cbSize;
     
    810891                    pmbRight->u2.cbSize = pmbRight->u2.cbSize + pmb->u2.cbSize - cbNew;
    811892                    #ifdef DEBUG_ALLOC
     893                    pmbRight->u1.puData[-1] = SIGNATURE_END;
    812894                    pmbRight->u1.puData[0] = SIGNATURE_START;
    813895                    pmbRight->u1.puData[(pmbRight->u2.cbSize / sizeof(unsigned)) - 1] = SIGNATURE_END;
     
    911993    #endif
    912994
    913     pmb = swpFindUsedBlock(SSToDS(&pha), pv));
     995    pmb = swpFindUsedBlock(SSToDS(&pha), pv);
    914996    return pmb != NULL ? pmb->u2.cbSize - CB_SIGNATURES : 0;
    915997}
     
    11141196                    return FALSE;
    11151197                }
    1116                 if (pmbUsed->u1.puData[(pmbUsed->u2.cbSize/sizeof(unsigned)) - 1] != SIGNATURE_END)
    1117                 {
    1118                     kprintf(("_swp_heap_check: invalid start signature on used block, pv=0x%08x\n", pmbUsed->u1.pvData));
     1198                if (pmbUsed->u1.puData[(pmbUsed->u2.cbSize / sizeof(unsigned)) - 1] != SIGNATURE_END)
     1199                {
     1200                    kprintf(("_swp_heap_check: invalid end signature on used block, pv=0x%08x\n", pmbUsed->u1.pvData));
    11191201                    Int3();
    11201202                    return FALSE;
     
    11541236                    return FALSE;
    11551237                }
    1156                 if (pmbFree->u1.puData[(pmbFree->u2.cbSize/sizeof(unsigned)) - 1] != SIGNATURE_END)
    1157                 {
    1158                     kprintf(("_swp_heap_check: invalid start signature on free block, pv=0x%08x\n", pmbUsed->u1.pvData));
     1238                if (pmbFree->u1.puData[(pmbFree->u2.cbSize / sizeof(unsigned)) - 1] != SIGNATURE_END)
     1239                {
     1240                    kprintf(("_swp_heap_check: invalid end signature on free block, pv=0x%08x\n", pmbUsed->u1.pvData));
    11591241                    Int3();
    11601242                    return FALSE;
Note: See TracChangeset for help on using the changeset viewer.