#include <heap_allocator.h>
|
|
Definition at line 220 of file src/memory/heap_allocator.h. |
|
|
Definition at line 208 of file src/memory/heap_allocator.h.
00209 {
00210 ReleaseHeaderSize = 8,
00211 CategoryStringLength = 8,
00212 BeginNodeMarkers = '<',
00213 EndNodeMarkers = '>',
00214 UnallocatedMemory = 0xba,
00215 UninitializedMemory = 0xbc,
00216 DeletedMemory = 0xbd,
00217 NameLength = 32
00218 };
|
|
|
Definition at line 253 of file src/memory/heap_allocator.h.
00254 {
00255 FreeNodeBlockSize = 128,
00256 FreeNodeBlockSizeShift = 7,
00257 FreeNodeBlockSizeMask = 0x7f
00258 };
|
|
|
Definition at line 261 of file src/memory/heap_allocator.h.
00262 {
00263 Align = 8,
00264 BlockDataSizeMin = 1<<4
00265 };
|
|
|
Definition at line 379 of file src/memory/heap_allocator.h.
00380 {
00381 UserDataBlockSizeMin = sizeof(CFreeNode)
00382 };
|
|
|
Definition at line 451 of file src/memory/heap_allocator.h.
00452 {
00453 // Small block granularity
00454 SmallBlockGranularityShift = 3,
00455
00456 // Small block granularity
00457 SmallBlockGranularity = 1<<SmallBlockGranularityShift,
00458
00459 // Smallest block size
00460 FirstSmallBlock = 8,
00461
00462 // Largest block size
00463 LastSmallBlock = 128,
00464
00465 // Size of a smallblock pool
00466 SmallBlockPoolSize = 20
00467 };
|
|
|
Block allocation mode.
Definition at line 72 of file src/memory/heap_allocator.h.
|
|
|
Out of memory signal
Definition at line 84 of file src/memory/heap_allocator.h.
00085 {
00087 ThrowException,
00088
00090 ReturnNull
00091 };
|
|
||||||||||||||||||||
|
Constructor / Destructor Definition at line 936 of file memory/heap_allocator.cpp. References NLMEMORY::line, uint32, and uint8.
00961 {
00962 // Fill informations for the second part of the node
00963
00964 // Get the freeNode
00965 freeNode = getFreeNode (rest);
00966
00967 // Insert the free node
00968 insert (freeNode);
00969
00970 // Crc node
00971 NL_UPDATE_MAGIC_NUMBER (rest);
00972 }
00973
00974 // Check the node size
00975 internalAssert ( size <= getNodeSize (node) );
00976 internalAssert ( std::max ((uint)BlockDataSizeMin, size + (uint)Align) + sizeof (CNodeBegin) + sizeof (CNodeEnd) + sizeof (CNodeBegin) + sizeof (CNodeEnd) + BlockDataSizeMin >= getNodeSize (node) );
00977
00978 // Check pointer alignment
00979 internalAssert (((uint32)node&(Align-1)) == 0);
00980 internalAssert (((uint32)((char*)node + sizeof(CNodeBegin))&(Align-1)) == 0);
00981
00982 // Check size
00983 internalAssert ((uint32)node->EndMagicNumber <= (uint32)((uint8*)node+sizeof(CNodeBegin)+getNodeSize (node) ));
00984 internalAssert ((uint32)node->EndMagicNumber > (uint32)(((uint8*)node+sizeof(CNodeBegin)+getNodeSize (node) ) - BlockDataSizeMin - BlockDataSizeMin - sizeof(CNodeBegin) - sizeof(CNodeEnd)));
00985
00986 leaveCriticalSectionLB ();
00987
00988 // Return the user pointer
00989 return (void*)((uint)node + sizeof (CNodeBegin));
00990 }
00991 else
00992 {
00993 // ********
|
|
|
Destruction Definition at line 997 of file memory/heap_allocator.cpp. References NL_ALLOC_STOP.
01006 {
|
|
||||||||||||||||||||
|
Definition at line 1527 of file memory/heap_allocator.cpp. Referenced by NLMEMORY::__declspec().
01528 {
01529 catMap = CCategoryMap::insert (current->Category, catMap);
01530 cat = catMap;
01531 }
01532 uint size = getNodeSize (current) + ReleaseHeaderSize;
01533 cat->BlockCount++;
01534 cat->Size += size;
01535 if (size < cat->Min)
01536 cat->Min = size;
01537 if (size > cat->Max)
01538 cat->Max = size;
01539 }
01540
01541 // Next node
01542 current = getNextNode (current);
01543 largeBlockCount++;
01544 }
01545
01546 // Next block
01547 currentBlock = currentBlock->Next;
01548 }
01549
01550 // Write the heap info file
01551 fprintf (file, "HEAP STATISTICS\n");
01552 fprintf (file, "HEAP, TOTAL MEMORY USED, ALLOCATED MEMORY, FREE MEMORY, FRAGMENTATION RATIO, MAIN BLOCK SIZE, MAIN BLOCK COUNT\n");
01553
01554 fprintf (file, "%s, %d, %d, %d, %f%%, %d, %d\n", _Name, getTotalMemoryUsed (),
01555 getAllocatedMemory (), getFreeMemory (), 100.f*getFragmentationRatio (), getMainBlockSize (), getMainBlockCount ());
01556
01557 fprintf (file, "\n\nHEAP BLOCKS\n");
01558 fprintf (file, "SMALL BLOCK MEMORY, SMALL BLOCK COUNT, LARGE BLOCK COUNT\n");
01559
01560 fprintf (file, "%d, %d, %d\n", getSmallBlockMemory (), smallBlockCount, largeBlockCount);
01561
01562 fprintf (file, "\n\nHEAP DEBUG INFOS\n");
01563 fprintf (file, "SB DEBUG INFO, LB DEBUG INFO, TOTAL DEBUG INFO\n");
01564
01565 fprintf (file, "%d, %d, %d\n", debugGetSBDebugInfoSize (), debugGetLBDebugInfoSize (), debugGetDebugInfoSize ());
01566
01567 // **************************
01568
01569 // Write the system heap info file
01570 uint systemMemory = getAllocatedSystemMemory ();
01571 uint hookedSystemMemory = GetAllocatedSystemMemoryHook ();
01572 uint nelSystemMemory = getAllocatedSystemMemoryByAllocator ();
01573
01574 fprintf (file, "\n\nSYSTEM HEAP STATISTICS\n");
01575 fprintf (file, "SYSTEM HEAP ALLOCATED MEMORY, TOTAL HOOKED MEMORY, NEL ALLOCATED MEMORY, OTHER ALLOCATED MEMORY, NOT HOOKED MEMORY\n");
01576 fprintf (file, "%d, %d, %d, %d, %d\n", systemMemory, hookedSystemMemory, nelSystemMemory, hookedSystemMemory-nelSystemMemory, systemMemory-hookedSystemMemory);
01577
01578 // **************************
01579
01580 // Write the category map file
01581 fprintf (file, "\n\n\nCATEGORY STATISTICS\n");
01582 fprintf (file, "CATEGORY, BLOCK COUNT, MEMORY ALLOCATED, MIN BLOCK SIZE, MAX BLOCK SIZE, AVERAGE BLOCK SIZE, SB COUNT 8, SB COUNT 16, SB COUNT 24, SB COUNT 32, SB COUNT 40, SB COUNT 48, SB COUNT 56, SB COUNT 64, SB COUNT 72, SB COUNT 80, SB COUNT 88, SB COUNT 96, SB COUNT 104, SB COUNT 112, SB COUNT 120, SB COUNT 128\n");
01583
01584 CCategoryMap *cat = catMap;
01585 while (cat)
01586 {
01587 CCategoryMap *next = cat->Next;
01588
01589 // Number of small blocks
01590 uint smallB[NL_SMALLBLOCK_COUNT];
01591
01592 // Clean
01593 uint smallBlock;
01594 for (smallBlock=0; smallBlock<NL_SMALLBLOCK_COUNT; smallBlock++)
01595 {
01596 smallB[smallBlock] = 0;
01597 }
01598
01599 // Scan small block for this category
01600 currentSB = (CSmallBlockPool *)_SmallBlockPool;
01601 while (currentSB)
01602 {
01603 // For each node in this small block pool
01604 uint block;
01605 for (block=0; block<SmallBlockPoolSize; block++)
01606 {
01607 // Get the node
01608 const CNodeBegin *current = getSmallBlock (currentSB, block);
01609
01610 // Node allocated ?
01611 if (isNodeUsed (current))
01612 {
01613 // Good node ?
01614 if (strcmp (current->Category, cat->Name) == 0)
01615 {
01616 // Get the small block index
01617 uint index = NL_SIZE_TO_SMALLBLOCK_INDEX (getNodeSize (current));
01618
01619 // One more node
01620 smallB[index]++;
01621 }
01622 }
01623 }
01624
01625 // Next block
01626 currentSB = currentSB->Next;
01627 }
01628
01629 // Average
01630 uint average = cat->Size / cat->BlockCount;
01631
01632 // Print the line
01633 fprintf (file, "%s, %d, %d, %d, %d, %d", cat->Name, cat->BlockCount, cat->Size,
01634 cat->Min, cat->Max, average);
01635
01636 // Print small blocks
01637 for (smallBlock=0; smallBlock<NL_SMALLBLOCK_COUNT; smallBlock++)
01638 {
01639 fprintf (file, ", %d", smallB[smallBlock]);
01640 }
01641
01642 fprintf (file, "\n");
01643
01644 delete cat;
01645 cat = next;
01646 }
01647
01648 // **************************
01649
01650 // Write the small block statistics
01651 fprintf (file, "\n\n\nSMALL BLOCK STATISTICS\n");
01652 fprintf (file, "SIZE, BLOCK COUNT, BLOCK FREE, BLOCK USED, TOTAL MEMORY USED\n");
01653
01654 // Number of small blocks
01655 uint count[NL_SMALLBLOCK_COUNT];
01656 uint free[NL_SMALLBLOCK_COUNT];
01657
01658 uint smallBlock;
01659 for (smallBlock=0; smallBlock<NL_SMALLBLOCK_COUNT; smallBlock++)
01660 {
01661 count[smallBlock] = 0;
01662 free[smallBlock] = 0;
01663 }
01664
01665 // For each small block
01666 currentSB = (CSmallBlockPool *)_SmallBlockPool;
01667 while (currentSB)
01668 {
01669 // For each node in this small block pool
01670 uint block;
01671 for (block=0; block<SmallBlockPoolSize; block++)
01672 {
01673 // Get the node
01674 const CNodeBegin *current = getSmallBlock (currentSB, block);
01675
01676 // Get the small block index
01677 uint index = NL_SIZE_TO_SMALLBLOCK_INDEX (getNodeSize (current));
01678
01679 // Add a block
01680 count[index]++;
01681
01682 // Node allocated ?
01683 if (isNodeFree (current))
01684 {
01685 // Add a free block
01686 free[index]++;
01687 }
01688
01689 // Next node
01690 current = getNextNode (current);
01691 }
01692
01693 // Next block
01694 currentSB = currentSB->Next;
01695 }
01696
01697 // Print stats
01698 for (smallBlock=0; smallBlock<NL_SMALLBLOCK_COUNT; smallBlock++)
01699 {
01700 uint size = (smallBlock+1)*SmallBlockGranularity;
01701 fprintf (file,"%d, %d, %d, %d, %d\n",size, count[smallBlock], free[smallBlock],
01702 count[smallBlock]-free[smallBlock], count[smallBlock]*(sizeof (CNodeBegin) + size + NL_HEAP_NODE_END_SIZE));
01703 }
01704
01705 // **************************
01706
01707 // Write the memory map file
01708 if (memoryMap)
01709 {
01710 fprintf (file, "\n\n\nHEAP LARGE BLOCK DUMP\n");
01711 fprintf (file, "ADDRESS, SIZE, CATEGORY, HEAP, STATE, SOURCE, LINE\n");
01712
01713 // For each main block
01714 currentBlock = _MainBlockList;
01715 while (currentBlock)
01716 {
01717 // Get the first node
01718 const CNodeBegin *current = getFirstNode (currentBlock);
01719 while (current)
01720 {
01721 // Write the entry
01722 fprintf (file, "0x%08x, %d, %s, %s, %s, %s, %d\n", (uint)current + sizeof(CNodeBegin),
01723 getNodeSize (current), current->Category, _Name,
01724 isNodeFree (current)?"free":"used", current->File, current->Line);
01725
01726 // Next node
01727 current = getNextNode (current);
01728 }
01729
01730 // Next block
01731 currentBlock = currentBlock->Next;
01732 }
01733 }
01734
01735 // File created successfuly
01736 status = true;
01737 }
01738
01739 // Close
01740 if (file)
01741 fclose (file);
01742
01743 debugPopCategoryString ();
01744
01745 return status;
01746 }
01747 #endif // NL_HEAP_ALLOCATION_NDEBUG
01748
01749 // *********************************************************
01750
01751 uint CHeapAllocator::getFreeMemory () const
01752 {
01753 enterCriticalSection ();
01754
01755 // Sum free memory
01756 uint memory = 0;
01757
01758 // For each small block
01759 CSmallBlockPool *currentSB = (CSmallBlockPool *)_SmallBlockPool;
01760 while (currentSB)
01761 {
01762 // For each node in this small block pool
01763 uint block;
01764 for (block=0; block<SmallBlockPoolSize; block++)
01765 {
01766 // Get the node
01767 const CNodeBegin *current = getSmallBlock (currentSB, block);
01768
01769 // Node allocated ?
01770 if (isNodeFree (current))
01771 memory += getNodeSize (current) + ReleaseHeaderSize;
01772
01773 // Next node
01774 current = getNextNode (current);
01775 }
01776
01777 // Next block
01778 currentSB = currentSB->Next;
01779 }
01780
01781 // For each main block
01782 CMainBlock *currentBlock = _MainBlockList;
01783 while (currentBlock)
01784 {
01785 // Get the first node
01786 const CNodeBegin *current = getFirstNode (currentBlock);
01787 while (current)
01788 {
01789 #ifndef NL_HEAP_ALLOCATION_NDEBUG
01790 // Check node
01791 checkNode (current, evalMagicNumber (current));
01792 #endif // NL_HEAP_ALLOCATION_NDEBUG
01793
01794 // Node allocated ?
01795 if (isNodeFree (current))
01796 memory += getNodeSize (current) + ReleaseHeaderSize;
01797
01798 // Next node
01799 current = getNextNode (current);
01800 }
01801
01802 // Next block
01803 currentBlock = currentBlock->Next;
01804 }
01805
01806 leaveCriticalSection ();
01807
01808 // Return memory used
01809 return memory;
01810 }
01811
01812 // *********************************************************
01813
01814 uint CHeapAllocator::getTotalMemoryUsed () const
01815 {
01816 enterCriticalSection ();
01817
01818 // Sum total memory
01819 uint memory = 0;
01820
01821 // For each main block
01822 CMainBlock *currentBlock = _MainBlockList;
01823 while (currentBlock)
01824 {
01825 // Get block size
01826 memory += currentBlock->Size;
01827
01828 // Sum the arrays
01829 memory += sizeof (CMainBlock);
01830
01831 // Next block
01832 currentBlock = currentBlock->Next;
01833 }
01834
01835 leaveCriticalSection ();
01836
01837 // Return the memory
01838 return memory;
01839 }
01840
01841 // *********************************************************
01842
01843 uint CHeapAllocator::getSmallBlockMemory () const
01844 {
01845 enterCriticalSection ();
01846
01847 // Sum total memory
01848 uint memory = 0;
01849
01850 // For each small block
01851 CSmallBlockPool *currentSB = (CSmallBlockPool *)_SmallBlockPool;
01852 while (currentSB)
01853 {
01854 // Get block size
01855 memory += sizeof(CSmallBlockPool) + SmallBlockPoolSize * (sizeof(CNodeBegin) + currentSB->Size +
01856 NL_HEAP_NODE_END_SIZE);
01857
01858 // Next block
01859 currentSB = currentSB->Next;
01860 }
01861
01862 leaveCriticalSection ();
01863
01864 // Return the memory
01865 return memory;
01866 }
01867
01868 // *********************************************************
01869
01870 float CHeapAllocator::getFragmentationRatio () const
01871 {
01872 enterCriticalSection ();
01873
01874 // Sum free and used node
01875 float free = 0;
01876 float used = 0;
01877
01878 // For each main block
01879 CMainBlock *currentBlock = _MainBlockList;
01880 while (currentBlock)
01881 {
01882 // Get the first node
01883 const CNodeBegin *current = getFirstNode (currentBlock);
01884 while (current)
01885 {
01886 // Node allocated ?
01887 if (isNodeUsed (current))
01888 used++;
01889 else
01890 free++;
01891
01892 // Next node
|
|
|
Method used to allocate system memory Definition at line 3038 of file memory/heap_allocator.cpp. |
|
||||||||||||||||
|
Definition at line 640 of file memory/heap_allocator.cpp.
00652 {
00653 // Check size is valid
00654 if (size != 0)
00655 {
00656 #ifndef NL_HEAP_ALLOCATION_NDEBUG
00657 // If category is NULL
00658 if (category == NULL)
00659 {
00660 // Get the current category
00661 CCategory *cat = (CCategory*)_CategoryStack.getPointer ();
00662 if (cat)
00663 {
00664 category = cat->Name;
00665 }
00666 else
00667 {
00668 // Not yet initialised
00669 category = NL_HEAP_UNKNOWN_CATEGORY;
00670 }
00671 }
00672
00673 /* trap debug if (strcmp(category,"3dIns") == 0)
00674 {
00675 n3dDrvTotal += size;
00676 uint dbg= 0;
00677 dbg++;
00678 }
00679 */
00680
00681 // Checks ?
00682 if (_AlwaysCheck)
00683 {
00684 // Check heap integrity
00685 internalCheckHeap (true);
00686 }
00687
00688 // Check breakpoints
00689 /*if (_Breakpoints.find (_AllocateCount) != _Breakpoints.end())
00690 {
00691 // ********
00692 // * STOP *
00693 // ********
00694 // * Breakpoints allocation
00695 // ********
00696 NL_ALLOC_STOP;
00697 }*/
00698 #endif // NL_HEAP_ALLOCATION_NDEBUG
00699
00700 // Small or largs block ?
00701 #ifdef NL_HEAP_NO_SMALL_BLOCK_OPTIMIZATION
00702 if (0)
00703 #else // NL_HEAP_NO_SMALL_BLOCK_OPTIMIZATION
00704 if (size <= LastSmallBlock)
00705 #endif// NL_HEAP_NO_SMALL_BLOCK_OPTIMIZATION
00706 {
00707 // *******************
00708 // Small block
00709 // *******************
00710
00711 enterCriticalSectionSB ();
00712
00713 // Get pointer on the free block list
00714 CNodeBegin **freeNode = (CNodeBegin **)_FreeSmallBlocks+NL_SIZE_TO_SMALLBLOCK_INDEX (size);
00715
00716 // Not found ?
00717 if (*freeNode == NULL)
00718 {
00719 leaveCriticalSectionSB ();
00720
00721 // Size must be aligned
00722 uint alignedSize = NL_ALIGN_SIZE_FOR_SMALLBLOCK (size);
00723
00724 // Use internal allocator
00725 CSmallBlockPool *smallBlock = (CSmallBlockPool *)NelAlloc (*this, sizeof(CSmallBlockPool) + SmallBlockPoolSize * (sizeof(CNodeBegin) + alignedSize +
00726 NL_HEAP_NODE_END_SIZE), NL_HEAP_SB_CATEGORY);
00727
00728 enterCriticalSectionSB ();
00729
00730 // Link this new block
00731 smallBlock->Size = alignedSize;
00732 smallBlock->Next = (CSmallBlockPool*)_SmallBlockPool;
00733 _SmallBlockPool = smallBlock;
00734
00735 // Initialize the block
00736 uint pool;
00737 CNodeBegin *nextNode = *freeNode;
|
|
|
Definition at line 3029 of file memory/heap_allocator.cpp. |
|
||||||||||||
|
Definition at line 3193 of file memory/heap_allocator.cpp. |
|
||||||||||||||||||||||||
|
Definition at line 540 of file memory/heap_allocator.cpp.
00568 {
00569 // Get the node pointer
00570 CNodeBegin *node = getFirstNode (&mainBlock);
00571
00572 // Allocated size remaining after alignment
00573 internalAssert ((uint32)node - (uint32)mainBlock.Ptr >= 0);
00574 uint allocSize = mainBlock.Size - ((uint32)node - (uint32)mainBlock.Ptr);
00575
00576 // *** Fill the new node header
00577
00578 // User data size
00579 setNodeSize (node, allocSize-sizeof (CNodeBegin)-NL_HEAP_NODE_END_SIZE);
00580
00581 // Node is free
00582 setNodeFree (node);
00583
00584 // Node is last
00585 setNodeLast (node, true);
00586
00587 // No previous node
00588 node->Previous = NULL;
00589
00590 // Debug info
00591 #ifndef NL_HEAP_ALLOCATION_NDEBUG
00592 // End magic number
00593 node->EndMagicNumber = (uint32*)((uint8*)node + getNodeSize (node) + sizeof (CNodeBegin));
00594
00595 // Begin markers
00596 memset (node->BeginMarkers, BeginNodeMarkers, CNodeBegin::MarkerSize-1);
00597 node->BeginMarkers[CNodeBegin::MarkerSize-1] = 0;
00598
00599 // End markers
00600 CNodeEnd *endNode = (CNodeEnd*)node->EndMagicNumber;
00601 memset (endNode->EndMarkers, EndNodeMarkers, CNodeEnd::MarkerSize-1);
00602 endNode->EndMarkers[CNodeEnd::MarkerSize-1] = 0;
00603
00604 // Unallocated memory
00605 memset ((uint8*)node + sizeof(CNodeBegin), UnallocatedMemory, getNodeSize (node) );
00606
00607 // No source file
00608 memset (node->Category, 0, CategoryStringLength);
00609 node->File = NULL;
00610 node->Line = 0xffff;
00611 node->AllocateNumber = 0xffffffff;
00612
00613 // Heap pointer
00614 node->Heap = this;
00615
00616 NL_UPDATE_MAGIC_NUMBER (node);
00617 #endif // NL_HEAP_ALLOCATION_NDEBUG
00618 }
00619
00620 // *********************************************************
00621
00622 uint CHeapAllocator::getBlockSize (void *block)
00623 {
00624 // Get the node pointer
00625 CNodeBegin *node = (CNodeBegin*) ((uint)block - sizeof (CNodeBegin));
00626
00627 return getNodeSize (((CNodeBegin*) ((uint)block - sizeof (CNodeBegin))));
00628 }
00629
00630 // *********************************************************
00631
00632 const char * CHeapAllocator::getCategory (void *block)
00633 {
00634 // Get the node pointer
00635 CNodeBegin *node = (CNodeBegin*) ((uint)block - sizeof (CNodeBegin));
00636 #ifndef NL_HEAP_ALLOCATION_NDEBUG
|
|
||||||||||||||||||||||||
|
Definition at line 474 of file memory/heap_allocator.cpp.
00496 {
00497 // Set previous
00498 next->Previous = newNode;
00499
00500 NL_UPDATE_MAGIC_NUMBER (next);
00501 }
00502
00503 // Should be big enough
00504 internalAssert (getNodeSize (newNode) >= UserDataBlockSizeMin);
00505
00506 // New size of the first node
00507 setNodeSize (node, allignedSize);
00508
00509 // No more the last
00510 setNodeLast (node, false);
00511
00512 // Return new node
00513 return newNode;
00514 }
00515
00516 // *********************************************************
00517
00518 void CHeapAllocator::mergeNode (CNodeBegin *node)
00519 {
00520 // Get the previous node to merge with
00521 CNodeBegin *previous = node->Previous;
00522 internalAssert (getNextNode (previous) == node);
00523 internalAssert (previous);
00524 internalAssert (isNodeFree (previous));
00525
00526 // New size
00527 setNodeSize (previous, getNodeSize (previous) + getNodeSize (node) + sizeof (CNodeBegin) + NL_HEAP_NODE_END_SIZE);
00528
00529 #ifndef NL_HEAP_ALLOCATION_NDEBUG
00530 // Set end pointers
00531 previous->EndMagicNumber = (uint32*)((uint8*)previous + getNodeSize (previous) + sizeof (CNodeBegin));
00532 #endif // NL_HEAP_ALLOCATION_NDEBUG
00533
00534 // Get the next node to relink
00535 CNodeBegin *next = getNextNode (node);
00536 if (next)
|
|
||||||||||||||||
|
Definition at line 340 of file memory/heap_allocator.cpp. References isNodeBlack(), isNodeRed(), NL_UPDATE_MAGIC_NUMBER_FREE_NODE, rotateLeft(), rotateRight(), setNodeBlack(), setNodeColor(), setNodeRed(), w, and x.
00341 {
00342 if (x == x->Parent->Left)
00343 {
00344 CFreeNode *w = x->Parent->Right;
00345 if (isNodeRed (w))
00346 {
00347 setNodeBlack (w);
00348 setNodeRed (x->Parent);
00349 rotateLeft (x->Parent);
00350
00351 NL_UPDATE_MAGIC_NUMBER_FREE_NODE (w);
00352
00353 w = x->Parent->Right;
00354 }
00355 if (isNodeBlack (w->Left) && isNodeBlack (w->Right))
00356 {
00357 setNodeRed (w);
00358 x = x->Parent;
00359
00360 NL_UPDATE_MAGIC_NUMBER_FREE_NODE (w);
00361 }
00362 else
00363 {
00364 if (isNodeBlack (w->Right))
00365 {
00366 setNodeBlack (w->Left);
00367 setNodeRed (w);
00368 rotateRight (w);
00369 w = x->Parent->Right;
00370 }
|
|
|
Definition at line 3122 of file memory/heap_allocator.cpp. |
|
|
Definition at line 2160 of file memory/heap_allocator.cpp.
02162 {
02163 #undef malloc
02164 return (uint8*)::malloc (size);
02165 }
02166
02167 // *********************************************************
02168
02169 void CHeapAllocator::freeBlock (uint8 *block)
02170 {
02171 ::free (block);
02172 }
02173
02174 // *********************************************************
02175
02176 bool CHeapAllocator::internalCheckHeap (bool stopOnError) const
02177 {
02178 enterCriticalSection ();
02179
02180 // For each small blocks
02181 CSmallBlockPool *pool = (CSmallBlockPool*)_SmallBlockPool;
02182 while (pool)
02183 {
02184 // For each small block
02185 uint smallBlock;
02186 CNodeBegin *previous = NULL;
02187 for (smallBlock=0; smallBlock<SmallBlockPoolSize; smallBlock++)
02188 {
02189 // Get the small block
02190 CNodeBegin *node = getSmallBlock (pool, smallBlock);
02191 CNodeBegin *next = (smallBlock+1<SmallBlockPoolSize) ? getSmallBlock (pool, smallBlock+1) : NULL;
02192
02193 // Check node
02194 checkNodeSB (pool, previous, node, next, stopOnError);
02195
02196 previous = node;
02197 }
02198
02199 // Next pool
02200 pool = pool->Next;
02201 }
02202
02203 // For each main block
02204 CMainBlock *currentBlock = _MainBlockList;
02205 while (currentBlock)
02206 {
02207 // Get the nodes
02208 const CNodeBegin *previous = NULL;
02209 const CNodeBegin *current = getFirstNode (currentBlock);
02210 internalAssert (current); // Should have at least one block in the main block
02211 const CNodeBegin *next;
02212
02213 // For each node
|
|
|
Definition at line 2219 of file memory/heap_allocator.cpp. |
|
|
Definition at line 2225 of file memory/heap_allocator.cpp.
02246 {
02247 _AlwaysCheck = alwaysCheck;
02248 }
02249 #endif // NL_HEAP_ALLOCATION_NDEBUG
02250
02251 // *********************************************************
02252
02253 #ifndef NL_HEAP_ALLOCATION_NDEBUG
02254 bool CHeapAllocator::debugIsAlwaysCheckMemory () const
02255 {
|
|
|
Definition at line 2257 of file memory/heap_allocator.cpp.
02263 {
02264 enterCriticalSection ();
02265
02266 strncpy (_Name, name, NameLength-1);
02267
02268 leaveCriticalSection ();
02269 }
02270
02271 // *********************************************************
02272 // Category control
02273 // *********************************************************
02274
02275 void CHeapAllocator::debugPushCategoryString (const char *str)
02276 {
02277 // Get the category stack pointer
02278 CCategory *last = (CCategory*)_CategoryStack.getPointer ();
|
|
|
Definition at line 3131 of file memory/heap_allocator.cpp. |
|
|
Definition at line 3168 of file memory/heap_allocator.cpp. |
|
|
Definition at line 3152 of file memory/heap_allocator.cpp. |
|
|
Definition at line 2893 of file memory/heap_allocator.cpp. |
|
||||||||||||
|
Definition at line 2329 of file memory/heap_allocator.cpp.
02333 {
02334 // ********
02335 // * STOP *
02336 // ********
02337 // * This node is not hold by this heap. It has been allocated with another heap.
02338 // ********
02339 // * (*node) Check for more informations
02340 // ********
02341 NL_ALLOC_STOP;
02342 }
02343 }
02344
02345 #ifdef NL_OS_WINDOWS
02346 #pragma optimize( "", on )
02347 #endif // NL_OS_WINDOWS
02348
02349 #endif // NL_HEAP_ALLOCATION_NDEBUG
02350
02351 // *********************************************************
02352
02353 uint CHeapAllocator::getAllocatedSystemMemory ()
02354 {
02355 uint systemMemory = 0;
02356 #ifdef NL_OS_WINDOWS
02357 // Get system memory informations
02358 HANDLE hHeap[100];
02359 DWORD heapCount = GetProcessHeaps (100, hHeap);
02360
02361 uint heap;
02362 for (heap = 0; heap < heapCount; heap++)
02363 {
02364 PROCESS_HEAP_ENTRY entry;
02365 entry.lpData = NULL;
02366 while (HeapWalk (hHeap[heap], &entry))
02367 {
02368 if (entry.wFlags & PROCESS_HEAP_ENTRY_BUSY)
02369 {
02370 systemMemory += entry.cbData + entry.cbOverhead;
02371 }
02372 }
02373 }
02374 #endif // NL_OS_WINDOWS
02375 return systemMemory;
02376 }
02377
02378 // *********************************************************
02379
02380 class CPointerEntry
02381 {
02382 public:
02383 CPointerEntry (void *pointer, CPointerEntry *entry)
02384 {
02385 Pointer = pointer;
02386 Next = entry;
02387 }
02388 static CPointerEntry *find (CPointerEntry *cat, void *pointer)
02389 {
02390 while (cat)
02391 {
02392 if (pointer == cat->Pointer)
02393 break;
02394 cat = cat->Next;
02395 }
02396 return cat;
02397 }
02398 void *Pointer;
02399 CPointerEntry *Next;
02400 };
02401
02402 uint CHeapAllocator::getAllocatedSystemMemoryByAllocator ()
02403 {
02404 uint nelSystemMemory = 0;
02405
02406 // Build a set of allocated system memory pointers
02407 CPointerEntry *entries = NULL;
02408
02409 // For each main block
02410 CMainBlock *currentBlock = _MainBlockList;
02411 while (currentBlock)
02412 {
02413 // Save pointers
02414 entries = new CPointerEntry ((void*)currentBlock, entries);
02415 entries = new CPointerEntry ((void*)currentBlock->Ptr, entries);
02416
02417 // Next block
02418 currentBlock = currentBlock->Next;
02419 }
02420
02421 #ifdef NL_OS_WINDOWS
02422 // Get system memory informations
02423 HANDLE hHeap[100];
02424 DWORD heapCount = GetProcessHeaps (100, hHeap);
02425
02426 FILE *file = fopen ("dump.bin", "wb");
02427
02428 uint heap;
02429 for (heap = 0; heap < heapCount; heap++)
02430 {
02431 PROCESS_HEAP_ENTRY entry;
02432 entry.lpData = NULL;
02433 uint block = 0;
02434 while (HeapWalk (hHeap[heap], &entry))
02435 {
02436 if (entry.wFlags & PROCESS_HEAP_ENTRY_BUSY)
02437 {
02438 // This pointer is already used ?
02439 if ( CPointerEntry::find (entries, (void*)((char*)entry.lpData)) ||
02440 CPointerEntry::find (entries, (void*)((char*)entry.lpData+32) ) )
02441 nelSystemMemory += entry.cbData + entry.cbOverhead;
02442 else
02443 {
02444 fwrite (entry.lpData, 1, entry.cbData, file);
02445 }
02446 }
02447 block++;
02448 }
02449 }
02450
02451 fclose (file);
02452
02453 #endif // NL_OS_WINDOWS
02454
02455 return nelSystemMemory;
02456 }
02457
02458 // *********************************************************
02459
02460 uint8 *CHeapAllocator::internalAllocateBlock (uint size)
02461 {
02462 uint8 *ptr = allocateBlock (size);
02463
02464 return ptr;
02465 }
02466
02467 // *********************************************************
02468
02469 void CHeapAllocator::outOfMemory()
02470 {
02471 // Out of memory callback
02472 if (_OutOfMemoryCallback)
02473 _OutOfMemoryCallback();
02474
02475 // Select outofmemory mode
02476 if (_OutOfMemoryMode == ThrowException)
02477 throw 0;
02478 }
02479
02480 // *********************************************************
02481
02482 void CHeapAllocator::setOutOfMemoryHook (void (*outOfMemoryCallback)())
02483 {
02484 _OutOfMemoryCallback = outOfMemoryCallback;
02485 }
02486
02487 // *********************************************************
02488
02489 } // NLMEMORY
02490 } // NLMEMORY
|
|
|
Definition at line 771 of file memory/heap_allocator.cpp.
00837 {
|
|
|
Definition at line 757 of file memory/heap_allocator.cpp. References uint8. |
|
|
Definition at line 743 of file memory/heap_allocator.cpp. |
|
|
Definition at line 1128 of file memory/heap_allocator.cpp. References NL_ALLOC_STOP.
01132 : the already deleted node 01133 // ******** 01134 NL_ALLOC_STOP; 01135 } 01136 else 01137 { 01138 enterCriticalSectionLB (); 01139 01140 #ifndef NL_HEAP_ALLOCATION_NDEBUG 01141 // Uninitialised memory 01142 memset ((uint8*)node + sizeof(CNodeBegin), DeletedMemory, size ); 01143 01144 // Set end pointers 01145 node->EndMagicNumber = (uint32*)((uint8*)node + size + sizeof (CNodeBegin)); 01146 #endif // NL_HEAP_ALLOCATION_NDEBUG 01147 01148 // Mark has free 01149 setNodeFree (node); 01150 01151 // ******************* 01152 // Large block 01153 // ******************* 01154 01155 // A free node 01156 CHeapAllocator::CFreeNode *freeNode = NULL; 01157 01158 // Previous node 01159 CNodeBegin *previous = node->Previous; 01160 if (previous) 01161 { 01162 #ifndef NL_HEAP_ALLOCATION_NDEBUG 01163 // Check the previous node 01164 checkNode (previous, evalMagicNumber (previous)); 01165 #endif // NL_HEAP_ALLOCATION_NDEBUG 01166 01167 // Is it free ? 01168 if (isNodeFree (previous)) 01169 { 01170 // Merge the two nodes 01171 mergeNode (node); 01172 01173 // Get its free node 01174 erase (getFreeNode (previous)); 01175 01176 // Curent node 01177 node = previous; 01178 } 01179 } 01180 01181 // Mark has free 01182 setNodeFree (node); 01183 01184 // Next node 01185 CNodeBegin *next = getNextNode (node); 01186 if (next) 01187 { 01188 #ifndef NL_HEAP_ALLOCATION_NDEBUG 01189 // Check the next node 01190 checkNode (next, evalMagicNumber (next)); 01191 #endif // NL_HEAP_ALLOCATION_NDEBUG 01192 01193 // Is it free ? 01194 if (isNodeFree (next)) 01195 { 01196 // Free the new one 01197 erase (getFreeNode (next)); 01198 01199 // Merge the two nodes 01200 mergeNode (next); 01201 } 01202 } 01203 01204 // Insert it into the tree 01205 insert (getFreeNode (node)); 01206 01207 NL_UPDATE_MAGIC_NUMBER (node); 01208 01209 leaveCriticalSectionLB (); 01210 } 01211 } 01212 } 01213 } 01214 01215 // ********************************************************* 01216 // Statistics 01217 // ********************************************************* 01218 01219 uint CHeapAllocator::getAllocatedMemory () const 01220 { 01221 enterCriticalSection (); 01222 01223 // Sum allocated memory 01224 uint memory = 0; 01225 01226 // For each small block 01227 CSmallBlockPool *currentSB = (CSmallBlockPool *)_SmallBlockPool; 01228 while (currentSB) 01229 { 01230 // For each node in this small block pool 01231 uint block; 01232 for (block=0; block<SmallBlockPoolSize; block++) 01233 { 01234 // Get the node 01235 const CNodeBegin *current = getSmallBlock (currentSB, block); 01236 01237 // Node allocated ? 01238 if (isNodeUsed (current)) 01239 memory += getNodeSize (current) + ReleaseHeaderSize; 01240 } 01241 01242 // Next block 01243 currentSB = currentSB->Next; 01244 } 01245 01246 // For each main block 01247 CMainBlock *currentBlock = _MainBlockList; 01248 while (currentBlock) 01249 { 01250 // Get the first node 01251 const CNodeBegin *current = getFirstNode (currentBlock); 01252 while (current) 01253 { 01254 #ifndef NL_HEAP_ALLOCATION_NDEBUG 01255 // Check node 01256 checkNode (current, evalMagicNumber (current)); 01257 #endif // NL_HEAP_ALLOCATION_NDEBUG 01258 01259 // Node allocated ? Don't sum small blocks.. 01260 if (isNodeUsed (current)) 01261 #ifndef NL_HEAP_ALLOCATION_NDEBUG 01262 if (strcmp (current->Category, NL_HEAP_SB_CATEGORY) != 0) 01263 #endif // NL_HEAP_ALLOCATION_NDEBUG 01264 memory += getNodeSize (current) + ReleaseHeaderSize; 01265 01266 // Next node 01267 current = getNextNode (current); 01268 } 01269 01270 // Next block 01271 currentBlock = currentBlock->Next; 01272 } 01273 01274 leaveCriticalSection (); 01275 01276 // Return memory used 01277 return memory; 01278 } 01279 01280 // ********************************************************* 01281 01282 #ifndef NL_HEAP_ALLOCATION_NDEBUG 01283 uint CHeapAllocator::debugGetAllocatedMemoryByCategory (const char* category) const 01284 { 01285 enterCriticalSection (); 01286 01287 // Sum allocated memory 01288 uint memory = 0; 01289 01290 // For each small block 01291 CSmallBlockPool *currentSB = (CSmallBlockPool *)_SmallBlockPool; 01292 while (currentSB) 01293 { 01294 // For each node in this small block pool 01295 uint block; 01296 for (block=0; block<SmallBlockPoolSize; block++) 01297 { 01298 // Get the node 01299 const CNodeBegin *current = getSmallBlock (currentSB, block); 01300 01301 // Node allocated ? 01302 if ((isNodeUsed (current)) && (strcmp (current->Category, category)==0)) 01303 memory += getNodeSize (current); 01304 |
|
|
Definition at line 453 of file memory/heap_allocator.cpp. References NL_HEAP_NODE_END_SIZE, and uint8. |
|
|
Definition at line 310 of file memory/heap_allocator.cpp. References internalAssert, y, and z.
00310 {
00311 internalAssert (_FreeTreeRoot == z);
00312 _FreeTreeRoot = y;
00313 }
00314
00315 if (y->Left)
00316 {
00317 internalAssert (y->Left->Parent == z);
00318 y->Left->Parent = y;
00319
00320 NL_UPDATE_MAGIC_NUMBER_FREE_NODE (y->Left);
00321 }
00322 if (y->Right)
00323 {
00324 internalAssert (y->Right->Parent == z);
00325 y->Right->Parent = y;
00326
00327 NL_UPDATE_MAGIC_NUMBER_FREE_NODE (y->Right);
00328 }
00329 }
00330
00331 NL_UPDATE_MAGIC_NUMBER_FREE_NODE (x);
00332 NL_UPDATE_MAGIC_NUMBER_FREE_NODE (y);
|
|
|
Free a pointer Definition at line 1896 of file memory/heap_allocator.cpp.
01912 {
01913 enterCriticalSection ();
01914
01915 // Sum free memory
01916 uint memory = 0;
01917
01918 // Clear the free tree
01919 _FreeTreeRoot = &_NullNode.FreeNode;
01920
01921 // For each main block
01922 CMainBlock *currentBlock = _MainBlockList;
01923 while (currentBlock)
01924 {
01925 // Reinit this block
01926 initEmptyBlock (*currentBlock);
01927
01928 // Get first block
01929 CNodeBegin *node = getFirstNode (currentBlock);
01930
01931 // Insert the free node
01932 insert (getFreeNode (node));
01933
01934 NL_UPDATE_MAGIC_NUMBER (node);
01935
01936 // Next block
01937 currentBlock = currentBlock->Next;
01938 }
01939
01940 leaveCriticalSection ();
01941 }
01942
01943 // *********************************************************
01944
01945 void CHeapAllocator::releaseMemory ()
01946 {
01947 enterCriticalSection ();
01948
01949 // Clear the free tree
01950 _FreeTreeRoot = &_NullNode.FreeNode;
01951
01952 // For each main block
01953 CMainBlock *currentBlock = _MainBlockList;
01954 while (currentBlock)
01955 {
01956 freeBlock (currentBlock->Ptr);
01957
01958 // Next block
01959 CMainBlock *toDelete = currentBlock;
01960 currentBlock = toDelete->Next;
01961 ::free (toDelete);
01962 }
01963
01964 // Erase block node
01965 _MainBlockList = NULL;
01966
01967 leaveCriticalSection ();
01968 }
01969
01970 // *********************************************************
01971
01972 #ifndef NL_HEAP_ALLOCATION_NDEBUG
01973
01974 class CLeak
01975 {
01976 public:
01977
01978 CLeak (const char *name, CLeak *next)
01979 {
01980 Name = new char[strlen (name)+1];
01981 strcpy (Name, name);
01982 Count = 0;
01983 Memory = 0;
01984 Next = next;
01985 }
01986
01987 ~CLeak ()
01988 {
01989 delete [] Name;
01990 if (Next)
01991 delete Next;
01992 }
01993
01994 static CLeak *find (CLeak *cat, const char *name)
01995 {
01996 while (cat)
01997 {
01998 if (strcmp (name, cat->Name) == 0)
01999 break;
02000 cat = cat->Next;
02001 }
02002 return cat;
02003 }
02004
02005 static CLeak *insert (const char *name, CLeak *next)
02006 {
02007 return new CLeak (name, next);
02008 }
02009
02010 uint Count;
02011 uint Memory;
02012 char *Name;
02013 CLeak *Next;
02014 };
02015
02016 void CHeapAllocator::debugReportMemoryLeak ()
02017 {
02018 debugPushCategoryString (NL_HEAP_MEM_DEBUG_CATEGORY);
02019
02020 // Sum allocated memory
02021 uint memory = 0;
02022
02023 // Leak map
02024 CLeak *leakMap = NULL;
02025
02026 // Header
02027 char report[2048];
02028 sprintf (report, "Report Memory leak for allocator \"%s\"\n", _Name);
02029 CHeapAllocatorOutputError (report);
02030
02031 // For each small block
02032 CMainBlock *currentBlock = _MainBlockList;
02033 while (currentBlock)
02034 {
02035 // Get the first node
02036 const CNodeBegin *current = getFirstNode (currentBlock);
02037 while (current)
02038 {
02039 // Check node
02040 checkNode (current, evalMagicNumber (current));
02041
02042 // Node allocated ?
02043 if (isNodeUsed (current) && ( (current->Category == NULL) || (current->Category[0] != '_')) )
02044 {
02045 // Make a report
02046 sprintf (report, "%s(%d)\t: \"%s\"", current->File, current->Line, current->Category);
02047
02048 // Look for this leak
02049 CLeak *ite = CLeak::find (leakMap, report);
02050
02051 // Not found ?
02052 if (ite == NULL)
02053 {
02054 ite = CLeak::insert (report, leakMap);
02055 leakMap = ite;
02056 ite->Count = 0;
02057 ite->Memory = 0;
02058 }
02059
02060 // One more leak
02061 ite->Count++;
02062 ite->Memory += getNodeSize (current);
02063
02064 memory += getNodeSize (current);
02065 }
02066
02067 // Next node
02068 current = getNextNode (current);
02069 }
02070
02071 // Next block
02072 currentBlock = currentBlock->Next;
02073 }
02074
02075 // For each small block
02076 CSmallBlockPool *currentSB = (CSmallBlockPool *)_SmallBlockPool;
02077 while (currentSB)
02078 {
02079 // For each node in this small block pool
02080 uint block;
02081 for (block=0; block<SmallBlockPoolSize; block++)
02082 {
02083 // Get the node
02084 const CNodeBegin *current = getSmallBlock (currentSB, block);
02085 // Check node
02086 checkNode (current, evalMagicNumber (current));
02087
02088 // Node allocated ?
02089 if (isNodeUsed (current) && ( (current->Category == NULL) || (current->Category[0] != '_')) )
02090 {
|
|
|
Free all the block allocated Definition at line 2788 of file memory/heap_allocator.cpp. |
|
|
Method used to free system memory Definition at line 3046 of file memory/heap_allocator.cpp. |
|
|
Definition at line 2096 of file memory/heap_allocator.cpp.
02099 {
02100 ite = CLeak::insert (report, leakMap);
02101 leakMap = ite;
02102 ite->Count = 0;
02103 ite->Memory = 0;
02104 }
02105
02106 // One more leak
02107 ite->Count++;
02108 ite->Memory += getNodeSize (current);
02109
02110 memory += getNodeSize (current);
02111 }
02112 }
02113
02114 // Next block
02115 currentSB = currentSB->Next;
02116 }
02117
02118 // Look for this leak
02119 CLeak *ite = leakMap;
02120 while (ite)
02121 {
02122 // Make a report
02123 sprintf (report, "%s,\tLeak count : %d,\tMemory allocated : %d\n", ite->Name, ite->Count, ite->Memory);
02124
02125 // Report on stderr
02126 CHeapAllocatorOutputError (report);
02127
02128 ite = ite->Next;
02129 }
02130
02131 // Make a report
02132 if (memory)
02133 {
02134 sprintf (report, "%d byte(s) found\n", memory);
02135 }
02136 else
02137 {
02138 sprintf (report, "No memory leak\n");
02139 }
02140 CHeapAllocatorOutputError (report);
02141
02142 // Delete list
02143 if (leakMap)
02144 delete leakMap;
02145
02146 debugPopCategoryString ();
02147 }
02148 #endif // NL_HEAP_ALLOCATION_NDEBUG
02149
02150 // *********************************************************
02151
02152 bool CHeapAllocator::checkHeap (bool stopOnError) const
02153 {
02154 bool res = internalCheckHeap (stopOnError);
02155
|
|
|
Definition at line 3230 of file memory/heap_allocator.cpp. |
|
|
Definition at line 3279 of file memory/heap_allocator.cpp. |
|
|
Definition at line 871 of file memory/heap_allocator.cpp. References NL_HEAP_NODE_END_SIZE, size, and uint.
00871 : Align); 00872 if (allignedSize < BlockDataSizeMin) 00873 allignedSize = BlockDataSizeMin; 00874 |
|
|
Get a block size with its pointer Definition at line 1499 of file memory/heap_allocator.cpp. References size.
01515 {
|
|
|
Get a block category from its pointer Definition at line 1509 of file memory/heap_allocator.cpp.
01515 {
01516 // Get the first node
01517 const CNodeBegin *current = getFirstNode (currentBlock);
01518 while (current)
|
|
|
Definition at line 384 of file memory/heap_allocator.cpp. References NL_UPDATE_MAGIC_NUMBER_FREE_NODE, rotateRight(), setNodeBlack(), setNodeRed(), w, and x.
00386 {
00387 setNodeBlack (w);
00388 setNodeRed (x->Parent);
|
|
|
Definition at line 376 of file memory/heap_allocator.cpp.
00383 {
|
|
|
Definition at line 2747 of file memory/heap_allocator.cpp. |
|
|
Definition at line 2628 of file memory/heap_allocator.cpp. |
|
|
Definition at line 423 of file memory/heap_allocator.cpp. |
|
|
Definition at line 416 of file memory/heap_allocator.cpp. |
|
|
Get the block count Definition at line 808 of file memory/heap_allocator.cpp. References NLMEMORY::line, size, uint, uint32, and uint8.
00837 {
|
|
|
Get the size of the block Definition at line 886 of file memory/heap_allocator.cpp. References buffer.
00888 {
00889 leaveCriticalSectionLB ();
|
|
|
Definition at line 879 of file memory/heap_allocator.cpp. References buffer.
00888 {
|
|
|
Definition at line 404 of file memory/heap_allocator.cpp. References rotateLeft(), setNodeBlack(), setNodeRed(), w, and x.
00405 {
00406 setNodeBlack (w->Right);
00407 setNodeRed (w);
00408 rotateLeft (w);
00409 w = x->Parent->Left;
00410 }
00411 setNodeColor (w, isNodeRed (x->Parent) );
00412 setNodeBlack (x->Parent);
|
|
|
Definition at line 392 of file memory/heap_allocator.cpp.
00396 {
00397 setNodeRed (w);
00398 x = x->Parent;
00399
00400 NL_UPDATE_MAGIC_NUMBER_FREE_NODE (w);
|
|
|
Definition at line 903 of file memory/heap_allocator.cpp.
00917 {
|
|
|
Definition at line 437 of file memory/heap_allocator.cpp. References Align, uint, and UserDataBlockSizeMin.
00439 : Align); 00440 if (allignedSize <= UserDataBlockSizeMin) |
|
|
Definition at line 430 of file memory/heap_allocator.cpp. References internalAssert, and uint.
00434 {
|
|
|
Definition at line 444 of file memory/heap_allocator.cpp. References NL_HEAP_NODE_END_SIZE, uint32, and uint8. |
|
|
Definition at line 853 of file memory/heap_allocator.cpp.
00855 {
00856 // Block allocation mode
|
|
||||||||||||
|
Definition at line 896 of file memory/heap_allocator.cpp.
00899 {
|
|
|
Definition at line 2720 of file memory/heap_allocator.cpp. |
|
|
Definition at line 2691 of file memory/heap_allocator.cpp. |
|
|
Definition at line 1444 of file memory/heap_allocator.cpp. References uint.
01453 {
01454 // Status
01455 bool status = false;
01456
01457 debugPushCategoryString (NL_HEAP_MEM_DEBUG_CATEGORY);
01458
01459 // Open files
01460 FILE *file = fopen (stateFile, "wt");
01461
01462 // List of category
01463 CCategoryMap *catMap = NULL;
01464
01465 // Both OK
01466 if (file)
01467 {
01468 // **************************
01469
01470 // For each small block
01471 uint smallBlockCount = 0;
01472 uint largeBlockCount = 0;
01473 CSmallBlockPool *currentSB = (CSmallBlockPool *)_SmallBlockPool;
01474 while (currentSB)
01475 {
01476 // For each node in this small block pool
01477 uint block;
01478 for (block=0; block<SmallBlockPoolSize; block++)
01479 {
01480 // Get the node
01481 const CNodeBegin *current = getSmallBlock (currentSB, block);
01482
01483 // Node allocated ?
01484 if (isNodeUsed (current))
01485 {
01486 // Find the node
01487 CCategoryMap *cat = CCategoryMap::find (catMap, (const char*)current->Category);
01488
01489 // Found ?
01490 if (cat == NULL)
01491 {
01492 catMap = CCategoryMap::insert (current->Category, catMap);
01493 cat = catMap;
01494 }
01495 uint size = getNodeSize (current) + ReleaseHeaderSize;
|
|
|
Definition at line 1005 of file memory/heap_allocator.cpp. References NL_ALLOC_STOP.
01006 {
01007 // ********
01008 // * STOP *
01009 // ********
01010 // * Attempt to allocate 0 bytes
01011 // ********
01012 NL_ALLOC_STOP;
01013 return NULL;
01014 }
01015 }
01016
01017 // *********************************************************
01018
01019 void CHeapAllocator::free (void *ptr)
01020 {
01021 // Delete a null pointer ?
01022 if (ptr == NULL)
01023 {
01024 // ********
01025 // * STOP *
01026 // ********
01027 // * Attempt to delete a NULL pointer
01028 // ********
01029 #ifdef NL_HEAP_STOP_NULL_FREE
01030 NL_ALLOC_STOP;
01031 #endif // NL_HEAP_STOP_NULL_FREE
01032 }
01033 else
01034 {
01035
01036 #ifndef NL_HEAP_ALLOCATION_NDEBUG
01037 // Checks ?
01038 if (_AlwaysCheck)
01039 {
01040 // Check heap integrity
01041 internalCheckHeap (true);
01042 }
01043 #endif // NL_HEAP_ALLOCATION_NDEBUG
01044
01045 // Get the node pointer
01046 CNodeBegin *node = (CNodeBegin*) ((uint)ptr - sizeof (CNodeBegin));
01047
01048 /* trap debug if (strcmp(getCategory(ptr),"3dIns") == 0)
01049 {
01050 n3dDrvTotal -= getNodeSize(node);
01051 uint dbg= 0;
01052 dbg++;
01053 } */
01054
01055 #ifndef NL_HEAP_ALLOCATION_NDEBUG
01056 // Check the node CRC
01057 enterCriticalSectionSB ();
01058 enterCriticalSectionLB ();
01059 checkNode (node, evalMagicNumber (node));
01060 leaveCriticalSectionLB ();
01061 leaveCriticalSectionSB ();
01062 #endif // NL_HEAP_ALLOCATION_NDEBUG
01063
01064 // Large or small block ?
01065 #ifdef NL_HEAP_ALLOCATION_NDEBUG
01066 uint size = (((CNodeBegin*) ((uint)ptr - sizeof (CNodeBegin))))->SizeAndFlags;
01067 #else // NL_HEAP_ALLOCATION_NDEBUG
01068 uint size = getNodeSize (((CNodeBegin*) ((uint)ptr - sizeof (CNodeBegin))));
01069 #endif // NL_HEAP_ALLOCATION_NDEBUG
01070 if (size <= LastSmallBlock)
01071 {
01072 // *******************
01073 // Small block
01074 // *******************
01075
01076 // Check the node has not been deleted
01077 if (isNodeFree (node))
01078 {
01079 // ********
01080 // * STOP *
01081 // ********
01082 // * Attempt to delete a pointer already deleted
01083 // ********
01084 // * (*node): the already deleted node
01085 // ********
01086 NL_ALLOC_STOP;
01087 }
01088 else
01089 {
01090 enterCriticalSectionSB ();
01091
01092 #ifndef NL_HEAP_ALLOCATION_NDEBUG
01093 // Uninitialised memory
01094 memset ((uint8*)node + sizeof(CNodeBegin), DeletedMemory, size );
01095
01096 // Set end pointers
01097 node->EndMagicNumber = (uint32*)((uint8*)node + size + sizeof (CNodeBegin));
01098
01099 // Mark has free
01100 setNodeFree (node);
01101 #endif // NL_HEAP_ALLOCATION_NDEBUG
01102
01103 // Add in the free list
01104 CNodeBegin **freeNode = (CNodeBegin **)_FreeSmallBlocks+NL_SIZE_TO_SMALLBLOCK_INDEX (size);
01105 ((CNodeBegin*) ((uint)ptr - sizeof (CNodeBegin)))->Previous = *freeNode;
01106 *freeNode = ((CNodeBegin*) ((uint)ptr - sizeof (CNodeBegin)));
01107
01108 // Update smallblock crc
01109 NL_UPDATE_MAGIC_NUMBER (node);
01110
01111 leaveCriticalSectionSB ();
01112 }
01113 }
01114 else
01115 {
01116 #ifdef NL_HEAP_ALLOCATION_NDEBUG
01117 // Get the real size
01118 size = getNodeSize (((CNodeBegin*) ((uint)ptr - sizeof (CNodeBegin))));
01119 #endif // NL_HEAP_ALLOCATION_NDEBUG
01120
01121 // Get the node pointer
01122 CNodeBegin *node = (CNodeBegin*) ((uint)ptr - sizeof (CNodeBegin));
01123
01124 // Check the node has not been deleted
|
|
|
Method used to allocate system memory. Calls allocateBlock. Definition at line 3337 of file memory/heap_allocator.cpp. |
|
|
Definition at line 3053 of file memory/heap_allocator.cpp. |
|
|
Definition at line 145 of file memory/heap_allocator.cpp. References x. Referenced by computeCRC32().
00149 {
|
|
|
Definition at line 106 of file memory/heap_allocator.cpp. |
|
|
Definition at line 120 of file memory/heap_allocator.cpp. References releaseMemory().
00121 {
00122 // Release all memory used
00123 releaseMemory ();
|
|
|
Definition at line 138 of file memory/heap_allocator.cpp. Referenced by computeCRC32(), and setNodeLast().
00138 : current->Right;
00139 }
00140
00141 // Setup new node
|
|
|
Definition at line 127 of file memory/heap_allocator.cpp. References _FreeTreeRoot, _NullNode, NLMEMORY::CHeapAllocator::CNullNode::FreeNode, and x.
00129 {
00130 CHeapAllocator::CFreeNode *current, *parent;
00131
00132 // Find future parent
00133 current = _FreeTreeRoot;
00134 parent = NULL;
|
|
|
Definition at line 113 of file memory/heap_allocator.cpp. |
|
|
Definition at line 779 of file memory/heap_allocator.cpp.
00837 {
|
|
|
Definition at line 764 of file memory/heap_allocator.cpp. References uint8.
00837 {
|
|
|
Definition at line 750 of file memory/heap_allocator.cpp. |
|
|
Definition at line 1395 of file memory/heap_allocator.cpp.
01407 {
01408
01409 }
01410
01411 // *********************************************************
01412
01413 #ifndef NL_HEAP_ALLOCATION_NDEBUG
01414
01415 class CCategoryMap
01416 {
01417 public:
01418 CCategoryMap (const char *name, CCategoryMap *next)
01419 {
01420 Name = name;
01421 BlockCount = 0;
01422 Size = 0;
01423 Min = 0xffffffff;
01424 Max = 0;
01425 Next = next;
01426 }
01427
01428 static CCategoryMap *find (CCategoryMap *cat, const char *name)
01429 {
01430 while (cat)
01431 {
01432 if (strcmp (name, cat->Name) == 0)
|
|
|
Method used when no memory is available Definition at line 3346 of file memory/heap_allocator.cpp. |
|
||||||||||||||||||||||||
|
|
|
|
Definition at line 2822 of file memory/heap_allocator.cpp. Referenced by isNodeLast(). |
|
|
Definition at line 214 of file memory/heap_allocator.cpp. References x. Referenced by computeCRC32(), getNextNode(), and setNodeColor().
00226 {
00227 // Uncle is Black
00228 if (x == x->Parent->Left)
00229 {
00230 x = x->Parent;
00231 rotateRight(x);
00232 }
00233 setNodeBlack (x->Parent);
00234 setNodeRed (x->Parent->Parent);
00235
00236 rotateLeft (x->Parent->Parent);
00237
00238 // Crc node
00239 NL_UPDATE_MAGIC_NUMBER_FREE_NODE (x->Parent);
00240 }
00241 }
00242 }
00243 setNodeBlack (_FreeTreeRoot);
00244
00245 // Crc node
00246 NL_UPDATE_MAGIC_NUMBER_FREE_NODE (_FreeTreeRoot);
00247 }
00248
00249 // *********************************************************
00250
00251 void CHeapAllocator::erase (CHeapAllocator::CFreeNode *z)
00252 {
00253 CFreeNode *x, *y;
00254 if (z->Left == &_NullNode.FreeNode || z->Right == &_NullNode.FreeNode)
00255 {
00256 // y has a NULL node as a child
|
|
|
Definition at line 260 of file memory/heap_allocator.cpp. References _NullNode, NLMEMORY::CHeapAllocator::CNullNode::FreeNode, y, and z. Referenced by computeCRC32(), and getFirstNode().
00260 {
00261 // Find tree successor with a &_NullNode.FreeNode node as a child
00262 y = z->Right;
00263 while (y->Left != &_NullNode.FreeNode)
00264 y = y->Left;
00265 }
00266
00267 // x is y's only child
00268 if (y->Left != &_NullNode.FreeNode)
00269 x = y->Left;
00270 else
00271 x = y->Right;
00272
00273 // Remove y from the parent chain
00274 x->Parent = y->Parent;
00275
00276 if (y->Parent)
00277 {
00278 if (y == y->Parent->Left)
00279 y->Parent->Left = x;
00280 else
00281 {
00282 internalAssert (y == y->Parent->Right);
00283 y->Parent->Right = x;
00284 }
00285 NL_UPDATE_MAGIC_NUMBER_FREE_NODE (y->Parent);
00286 }
00287 else
00288 _FreeTreeRoot = x;
00289
00290 bool yRed = isNodeRed (y);
00291
00292 if (y != z)
00293 {
00294 // Replace y by z
00295 *y = *z;
00296 setNodeColor (y, isNodeRed (z));
00297 if (y->Parent)
00298 {
00299 if (y->Parent->Left == z)
00300 {
00301 y->Parent->Left = y;
00302 }
00303 else
00304 {
00305 internalAssert (y->Parent->Right == z);
00306 y->Parent->Right = y;
|
|
|
Definition at line 860 of file memory/heap_allocator.cpp.
00871 : Align); |
|
|
Set the block count |
|
|
Returns false if the block size choosed i too big (>= 1 Go) |
|
|
Definition at line 3139 of file memory/heap_allocator.cpp. |
|
||||||||||||
|
Definition at line 910 of file memory/heap_allocator.cpp.
00917 {
|
|
|
Definition at line 205 of file memory/heap_allocator.cpp. Referenced by computeCRC32(), getFirstNode(), and getNextNode().
00208 {
|
|
||||||||||||
|
Definition at line 188 of file memory/heap_allocator.cpp. References rotateLeft(), and x. Referenced by computeCRC32().
|
|
|
Definition at line 152 of file memory/heap_allocator.cpp. References x.
00157 {
|
|
||||||||||||
|
Definition at line 166 of file memory/heap_allocator.cpp. References isNodeRed(), x, and y.
|
|
|
Definition at line 198 of file memory/heap_allocator.cpp. References x. Referenced by computeCRC32(), getFirstNode(), and getNextNode().
00208 {
|
|
||||||||||||
|
Definition at line 176 of file memory/heap_allocator.cpp. References x.
00188 {
|
|
|
Definition at line 159 of file memory/heap_allocator.cpp.
00168 {
|
|
|
Definition at line 3359 of file memory/heap_allocator.cpp. |
|
|
Definition at line 842 of file memory/heap_allocator.cpp. References size.
00844 {
00845 enterCriticalSectionLB ();
00846
00847 // Find a free node
00848 CHeapAllocator::CFreeNode *freeNode = CHeapAllocator::find (size);
00849
|
|
||||||||||||
|
Definition at line 1310 of file memory/heap_allocator.cpp.
01315 {
01316 // Get the first node
01317 const CNodeBegin *current = getFirstNode (currentBlock);
01318 while (current)
01319 {
01320 // Node allocated ?
01321 if ((isNodeUsed (current)) && (strcmp (current->Category, category)==0))
01322 memory += getNodeSize (current);
01323
01324 // Next node
01325 current = getNextNode (current);
01326 }
01327
01328 // Next block
01329 currentBlock = currentBlock->Next;
01330 }
01331
01332 leaveCriticalSection ();
01333
01334 // Return memory used
01335 return memory;
01336 }
01337 #endif // NL_HEAP_ALLOCATION_NDEBUG
01338
01339 // *********************************************************
01340
01341 #ifndef NL_HEAP_ALLOCATION_NDEBUG
01342 uint CHeapAllocator::debugGetDebugInfoSize () const
01343 {
01344 // Return memory used
01345 return debugGetSBDebugInfoSize () + debugGetLBDebugInfoSize ();
01346 }
01347
01348 uint CHeapAllocator::debugGetLBDebugInfoSize () const
01349 {
01350 enterCriticalSection ();
01351
01352 // Sum memory used by debug header
01353 uint memory = 0;
01354
01355 // For each main block
01356 CMainBlock *currentBlock = _MainBlockList;
01357 while (currentBlock)
01358 {
01359 // Get the first node
01360 const CNodeBegin *current = getFirstNode (currentBlock);
01361 while (current)
01362 {
01363 // Node allocated ?
01364 memory += sizeof(CNodeBegin) - ReleaseHeaderSize + sizeof(CNodeEnd);
01365
01366 // Next node
01367 current = getNextNode (current);
01368 }
01369
01370 // Next block
01371 currentBlock = currentBlock->Next;
01372 }
01373
01374 leaveCriticalSection ();
01375
01376 // Return memory used
01377 return memory;
01378 }
01379
01380 uint CHeapAllocator::debugGetSBDebugInfoSize () const
01381 {
01382 enterCriticalSection ();
01383
01384 // Sum memory used by debug header
01385 uint memory = 0;
01386
01387 // For each small blocks
01388 CSmallBlockPool *pool = (CSmallBlockPool*)_SmallBlockPool;
01389 while (pool)
01390 {
01391 memory += SmallBlockPoolSize * (sizeof(CNodeBegin) - ReleaseHeaderSize + sizeof(CNodeEnd));
|
|
|
Definition at line 274 of file src/memory/heap_allocator.h. |
|
|
Definition at line 442 of file src/memory/heap_allocator.h. |
|
|
Definition at line 429 of file src/memory/heap_allocator.h. |
|
|
Definition at line 426 of file src/memory/heap_allocator.h. |
|
|
Definition at line 425 of file src/memory/heap_allocator.h. |
|
|
Definition at line 533 of file src/memory/heap_allocator.h. |
|
|
Definition at line 506 of file src/memory/heap_allocator.h. |
|
|
Definition at line 436 of file src/memory/heap_allocator.h. Referenced by isNodeSmall(). |
|
|
Definition at line 433 of file src/memory/heap_allocator.h. |
|
|
Definition at line 424 of file src/memory/heap_allocator.h. |
|
|
Definition at line 438 of file src/memory/heap_allocator.h. |
|
|
Definition at line 509 of file src/memory/heap_allocator.h. |
|
|
Definition at line 440 of file src/memory/heap_allocator.h. |
|
|
Definition at line 437 of file src/memory/heap_allocator.h. Referenced by isNodeSmall(), and rotateRight(). |
|
|
|
|
|
Definition at line 427 of file src/memory/heap_allocator.h. |
|
|
Definition at line 507 of file src/memory/heap_allocator.h. |
1.3.6