Changeset 2508
- Timestamp:
- Jan 24, 2000, 4:05:14 AM (25 years ago)
- 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:20bird Exp $1 /* $Id: heaptest.c,v 1.4 2000-01-24 03:05:13 bird Exp $ 2 2 * 3 3 * Test of resident and swappable heaps. … … 47 47 int fResRandom = 0; 48 48 int fSwpTests = 1; 49 int fSwpSimple = 1;49 int fSwpSimple = 0; 50 50 int fSwpRandom = 1; 51 enum {malloc,realloc, free, unknown} enmLast = unknown; 51 52 52 53 /* … … 90 91 acb[i] += 1024*260; 91 92 apv[i] = rmalloc(acb[i]); 93 enmLast = malloc; 92 94 if (apv[i] == NULL) 93 95 { … … 112 114 printf("size of avp[%d] (%d) != acb[%d] (%d)\n", i, cb, i, acb[i]); 113 115 rfree(apv[i]); 116 enmLast = free; 114 117 } 115 118 … … 168 171 acb[j] += 1024*256; 169 172 apv[j] = rmalloc(acb[j]); 173 enmLast = malloc; 170 174 if (apv[j] == NULL) 171 175 { … … 224 228 */ 225 229 pv = rrealloc(apv[j], cb); 230 enmLast = realloc; 226 231 if (pv == NULL) 227 232 { … … 235 240 { /* free */ 236 241 rfree(apv[j]); 242 enmLast = free; 237 243 apv[j] = NULL; 238 244 cAllocations--; … … 286 292 acb[i] += 1024*260; 287 293 apv[i] = smalloc(acb[i]); 294 enmLast = malloc; 288 295 if (apv[i] == NULL) 289 296 { … … 308 315 printf("size of avp[%d] (%d) != acb[%d] (%d)\n", i, cb, i, acb[i]); 309 316 sfree(apv[i]); 317 enmLast = free; 310 318 } 311 319 … … 364 372 acb[j] += 1024*256; 365 373 apv[j] = smalloc(acb[j]); 374 enmLast = malloc; 366 375 if (apv[j] == NULL) 367 376 { … … 420 429 */ 421 430 pv = srealloc(apv[j], cb); 431 enmLast = realloc; 422 432 if (pv == NULL) 423 433 { … … 431 441 { /* free */ 432 442 sfree(apv[j]); 443 enmLast = free; 433 444 apv[j] = NULL; 434 445 cAllocations--; -
TabularUnified trunk/src/win32k/misc/rmalloc_avl.c ¶
r2507 r2508 1 /* $Id: rmalloc_avl.c,v 1. 3 2000-01-24 01:45:20bird Exp $1 /* $Id: rmalloc_avl.c,v 1.4 2000-01-24 03:05:14 bird Exp $ 2 2 * 3 3 * Resident Heap - AVL. … … 121 121 ******************************************************************************/ 122 122 static PHEAPANCHOR phaFirst; /* Pointer to the first anchor block.*/ 123 static PHEAPANCHOR phaLast; /* Pointer to the first anchor block.*/123 static PHEAPANCHOR phaLast; /* Pointer to the last anchor block.*/ 124 124 static unsigned cbResHeapMax; /* Maximum amount of memory used by the heap. */ 125 125 -
TabularUnified trunk/src/win32k/misc/smalloc_avl.c ¶
r2507 r2508 1 /* $Id: smalloc_avl.c,v 1. 1 2000-01-24 01:45:21bird Exp $1 /* $Id: smalloc_avl.c,v 1.2 2000-01-24 03:05:14 bird Exp $ 2 2 * 3 3 * Swappable Heap - AVL. … … 40 40 ((PMEMBLOCK)((unsigned)(a) - (unsigned)(&((PMEMBLOCK)0)->u2.coreFree))) 41 41 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) 44 45 45 46 … … 76 77 * Structures and Typedefs * 77 78 *******************************************************************************/ 78 #pragma pack( 1)79 #pragma pack(4) 79 80 typedef struct _MEMBLOCK /* mb */ 80 81 { … … 93 94 struct _MEMBLOCK *pmbNext; /* Pointer to list of blocks with the same size */ 94 95 } MEMBLOCK, *PMEMBLOCK; 95 #pragma pack() 96 96 97 97 98 typedef struct _HeapAnchor /* ha */ … … 113 114 114 115 116 typedef 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 115 125 typedef struct _SubHeaps_Callback_param 116 126 { … … 131 141 ******************************************************************************/ 132 142 static PHEAPANCHOR phaFirst; /* Pointer to the first anchor block.*/ 133 static PHEAPANCHOR phaLast; /* Pointer to the first anchor block.*/143 static PHEAPANCHOR phaLast; /* Pointer to the last anchor block.*/ 134 144 static unsigned cbSwpHeapMax; /* Maximum amount of memory used by the heap. */ 145 static PMEMBLOCKCHUNK pmcFirst; /* Pointer to the first memblock chunk. */ 135 146 136 147 #ifndef RING0 … … 165 176 _Inline PMEMBLOCK swpAllocateMemblock(void) 166 177 { 178 #if 0 167 179 PMEMBLOCK pmb = (PMEMBLOCK)rmalloc(sizeof(MEMBLOCK)); 168 180 if (pmb != NULL) 169 181 memset(pmb, 0, sizeof(*pmb)); 170 182 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 171 227 } 172 228 … … 179 235 _Inline void swpReleaseMemblock(PMEMBLOCK pmb) 180 236 { 237 #if 0 181 238 if (pmb != NULL) 182 239 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")); 183 262 } 184 263 … … 626 705 int swpHeapInit(unsigned cbSizeInit, unsigned cbSizeMax) 627 706 { 628 unsigned cbSize = MAX(BLOCKSIZE, cbSizeInit); 629 PMEMBLOCK pmbFree = swpAllocateMemblock(); 707 PMEMBLOCK pmbFree; 630 708 cbSwpHeapMax = cbSizeMax; 631 709 pmcFirst = NULL; 710 pmbFree = swpAllocateMemblock(); 632 711 if (pmbFree != NULL) 633 712 { … … 635 714 if (phaFirst != NULL) 636 715 { 716 unsigned cbSize = MAX(BLOCKSIZE, cbSizeInit); 637 717 memset(phaFirst, 0, sizeof(*phaFirst)); 638 718 #ifdef RING0 … … 648 728 phaFirst->ulSignature = HEAPANCHOR_SIGNATURE; 649 729 #endif 650 phaFirst->cbSize = cbSize Init;730 phaFirst->cbSize = cbSize; 651 731 652 732 /* free memblock */ 653 733 pmbFree->u1.uData = (unsigned)phaFirst->pvBlock; 654 pmbFree->u2.cbSize = cbSize Init;734 pmbFree->u2.cbSize = cbSize; 655 735 #ifdef DEBUG_ALLOC 656 736 pmbFree->u1.puData[0] = SIGNATURE_START; … … 694 774 } 695 775 else 696 kprintf(("swpHeapInit: swpAllocateMemblock failed \n"));776 kprintf(("swpHeapInit: swpAllocateMemblock failed.\n")); 697 777 return -1; 698 778 } … … 752 832 } 753 833 #endif 754 pmb = swpFindUsedBlock(SSToDS(&pha), pv) );834 pmb = swpFindUsedBlock(SSToDS(&pha), pv); 755 835 if (pmb != NULL) 756 836 { … … 771 851 pmb->u2.cbSize = cbNew; 772 852 #ifdef DEBUG_ALLOC 853 pmbNew->u1.puData[-1] = SIGNATURE_END; 773 854 pmbNew->u1.puData[0] = SIGNATURE_START; 774 855 pmbNew->u1.puData[(pmbNew->u2.cbSize / sizeof(unsigned)) - 1] = SIGNATURE_END; … … 803 884 pvRet = pv; 804 885 /* 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) 806 887 { 807 888 pha->cbFree -= pmbRight->u2.cbSize; … … 810 891 pmbRight->u2.cbSize = pmbRight->u2.cbSize + pmb->u2.cbSize - cbNew; 811 892 #ifdef DEBUG_ALLOC 893 pmbRight->u1.puData[-1] = SIGNATURE_END; 812 894 pmbRight->u1.puData[0] = SIGNATURE_START; 813 895 pmbRight->u1.puData[(pmbRight->u2.cbSize / sizeof(unsigned)) - 1] = SIGNATURE_END; … … 911 993 #endif 912 994 913 pmb = swpFindUsedBlock(SSToDS(&pha), pv) );995 pmb = swpFindUsedBlock(SSToDS(&pha), pv); 914 996 return pmb != NULL ? pmb->u2.cbSize - CB_SIGNATURES : 0; 915 997 } … … 1114 1196 return FALSE; 1115 1197 } 1116 if (pmbUsed->u1.puData[(pmbUsed->u2.cbSize /sizeof(unsigned)) - 1] != SIGNATURE_END)1117 { 1118 kprintf(("_swp_heap_check: invalid startsignature 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)); 1119 1201 Int3(); 1120 1202 return FALSE; … … 1154 1236 return FALSE; 1155 1237 } 1156 if (pmbFree->u1.puData[(pmbFree->u2.cbSize /sizeof(unsigned)) - 1] != SIGNATURE_END)1157 { 1158 kprintf(("_swp_heap_check: invalid startsignature 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)); 1159 1241 Int3(); 1160 1242 return FALSE;
Note:
See TracChangeset
for help on using the changeset viewer.