| 429 | } |
| 430 | |
| 431 | void NULLC::CollectMemory() |
| 432 | { |
| 433 | // printf("%d used memory (%d collectable cap, %d max cap)\r\n", usedMemory, collectableMinimum, globalMemoryLimit); |
| 434 | |
| 435 | double time = (double(clock()) / CLOCKS_PER_SEC); |
| 436 | |
| 437 | // All memory blocks are marked with 0 |
| 438 | MarkMemory(0); |
| 439 | // Used memory blocks are marked with 1 |
| 440 | MarkUsedBlocks(); |
| 441 | |
| 442 | markTime += (double(clock()) / CLOCKS_PER_SEC) - time; |
| 443 | time = (double(clock()) / CLOCKS_PER_SEC); |
| 444 | |
| 445 | // Globally allocated objects marked with 0 are deleted |
| 446 | unsigned int unusedBlocks = 0; |
| 447 | for(unsigned int i = 0; i < globalObjects.size(); i++) |
| 448 | { |
| 449 | markerType &marker = *(markerType*)((char*)globalObjects[i] + 4); |
| 450 | if(!(marker & NULLC::OBJECT_VISIBLE)) |
| 451 | { |
| 452 | if((marker & NULLC::OBJECT_FINALIZABLE) && !(marker & NULLC::OBJECT_FINALIZED)) |
| 453 | { |
| 454 | NULLC::FinalizeObject(marker, (char*)globalObjects[i] + 4); |
| 455 | }else{ |
| 456 | usedMemory -= *(unsigned int*)globalObjects[i]; |
| 457 | NULLC::dealloc(globalObjects[i]); |
| 458 | globalObjects[i] = globalObjects.back(); |
| 459 | globalObjects.pop_back(); |
| 460 | unusedBlocks++; |
| 461 | i--; |
| 462 | } |
| 463 | } |
| 464 | } |
| 465 | // printf("%d unused globally allocated blocks destroyed (%d remains)\r\n", unusedBlocks, globalObjects.size()); |
| 466 | |
| 467 | // printf("%d used memory\r\n", usedMemory); |
| 468 | |
| 469 | // Objects allocated from pools are freed |
| 470 | unusedBlocks = pool8.FreeMarked(); |
| 471 | usedMemory -= unusedBlocks * 8; |
| 472 | // printf("%d unused pool blocks freed (8 bytes)\r\n", unusedBlocks); |
| 473 | unusedBlocks = pool16.FreeMarked(); |
| 474 | usedMemory -= unusedBlocks * 16; |
| 475 | // printf("%d unused pool blocks freed (16 bytes)\r\n", unusedBlocks); |
| 476 | unusedBlocks = pool32.FreeMarked(); |
| 477 | usedMemory -= unusedBlocks * 32; |
| 478 | // printf("%d unused pool blocks freed (32 bytes)\r\n", unusedBlocks); |
| 479 | unusedBlocks = pool64.FreeMarked(); |
| 480 | usedMemory -= unusedBlocks * 64; |
| 481 | // printf("%d unused pool blocks freed (64 bytes)\r\n", unusedBlocks); |
| 482 | unusedBlocks = pool128.FreeMarked(); |
| 483 | usedMemory -= unusedBlocks * 128; |
| 484 | // printf("%d unused pool blocks freed (128 bytes)\r\n", unusedBlocks); |
| 485 | unusedBlocks = pool256.FreeMarked(); |
| 486 | usedMemory -= unusedBlocks * 256; |
| 487 | // printf("%d unused pool blocks freed (256 bytes)\r\n", unusedBlocks); |
| 488 | unusedBlocks = pool512.FreeMarked(); |