- Timestamp:
- Jan 24, 2000, 2:45:21 AM (26 years ago)
- Location:
- trunk/src/win32k/misc
- Files:
-
- 1 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/win32k/misc/avl.c
r2501 r2507 1 /* $Id: avl.c,v 1. 2 2000-01-22 18:21:02bird Exp $1 /* $Id: avl.c,v 1.3 2000-01-24 01:45:19 bird Exp $ 2 2 * 3 3 * AVL-Tree (lookalike) implementation. … … 436 436 if (*ppTree != NULL) 437 437 { 438 pEnumData->fFromLeft = fFromLeft;438 pEnumData->fFromLeft = (char)fFromLeft; 439 439 pEnumData->cEntries = 1; 440 440 pEnumData->aEntries[0] = *ppTree; -
trunk/src/win32k/misc/heaptest.c
r2503 r2507 1 /* $Id: heaptest.c,v 1. 2 2000-01-23 03:20:52bird Exp $1 /* $Id: heaptest.c,v 1.3 2000-01-24 01:45:20 bird Exp $ 2 2 * 3 3 * Test of resident and swappable heaps. … … 13 13 * Defined Constants 14 14 *******************************************************************************/ 15 #define NUMBER_OF_POINTERS 1 638415 #define NUMBER_OF_POINTERS 1024 16 16 #define RANDOMTEST_ITERATIONS 65536*2 17 17 #define Int3() __interrupt(3) … … 21 21 * Internal Functions 22 22 *******************************************************************************/ 23 #include "malloc.h" 23 /*#include "malloc.h"*/ 24 24 #include "rmalloc.h" 25 #include "smalloc.h" 25 26 #include "macros.h" 26 27 #include <stdio.h> … … 42 43 unsigned crealloc; 43 44 int i; 45 int fResTests = 0; 46 int fResSimple = 0; 47 int fResRandom = 0; 48 int fSwpTests = 1; 49 int fSwpSimple = 1; 50 int fSwpRandom = 1; 44 51 45 52 /* 46 53 * Initiate the heap. 47 54 */ 48 if ( ResHeapInit(128*1024, 1024*1024*64) != 0)55 if (resHeapInit(128*1024, 1024*1024*64) != 0) 49 56 { 50 57 printf("Failed to initiate the resident heap.\n"); … … 52 59 } 53 60 54 /* 55 * 56 * resident heap tests 57 * resident heap tests 58 * 59 */ 60 #if 1 61 /* 62 * Simple allocation test. 63 */ 64 for (i = 0; i < NUMBER_OF_POINTERS; i++) 61 if (swpHeapInit(128*1024, 1024*1024*64) != 0) 65 62 { 66 do 63 printf("Failed to initiate the swappable heap.\n"); 64 return 2; 65 } 66 67 68 69 if (fResTests) 70 { 71 /* 72 * 73 * resident heap tests 74 * resident heap tests 75 * 76 */ 77 if (fResSimple) 67 78 { 68 acb[i] = rand(); 69 } while(acb[i] == 0 || acb[i] > 127); 70 71 if ((i % (NUMBER_OF_POINTERS/3)) == 1) 72 acb[i] += 1024*260; 73 apv[i] = rmalloc(acb[i]); 74 if (apv[i] == NULL) 75 { 76 printf("rmalloc failed: acb[%d]=%d\n", i, acb[i]); 77 if (acb[i] > 1000) 78 break; 79 } 80 memset(apv[i], 0xA, MIN(acb[i],16)); 81 cb += acb[i]; 82 } 83 84 printf("Finished allocating memory: %d allocations %d bytes\n", i, cb); 85 86 87 printf("_res_dump_subheaps:\n"); 88 _res_dump_subheaps(); 89 90 for (i = 0; i < NUMBER_OF_POINTERS; i++) 91 { 92 int cb = _res_msize(apv[i]); 93 if (cb != ((acb[i] + 3) & ~3) && (cb < ((acb[i] + 3) & ~3) || cb > 52 + ((acb[i] + 3) & ~3)) ) 94 printf("size of avp[%d] (%d) != acb[%] (%d)\n", i, cb, i, acb[i]); 95 rfree(apv[i]); 96 } 97 98 99 /* 100 * test _res_heapmin 101 */ 102 printf("_res_memfree - before heapmin: %d\n", _res_memfree()); 103 _res_heapmin(); 104 printf("_res_memfree - after heapmin : %d\n", _res_memfree()); 105 106 /* 107 * Test _res_dump_subheaps 108 */ 109 printf("\n_res_dump_subheaps:\n"); 110 _res_dump_subheaps(); 111 #endif 112 113 114 /* 115 * Test 2 - random allocation and freeing of memory. 116 */ 117 printf("\n" 118 "Random allocation and freeing test:\n"); 119 for (i = 0; i < NUMBER_OF_POINTERS; i++) 120 apv[i] = NULL, acb[i] = 0; 121 cAllocations = 0; 122 i = 0; 123 cb = 0; 124 crfree = 0; 125 crmalloc = 0; 126 crealloc = 0; 127 while (i++ < RANDOMTEST_ITERATIONS || cAllocations > 0) 128 { 129 int j; 130 j = rand(); 131 if (cAllocations + (NUMBER_OF_POINTERS/20) < NUMBER_OF_POINTERS && 132 (i < RANDOMTEST_ITERATIONS*1/4 ? (j % 8) > 2 : 133 i < RANDOMTEST_ITERATIONS*2/4 ? (j % 8) > 3 : 134 i < RANDOMTEST_ITERATIONS*3/4 ? (j % 8) > 4 : 135 i < RANDOMTEST_ITERATIONS ? (j % 8) > 5 : 0 136 ) 137 ) 138 { /* malloc */ 139 for (j = 0; j < NUMBER_OF_POINTERS && apv[j] != NULL; j++) 140 (void)0; 141 if (j < NUMBER_OF_POINTERS) 79 /* 80 * Simple allocation test. 81 */ 82 for (i = 0; i < NUMBER_OF_POINTERS; i++) 142 83 { 143 84 do 144 85 { 145 acb[j] = rand(); 146 } while (acb[j] == 0 || (acb[j] > 2048 && (i % 11) != 10)); 147 if ((i % (RANDOMTEST_ITERATIONS/20)) == 1) 148 acb[j] += 1024*256; 149 apv[j] = rmalloc(acb[j]); 150 if (apv[j] == NULL) 86 acb[i] = rand(); 87 } while(acb[i] == 0 || acb[i] > 127); 88 89 if ((i % (NUMBER_OF_POINTERS/3)) == 1) 90 acb[i] += 1024*260; 91 apv[i] = rmalloc(acb[i]); 92 if (apv[i] == NULL) 151 93 { 152 printf("rmalloc failed, acb[%d] = %d\n", j, acb[j]); 153 if (acb[j] > 10000) 94 printf("rmalloc failed: acb[%d]=%d\n", i, acb[i]); 95 if (acb[i] > 1000) 96 break; 97 } 98 memset(apv[i], 0xA, MIN(acb[i],16)); 99 cb += acb[i]; 100 } 101 102 printf("Finished allocating memory: %d allocations %d bytes\n", i, cb); 103 104 105 printf("_res_dump_subheaps:\n"); 106 _res_dump_subheaps(); 107 108 for (i = 0; i < NUMBER_OF_POINTERS; i++) 109 { 110 int cb = _res_msize(apv[i]); 111 if (cb != ((acb[i] + 3) & ~3) && (cb < ((acb[i] + 3) & ~3) || cb > 52 + ((acb[i] + 3) & ~3)) ) 112 printf("size of avp[%d] (%d) != acb[%d] (%d)\n", i, cb, i, acb[i]); 113 rfree(apv[i]); 114 } 115 116 117 /* 118 * test _res_heapmin 119 */ 120 printf("_res_memfree - before heapmin: %d\n", _res_memfree()); 121 _res_heapmin(); 122 printf("_res_memfree - after heapmin : %d\n", _res_memfree()); 123 124 /* 125 * Test _res_dump_subheaps 126 */ 127 printf("\n_res_dump_subheaps:\n"); 128 _res_dump_subheaps(); 129 } /* fResSimple */ 130 131 132 if (fResRandom) 133 { 134 /* 135 * Test 2 - random allocation and freeing of memory. 136 */ 137 printf("\n" 138 "Random allocation and freeing test:\n"); 139 for (i = 0; i < NUMBER_OF_POINTERS; i++) 140 apv[i] = NULL, acb[i] = 0; 141 cAllocations = 0; 142 i = 0; 143 cb = 0; 144 crfree = 0; 145 crmalloc = 0; 146 crealloc = 0; 147 while (i++ < RANDOMTEST_ITERATIONS || cAllocations > 0) 148 { 149 int j; 150 j = rand(); 151 if (cAllocations + (NUMBER_OF_POINTERS/20) < NUMBER_OF_POINTERS && 152 (i < RANDOMTEST_ITERATIONS*1/4 ? (j % 8) > 4 : 153 i < RANDOMTEST_ITERATIONS*2/4 ? (j % 8) > 5 : 154 i < RANDOMTEST_ITERATIONS*3/4 ? (j % 8) > 6 : 155 i < RANDOMTEST_ITERATIONS ? (j % 8) > 6 : 0 156 ) 157 ) 158 { /* malloc */ 159 for (j = 0; j < NUMBER_OF_POINTERS && apv[j] != NULL; j++) 160 (void)0; 161 if (j < NUMBER_OF_POINTERS) 162 { 163 do 164 { 165 acb[j] = rand(); 166 } while (acb[j] == 0 || (acb[j] > 2048 && (i % 11) != 10)); 167 if ((i % (RANDOMTEST_ITERATIONS/20)) == 1) 168 acb[j] += 1024*256; 169 apv[j] = rmalloc(acb[j]); 170 if (apv[j] == NULL) 171 { 172 printf("rmalloc failed, acb[%d] = %d\n", j, acb[j]); 173 if (acb[j] > 10000) 174 continue; 175 break; 176 } 177 memset(apv[j], 0xA, MIN(acb[j],16)); 178 cAllocations++; 179 cb += acb[j]; 180 crmalloc++; 181 } 182 } 183 else 184 { /* free or realloc */ 185 if (cAllocations == 0) 154 186 continue; 155 break; 156 } 157 memset(apv[j], 0xA, MIN(acb[j],16)); 158 cAllocations++; 159 cb += acb[j]; 160 crmalloc++; 161 } 162 } 163 else 164 { /* free or realloc */ 165 if (cAllocations == 0) 166 continue; 167 168 if (cAllocations < NUMBER_OF_POINTERS/10) 169 { 170 for (j = 0; j < NUMBER_OF_POINTERS && apv[j] == NULL; j++) 171 (void)0; 172 } 173 else 174 { 175 int k = 0; 187 188 if (cAllocations < NUMBER_OF_POINTERS/10) 189 { 190 for (j = 0; j < NUMBER_OF_POINTERS && apv[j] == NULL; j++) 191 (void)0; 192 } 193 else 194 { 195 int k = 0; 196 do 197 { 198 j = rand(); 199 } while (k++ < NUMBER_OF_POINTERS/2 && (j >= NUMBER_OF_POINTERS || apv[j] == NULL)); 200 if (k >= NUMBER_OF_POINTERS/2) 201 { 202 for (j = 0; j < NUMBER_OF_POINTERS && apv[j] == NULL; j++) 203 (void)0; 204 } 205 } 206 207 if (j < NUMBER_OF_POINTERS && apv[j] != NULL) 208 { 209 int cb = _res_msize(apv[j]); 210 if (cb != ((acb[j] + 3) & ~3) && (cb < ((acb[j] + 3) & ~3) || cb > 52 + ((acb[j] + 3) & ~3)) ) 211 printf("size of avp[%d] (%d) != acb[%d] (%d)\n", j, cb, j, acb[j]); 212 if (i < RANDOMTEST_ITERATIONS*3/4 && j % 3 == 0) 213 { /* realloc */ 214 int cb; 215 void *pv; 216 crealloc++; 217 do 218 { 219 cb = rand(); 220 } while (cb == 0 || cb > 3072); 221 /* 222 if (i >= 0x1c14) 223 Int3(); 224 */ 225 pv = rrealloc(apv[j], cb); 226 if (pv == NULL) 227 { 228 printf("realloc(apv[%d](0x%08), %d) failed\n", j, apv[j], cb); 229 continue; 230 } 231 apv[j] = pv; 232 acb[j] = cb; 233 } 234 else 235 { /* free */ 236 rfree(apv[j]); 237 apv[j] = NULL; 238 cAllocations--; 239 crfree++; 240 } 241 } 242 } 243 _res_heap_check(); 244 if (RANDOMTEST_ITERATIONS/2 == i) 245 _res_dump_subheaps(); 246 if ((i % 2048) == 0) 247 printf("i=%d cAllocations=%d\n", i, cAllocations); 248 } 249 250 printf("cb=%d crfree=%d crmalloc=%d crealloc=%d\n", cb, crfree, crmalloc, crealloc); 251 252 printf("_res_dump_subheaps:\n"); 253 _res_dump_subheaps(); 254 255 printf("_res_memfree - before heapmin: %d\n", _res_memfree()); 256 _res_heapmin(); 257 printf("_res_memfree - after heapmin : %d\n", _res_memfree()); 258 259 printf("_res_dump_subheaps:\n"); 260 _res_dump_subheaps(); 261 } /* fResRandom */ 262 } /* fResTests */ 263 264 265 /* 266 * 267 * swappable heap tests 268 * swappable heap tests 269 * 270 */ 271 if (fSwpTests) 272 { 273 if (fSwpSimple) 274 { 275 /* 276 * Simple allocation test. 277 */ 278 for (i = 0; i < NUMBER_OF_POINTERS; i++) 279 { 176 280 do 177 281 { 178 j = rand(); 179 } while (k++ < NUMBER_OF_POINTERS/2 && (j >= NUMBER_OF_POINTERS || apv[j] == NULL)); 180 if (k >= NUMBER_OF_POINTERS/2) 282 acb[i] = rand(); 283 } while(acb[i] == 0 || acb[i] > 127); 284 285 if ((i % (NUMBER_OF_POINTERS/3)) == 1) 286 acb[i] += 1024*260; 287 apv[i] = smalloc(acb[i]); 288 if (apv[i] == NULL) 181 289 { 182 for (j = 0; j < NUMBER_OF_POINTERS && apv[j] == NULL; j++) 290 printf("smalloc failed: acb[%d]=%d\n", i, acb[i]); 291 if (acb[i] > 1000) 292 break; 293 } 294 memset(apv[i], 0xA, MIN(acb[i],16)); 295 cb += acb[i]; 296 } 297 298 printf("Finished allocating memory: %d allocations %d bytes\n", i, cb); 299 300 301 printf("_swp_dump_subheaps:\n"); 302 _swp_dump_subheaps(); 303 304 for (i = 0; i < NUMBER_OF_POINTERS; i++) 305 { 306 int cb = _swp_msize(apv[i]); 307 if (cb != ((acb[i] + 3) & ~3) && (cb < ((acb[i] + 3) & ~3) || cb > 52 + ((acb[i] + 3) & ~3)) ) 308 printf("size of avp[%d] (%d) != acb[%d] (%d)\n", i, cb, i, acb[i]); 309 sfree(apv[i]); 310 } 311 312 313 /* 314 * test _swp_heapmin 315 */ 316 printf("_swp_memfree - before heapmin: %d\n", _swp_memfree()); 317 _swp_heapmin(); 318 printf("_swp_memfree - after heapmin : %d\n", _swp_memfree()); 319 320 /* 321 * Test _swp_dump_subheaps 322 */ 323 printf("\n_swp_dump_subheaps:\n"); 324 _swp_dump_subheaps(); 325 } /* fSwpSimple */ 326 327 328 if (fSwpRandom) 329 { 330 /* 331 * Test 2 - random allocation and freeing of memory. 332 */ 333 printf("\n" 334 "Random allocation and freeing test:\n"); 335 for (i = 0; i < NUMBER_OF_POINTERS; i++) 336 apv[i] = NULL, acb[i] = 0; 337 cAllocations = 0; 338 i = 0; 339 cb = 0; 340 crfree = 0; 341 crmalloc = 0; 342 crealloc = 0; 343 while (i++ < RANDOMTEST_ITERATIONS || cAllocations > 0) 344 { 345 int j; 346 j = rand(); 347 if (cAllocations + (NUMBER_OF_POINTERS/20) < NUMBER_OF_POINTERS && 348 (i < RANDOMTEST_ITERATIONS*1/4 ? (j % 8) > 4 : 349 i < RANDOMTEST_ITERATIONS*2/4 ? (j % 8) > 5 : 350 i < RANDOMTEST_ITERATIONS*3/4 ? (j % 8) > 6 : 351 i < RANDOMTEST_ITERATIONS ? (j % 8) > 6 : 0 352 ) 353 ) 354 { /* malloc */ 355 for (j = 0; j < NUMBER_OF_POINTERS && apv[j] != NULL; j++) 183 356 (void)0; 184 }185 }186 187 if (j < NUMBER_OF_POINTERS && apv[j] != NULL)188 {189 int cb = _res_msize(apv[j]);190 if (cb != ((acb[j] + 3) & ~3) && (cb < ((acb[j] + 3) & ~3) || cb > 52 + ((acb[j] + 3) & ~3)))191 printf("size of avp[%d] (%d) != acb[%d] (%d)\n", j, cb, j, acb[j]);192 if (i < RANDOMTEST_ITERATIONS*3/4 && j % 3 == 0)193 { /* realloc */194 int cb;195 void *pv;196 crealloc++;197 do198 {199 cb = rand();200 } while (cb == 0 || cb > 3072);201 /*202 if (i >= 0x1c14)203 Int3();204 */205 pv = rrealloc(apv[j], cb);206 if (pv == NULL)207 {208 printf("realloc(apv[%d](0x%08), %d) failed\n", j, apv[j], cb);357 if (j < NUMBER_OF_POINTERS) 358 { 359 do 360 { 361 acb[j] = rand(); 362 } while (acb[j] == 0 || (acb[j] > 2048 && (i % 11) != 10)); 363 if ((i % (RANDOMTEST_ITERATIONS/20)) == 1) 364 acb[j] += 1024*256; 365 apv[j] = smalloc(acb[j]); 366 if (apv[j] == NULL) 367 { 368 printf("rmalloc failed, acb[%d] = %d\n", j, acb[j]); 369 if (acb[j] > 10000) 370 continue; 371 break; 372 } 373 memset(apv[j], 0xA, MIN(acb[j],16)); 374 cAllocations++; 375 cb += acb[j]; 376 crmalloc++; 377 } 378 } 379 else 380 { /* free or realloc */ 381 if (cAllocations == 0) 209 382 continue; 210 } 211 apv[j] = pv; 212 acb[j] = cb; 213 } 214 else 215 { /* free */ 216 rfree(apv[j]); 217 apv[j] = NULL; 218 cAllocations--; 219 crfree++; 220 } 221 } 222 } 223 /*_res_heap_check();*/ 224 if (RANDOMTEST_ITERATIONS/2 == i) 225 _res_dump_subheaps(); 226 if ((i % 2048) == 0) 227 printf("i=%d cAllocations=%d\n", i, cAllocations); 383 384 if (cAllocations < NUMBER_OF_POINTERS/10) 385 { 386 for (j = 0; j < NUMBER_OF_POINTERS && apv[j] == NULL; j++) 387 (void)0; 388 } 389 else 390 { 391 int k = 0; 392 do 393 { 394 j = rand(); 395 } while (k++ < NUMBER_OF_POINTERS/2 && (j >= NUMBER_OF_POINTERS || apv[j] == NULL)); 396 if (k >= NUMBER_OF_POINTERS/2) 397 { 398 for (j = 0; j < NUMBER_OF_POINTERS && apv[j] == NULL; j++) 399 (void)0; 400 } 401 } 402 403 if (j < NUMBER_OF_POINTERS && apv[j] != NULL) 404 { 405 int cb = _swp_msize(apv[j]); 406 if (cb != ((acb[j] + 3) & ~3) && (cb < ((acb[j] + 3) & ~3) || cb > 52 + ((acb[j] + 3) & ~3)) ) 407 printf("size of avp[%d] (%d) != acb[%d] (%d)\n", j, cb, j, acb[j]); 408 if (i < RANDOMTEST_ITERATIONS*3/4 && j % 3 == 0) 409 { /* realloc */ 410 int cb; 411 void *pv; 412 crealloc++; 413 do 414 { 415 cb = rand(); 416 } while (cb == 0 || cb > 3072); 417 /* 418 if (i >= 0x1c14) 419 Int3(); 420 */ 421 pv = srealloc(apv[j], cb); 422 if (pv == NULL) 423 { 424 printf("realloc(apv[%d](0x%08), %d) failed\n", j, apv[j], cb); 425 continue; 426 } 427 apv[j] = pv; 428 acb[j] = cb; 429 } 430 else 431 { /* free */ 432 sfree(apv[j]); 433 apv[j] = NULL; 434 cAllocations--; 435 crfree++; 436 } 437 } 438 } 439 _swp_heap_check(); 440 if (RANDOMTEST_ITERATIONS/2 == i) 441 _swp_dump_subheaps(); 442 if ((i % 2048) == 0) 443 printf("i=%d cAllocations=%d\n", i, cAllocations); 444 } 445 446 printf("cb=%d crfree=%d crmalloc=%d crealloc=%d\n", cb, crfree, crmalloc, crealloc); 447 448 printf("_swp_dump_subheaps:\n"); 449 _swp_dump_subheaps(); 450 451 printf("_swp_memfree - before heapmin: %d\n", _swp_memfree()); 452 _swp_heapmin(); 453 printf("_swp_memfree - after heapmin : %d\n", _swp_memfree()); 454 455 printf("_swp_dump_subheaps:\n"); 456 _swp_dump_subheaps(); 457 } /* fSwpRandom */ 228 458 } 229 230 printf("cb=%d crfree=%d crmalloc=%d crealloc=%d\n", cb, crfree, crmalloc, crealloc);231 232 printf("_res_dump_subheaps:\n");233 _res_dump_subheaps();234 235 printf("_res_memfree - before heapmin: %d\n", _res_memfree());236 _res_heapmin();237 printf("_res_memfree - after heapmin : %d\n", _res_memfree());238 239 printf("_res_dump_subheaps:\n");240 _res_dump_subheaps();241 242 243 244 /*245 *246 * swappable heap tests247 * swappable heap tests248 *249 */250 251 459 252 460 -
trunk/src/win32k/misc/rmalloc.c
r2503 r2507 1 /* $Id: rmalloc.c,v 1. 2 2000-01-23 03:20:53bird Exp $1 /* $Id: rmalloc.c,v 1.3 2000-01-24 01:45:20 bird Exp $ 2 2 * 3 3 * Resident Heap. … … 6 6 * Use with care! We're running at Ring-0! 7 7 * 8 * Copyright (c) 1999 knut st. osmundsen8 * Copyright (c) 1999-2000 knut st. osmundsen 9 9 * 10 10 * Project Odin Software License can be found in LICENSE.TXT … … 434 434 * @param cbSizeMax Maximum heapsize in bytes. 435 435 */ 436 int ResHeapInit(unsigned cbSizeInit, unsigned cbSizeMax)436 int resHeapInit(unsigned cbSizeInit, unsigned cbSizeMax) 437 437 { 438 438 unsigned cbSize = MAX(BLOCKSIZE, cbSizeInit); -
trunk/src/win32k/misc/rmalloc_avl.c
r2503 r2507 1 /* $Id: rmalloc_avl.c,v 1. 2 2000-01-23 03:20:53bird Exp $1 /* $Id: rmalloc_avl.c,v 1.3 2000-01-24 01:45:20 bird Exp $ 2 2 * 3 3 * Resident Heap - AVL. … … 6 6 * Use with care! We're running at Ring-0! 7 7 * 8 * Copyright (c) 1999 knut st. osmundsen8 * Copyright (c) 1999-2000 knut st. osmundsen 9 9 * 10 10 * Project Odin Software License can be found in LICENSE.TXT … … 12 12 */ 13 13 14 #define static 14 15 15 /******************************************************************************* 16 16 * Defined Constants And Macros * … … 18 18 #ifdef DEBUG 19 19 #define DEBUG_ALLOC 20 # undefALLWAYS_HEAPCHECK20 #define ALLWAYS_HEAPCHECK 21 21 #endif 22 22 … … 167 167 PMEMBLOCKFREE pmbfTmp; 168 168 169 pmbfTmp = (PMEMBLOCKFREE)AVLGetWithParent( (PPAVLNODECORE)&pha->pcoreFreeSize,169 pmbfTmp = (PMEMBLOCKFREE)AVLGetWithParent(&pha->pcoreFreeSize, 170 170 (PPAVLNODECORE)SSToDS(&pmbfParent), 171 171 pmbf->coreFree.Key); … … 191 191 if (pmbfTmp->pmbfNext == NULL) 192 192 { /* no list - no other nodes of this size: simply remove it. */ 193 AVLRemove( (PPAVLNODECORE)&pha->pcoreFreeSize, pmbf->coreFree.Key);193 AVLRemove(&pha->pcoreFreeSize, pmbf->coreFree.Key); 194 194 } 195 195 else … … 200 200 pmbfParent = MEMBLOCKFREE_FROM_FREESIZENODE(pmbfParent); 201 201 if (pmbfTmp->coreFree.Key < pmbfParent->coreFree.Key) 202 pmbfParent->coreFree.pLeft = (PAVLNODECORE)&pmbf->pmbfNext->coreFree;202 pmbfParent->coreFree.pLeft = &pmbf->pmbfNext->coreFree; 203 203 else 204 pmbfParent->coreFree.pRight = (PAVLNODECORE)&pmbf->pmbfNext->coreFree;204 pmbfParent->coreFree.pRight = &pmbf->pmbfNext->coreFree; 205 205 } 206 206 else 207 pha->pcoreFreeSize = (PAVLNODECORE)&pmbf->pmbfNext->coreFree;207 pha->pcoreFreeSize = &pmbf->pmbfNext->coreFree; 208 208 } 209 209 } … … 221 221 PMEMBLOCKFREE pmbfTmp; 222 222 223 pmbfTmp = (PMEMBLOCKFREE)AVLGet( (PPAVLNODECORE)&pha->pcoreFreeSize, pmbf->coreFree.Key);223 pmbfTmp = (PMEMBLOCKFREE)AVLGet(&pha->pcoreFreeSize, pmbf->coreFree.Key); 224 224 if (pmbfTmp != NULL) 225 225 { … … 234 234 { 235 235 pmbf->pmbfNext = NULL; 236 AVLInsert( (PPAVLNODECORE)&pha->pcoreFreeSize, &pmbf->coreFree);236 AVLInsert(&pha->pcoreFreeSize, &pmbf->coreFree); 237 237 } 238 238 } … … 248 248 static void resInsertFree(PHEAPANCHOR pha, PMEMBLOCK pmb) 249 249 { 250 /* some more work left here... */251 250 PMEMBLOCKFREE pmbf = (PMEMBLOCKFREE)pmb; 252 251 PMEMBLOCKFREE pmbfRight; … … 401 400 register PHEAPANCHOR pha = *ppha; 402 401 PMEMBLOCK pmb; 402 memset(pha, 0, sizeof(*pha)); 403 403 404 404 /* anchor block */ … … 407 407 #endif 408 408 pha->cbSize = cbBlockSize; 409 pha->pmbUsed = NULL;410 pha->cbUsed = 0;411 pha->cbFree = 0;412 pha->pcoreFreeSize = NULL;413 409 414 410 /* free memblock */ … … 458 454 * NULL is allowed. 459 455 * @param pvUser User pointer to find the block to. 460 * @param fWithin When this flag is set, the pointer may point anywhere within the block.461 * When clear, it has to point exactly at the start of the user data area.462 456 */ 463 457 static PMEMBLOCK resFindUsedBlock(PHEAPANCHOR *ppha, void *pvUser) 464 458 { 465 if (pvUser != NULL && ppha != NULL)459 if (pvUser != NULL) 466 460 { 467 461 register PHEAPANCHOR pha = phaFirst; … … 524 518 if (pha->ulSignature != HEAPANCHOR_SIGNATURE) 525 519 { 526 kprintf(("resFind UsedBlock: Invalid heapanchor signature.\n"));520 kprintf(("resFindWithinUsedBlock: Invalid heapanchor signature.\n")); 527 521 return NULL; 528 522 } … … 534 528 if (pmb != NULL 535 529 && (unsigned)pmb + pmb->cbSize + CB_HDR > (unsigned)pvUser 536 && (unsigned)pmb + CB_HDR >= (unsigned)pvUser530 && (unsigned)pmb + CB_HDR <= (unsigned)pvUser 537 531 ) 538 532 { … … 558 552 * @param cbSizeMax Maximum heapsize in bytes. 559 553 */ 560 int ResHeapInit(unsigned cbSizeInit, unsigned cbSizeMax)554 int resHeapInit(unsigned cbSizeInit, unsigned cbSizeMax) 561 555 { 562 556 unsigned cbSize = MAX(BLOCKSIZE, cbSizeInit); … … 600 594 #ifdef ALLWAYS_HEAPCHECK 601 595 if (!_res_heap_check()) 602 { 603 /* error! */604 kprintf(("%s: _res_heap_check failed!\n", "heapInit"));596 { /* error! */ 597 kprintf(("resHeapInit: _res_heap_check failed!\n")); 598 #ifdef DEBUG 605 599 Int3(); 600 #endif 606 601 return -2; 607 602 } … … 623 618 void * rmalloc(unsigned cbSize) 624 619 { 625 void *pvRet = NULL;626 627 620 #ifdef ALLWAYS_HEAPCHECK 628 629 630 631 632 621 if (!_res_heap_check()) 622 { 623 kprintf(("rmalloc: _res_heap_check failed!\n")); 624 return NULL; 625 } 633 626 #endif 634 627 … … 640 633 { 641 634 resInsertUsed(pha, pmb); 642 pvRet =&pmb->achUserData[0];635 return &pmb->achUserData[0]; 643 636 } 644 637 } 645 638 else 646 { /* error! */647 639 kprintf(("rmalloc: error cbSize = 0\n")); 648 } 649 650 return pvRet; 640 641 return NULL; 651 642 } 652 643 … … 665 656 666 657 #ifdef ALLWAYS_HEAPCHECK 667 668 669 kprintf(("rmalloc: _res_heap_check failed!\n"));670 671 658 if (!_res_heap_check()) 659 { 660 kprintf(("rrealloc: _res_heap_check failed!\n")); 661 return NULL; 662 } 672 663 #endif 673 664 pmb = resFindUsedBlock(SSToDS(&pha), pv); … … 684 675 PMEMBLOCKFREE pmbfNew = (PMEMBLOCKFREE)((unsigned)pmb + CB_HDR + cbNew); 685 676 #ifdef DEBUG_ALLOC 686 677 pmbfNew->ulSignature = MEMBLOCK_SIGNATURE; 687 678 #endif 688 679 pha->cbUsed -= pmb->cbSize - cbNew; … … 691 682 resInsertFree(pha, (PMEMBLOCK)pmbfNew); 692 683 #ifdef ALLWAYS_HEAPCHECK 693 if (!_res_heap_check()) 684 if (!_res_heap_check()) 685 { 686 kprintf(("rrealloc: _res_heap_check failed!\n")); 687 return NULL; 688 } 689 #endif 690 } 691 } 692 else 693 { /* expand block - this code may be optimized... */ 694 #if 0 695 pvRet = rmalloc(cbNew); 696 if (pvRet != NULL) 697 { 698 memcpy(pvRet, pv, pmb->cbSize); 699 rfree(pv); 700 } 701 #else 702 /* optimized FIXME! */ 703 PMEMBLOCKFREE pmbfRightParent; 704 PMEMBLOCKFREE pmbfRight = (PMEMBLOCKFREE)AVLGetWithParent((PPAVLNODECORE)&pha->pmbFree, 705 (PPAVLNODECORE)SSToDS(&pmbfRightParent), 706 (AVLKEY)PNEXT_BLOCK(pmb)); 707 if (pmbfRight != NULL && pmbfRight->coreFree.Key + pmb->cbSize + CB_HDR >= cbNew) 708 { 709 pvRet = pv; 710 /* split the free block? */ 711 if (pmbfRight->coreFree.Key + pmb->cbSize + CB_HDR - sizeof(MEMBLOCKFREE) >= cbNew) 712 { 713 unsigned cb = pmbfRight->coreFree.Key; 714 PMEMBLOCKFREE pmbfNew = (PMEMBLOCKFREE)((unsigned)pmb + CB_HDR + cbNew); 715 resRemoveFromFreeSize(pha, pmbfRight); 716 pmbfNew->coreFree.Key = cb + pmb->cbSize - cbNew; 717 memmove((void*)&pmbfNew->core, (void*)&pmbfRight->core, sizeof(pmbfNew->core)); 718 pmbfNew->core.Key = (AVLKEY)pmbfNew; 719 #ifdef DEBUG_ALLOC 720 pmbfNew->ulSignature = MEMBLOCK_SIGNATURE; 721 #endif 722 if (pmbfRightParent != NULL) 694 723 { 695 kprintf(("rrealloc: _res_heap_check failed!\n")); 724 if (pmbfNew < pmbfRightParent) 725 pmbfRightParent->core.pLeft = &pmbfNew->core; 726 else 727 pmbfRightParent->core.pRight = &pmbfNew->core; 728 } 729 else 730 pha->pmbFree = (PMEMBLOCK)pmbfNew; 731 732 resInsertIntoFreeSize(pha, pmbfNew); 733 pha->cbUsed += cbNew - pmb->cbSize; 734 pha->cbFree -= cb - pmbfNew->coreFree.Key; 735 pmb->cbSize = cbNew; 736 } 737 else 738 { 739 if (AVLRemove((PPAVLNODECORE)&pha->pmbFree, (AVLKEY)pmbfRight) != (PAVLNODECORE)pmbfRight) 740 { 741 kprintf(("rrealloc: AVLRemove failed for pmbfRight - hmm!\n")); 696 742 return NULL; 697 743 } 698 #endif 744 resRemoveFromFreeSize(pha, pmbfRight); 745 pmb->cbSize += pmbfRight->coreFree.Key + CB_HDR; 746 pha->cbFree -= pmbfRight->coreFree.Key; 747 pha->cbUsed += pmbfRight->coreFree.Key + CB_HDR; 748 } 749 699 750 } 700 } 701 else 702 { /* expand block - this code may be more optimized... */ 703 #if 1 751 else 752 { /* worst case: allocate a new block, copy data and free the old block. */ 704 753 pvRet = rmalloc(cbNew); 705 754 if (pvRet != NULL) … … 708 757 rfree(pv); 709 758 } 710 #else 711 /* optimized */ 712 PMEMBLOCK pmb 759 } 713 760 #endif 714 761 } … … 779 826 #ifdef ALLWAYS_HEAPCHECK 780 827 if (!_res_heap_check()) 781 kprintf(("_ msize: _res_heap_check failed!\n"));828 kprintf(("_res_msize: _res_heap_check failed!\n")); 782 829 #endif 783 830 … … 799 846 #ifdef ALLWAYS_HEAPCHECK 800 847 if (!_res_heap_check()) 801 kprintf(("_ validptr: _res_heap_check failed!\n"));848 kprintf(("_res_validptr: _res_heap_check failed!\n")); 802 849 #endif 803 850 … … 820 867 #ifdef ALLWAYS_HEAPCHECK 821 868 if (!_res_heap_check()) 822 kprintf(("_ validptr: _res_heap_check failed!\n"));869 kprintf(("_res_validptr: _res_heap_check failed!\n")); 823 870 #endif 824 871 … … 843 890 #ifdef ALLWAYS_HEAPCHECK 844 891 if (!_res_heap_check()) 845 kprintf((" res_memfree: _res_heap_check failed!\n"));892 kprintf(("_res_memfree: _res_heap_check failed!\n")); 846 893 #endif 847 894 … … 988 1035 else 989 1036 { 990 PMEMBLOCKFREE pmbf = (PMEMBLOCKFREE)AVLGet( (PPAVLNODECORE)&pha->pcoreFreeSize, pmbFree->cbSize);1037 PMEMBLOCKFREE pmbf = (PMEMBLOCKFREE)AVLGet(&pha->pcoreFreeSize, pmbFree->cbSize); 991 1038 if (pmbf != NULL) 992 1039 { … … 1127 1174 if (pNode == NULL) 1128 1175 return 0; 1129 if (pNode->Key < 4 || (pNode->Key % 4) != 0)1176 if (pNode->Key < 4 || (pNode->Key % ALIGNMENT) != 0) 1130 1177 { 1131 1178 kprintf(("resCheckAVLTreeFree: Invalid Key! 0x%08x\n", pNode->Key)); … … 1208 1255 #endif 1209 1256 if (rc != NO_ERROR) 1210 kprintf(("_res_heapmin: DosFreeMem failed for pha=0x%08x, rc = %d\n",1257 kprintf(("_res_heapmin: DosFreeMem/D32Help_VMFree failed for pha=0x%08x, rc = %d\n", 1211 1258 pha, rc)); 1212 1259 }
Note:
See TracChangeset
for help on using the changeset viewer.