Changeset 2511 for trunk/src/win32k/misc/smalloc_avl.c
- Timestamp:
- Jan 24, 2000, 7:19:01 PM (26 years ago)
- 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:14bird Exp $1 /* $Id: smalloc_avl.c,v 1.3 2000-01-24 18:19:00 bird Exp $ 2 2 * 3 3 * Swappable Heap - AVL. … … 16 16 * Defined Constants And Macros * 17 17 *******************************************************************************/ 18 #pragma info(notrd) 18 19 #ifdef DEBUG 19 20 #define DEBUG_ALLOC 20 # defineALLWAYS_HEAPCHECK21 # defineSOMETIMES_HEAPCHECK21 #undef ALLWAYS_HEAPCHECK 22 #undef SOMETIMES_HEAPCHECK 22 23 #endif 23 24 … … 60 61 #ifdef RING0 61 62 #include "dev32hlp.h" 62 #include "asmutils.h"63 #else64 #include <builtin.h>65 #define Int3() __interrupt(3)66 63 #endif 64 #include "asmutils.h" 67 65 #include "log.h" 68 66 #include "smalloc.h" 69 67 #include "rmalloc.h" 70 #include <memory.h>71 68 #include "dev32.h" 72 69 #include "avl.h" 73 70 #include "macros.h" 71 #include <memory.h> 74 72 75 73 … … 162 160 static PMEMBLOCK swpFindUsedBlock(PHEAPANCHOR *ppha, void *pvUser); 163 161 static PMEMBLOCK swpFindWithinUsedBlock(PHEAPANCHOR *ppha, void *pvUser); 162 #ifdef DEBUG_ALLOC 164 163 static int swpCheckAVLTree(PMEMBLOCK pmb); 165 164 static int swpCheckAVLTreeFree(PAVLNODECORE pNode); 165 #endif 166 166 static unsigned _swp_dump_subheaps_callback(PMEMBLOCK pmb, PSUBHEAPS_CALLBACK_PARAM pCb); 167 167 static unsigned _swp_dump_allocated_callback(PMEMBLOCK pmb, PALLOCATED_CALLBACK_PARAM pParam); … … 185 185 186 186 unsigned long *pul; 187 unsigned long ul;188 187 int i = 0; 189 188 PMEMBLOCKCHUNK pmcLast = NULL; … … 222 221 while (pmc->achBitmap[i/8] & (0x1 << (i%8))) 223 222 i++; 224 pmc->achBitmap[i/8] |= 0x1 << (i%8);223 pmc->achBitmap[i/8] |= (0x1 << (i%8)); 225 224 return &pmc->amb[i]; 226 225 #endif … … 251 250 { 252 251 kprintf(("swpReleaseMemblock: the memblock requested to be freed are allread free!\n")); 253 pmc->cFree ++;252 pmc->cFree--; 254 253 } 255 254 #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)); 259 257 } 260 258 else 261 259 kprintf(("swpReleaseMemblock: hmm pmb is not found within any pmc.\n")); 260 #endif 262 261 } 263 262 … … 368 367 PMEMBLOCK pmbRightParent; 369 368 PMEMBLOCK pmbLeft; 370 PMEMBLOCK pmbTmp;371 369 372 370 pha->cbFree += pmb->u2.cbSize; … … 753 751 } 754 752 #endif 755 #if def RING3756 f Inited = TRUE;753 #ifndef RING0 754 fSwpInited = TRUE; 757 755 #endif 758 756 … … 920 918 if (pvRet != NULL) 921 919 { 922 memcpy(pvRet, pv, pmb->u2.cbSize );920 memcpy(pvRet, pv, pmb->u2.cbSize-CB_SIGNATURES); 923 921 sfree(pv); 924 922 } … … 1005 1003 int _swp_validptr(void *pv) 1006 1004 { 1007 PHEAPANCHOR pha;1008 1005 PMEMBLOCK pmb; 1009 1006 … … 1029 1026 int _swp_validptr2(void *pv, unsigned cbSize) 1030 1027 { 1031 PHEAPANCHOR pha;1032 1028 PMEMBLOCK pmb; 1033 1029 … … 1090 1086 AVLENUMDATA FreeEnumData; 1091 1087 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)); 1096 1094 PMEMBLOCK pmbLast = NULL; 1097 1095 unsigned cbFree = 0; … … 1204 1202 pmbLast = pmbUsed; 1205 1203 pmbUsed = pmbUsedNext; 1206 pmbUsedNext = (PMEMBLOCK)AVLGetNextNode( &UsedEnumData);1204 pmbUsedNext = (PMEMBLOCK)AVLGetNextNode((PAVLENUMDATA)SSToDS(&UsedEnumData)); 1207 1205 } 1208 1206 else … … 1244 1242 pmbLast = pmbFree; 1245 1243 pmbFree = pmbFreeNext; 1246 pmbFreeNext = (PMEMBLOCK)AVLGetNextNode( &FreeEnumData);1244 pmbFreeNext = (PMEMBLOCK)AVLGetNextNode((PAVLENUMDATA)SSToDS(&FreeEnumData)); 1247 1245 } 1248 1246 } … … 1305 1303 } 1306 1304 1307 1305 #ifdef DEBUG_ALLOC 1308 1306 /** 1309 1307 * Check the integrity of the a Free/Used AVL tree where Key == node pointer. … … 1316 1314 { 1317 1315 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)); 1318 1322 Int3(); 1319 1323 return -1; … … 1399 1403 return 0; 1400 1404 } 1405 #endif 1401 1406 1402 1407 … … 1406 1411 void _swp_heapmin(void) 1407 1412 { 1413 PMEMBLOCKCHUNK pmcLast; 1414 PMEMBLOCKCHUNK pmc; 1408 1415 PHEAPANCHOR pha = phaLast; 1409 1416 … … 1438 1445 pha = pha->pPrev; 1439 1446 } 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 } 1440 1471 } 1441 1472 … … 1466 1497 while (pha != NULL) 1467 1498 { 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}; 1471 1501 1472 1502 AVLDoWithAll(&pha->pcoreUsed, 1, 1473 (PAVLCALLBACK)_swp_dump_subheaps_callback, &UsedParam);1503 (PAVLCALLBACK)_swp_dump_subheaps_callback, SSToDS(&UsedParam)); 1474 1504 AVLDoWithAll(&pha->pcoreFree, 1, 1475 (PAVLCALLBACK)_swp_dump_subheaps_callback, &FreeParam);1505 (PAVLCALLBACK)_swp_dump_subheaps_callback, SSToDS(&FreeParam)); 1476 1506 1477 1507 kprintf(("HeapAnchor %2d addr=0x%08x cbSize=%6d cbFree=%6d cbUsed=%6d cUsed=%4d cFree=%d\n", … … 1515 1545 { 1516 1546 PHEAPANCHOR pha; 1517 ALLOCATED_CALLBACK_PARAM Param = { 0};1547 ALLOCATED_CALLBACK_PARAM Param = {cb, 0, 0}; 1518 1548 1519 1549 kprintf(("----------------------------\n" … … 1526 1556 /* iterate thru tree using callback */ 1527 1557 AVLDoWithAll((PPAVLNODECORE)&pha->pcoreUsed, TRUE, 1528 (PAVLCALLBACK)_swp_dump_allocated_callback, &Param);1558 (PAVLCALLBACK)_swp_dump_allocated_callback, SSToDS(&Param)); 1529 1559 1530 1560 /* next */
Note:
See TracChangeset
for help on using the changeset viewer.