#include <heap_memory.h>
Nevrax France
Definition at line 46 of file heap_memory.h.
Public Member Functions | |
| void * | allocate (uint size) |
| CHeapMemory () | |
| Constructor. | |
| void | free (void *ptr) |
| free a block allocated with alloate(). no-op if NULL. nlstop() if don't find this block. | |
| uint | getHeapSize () const |
| return the size passed in setHeap(). | |
| uint | getHeapSizeUsed () const |
| return the heap size allocated. | |
| void | initHeap (void *heap, uint size, uint align=4) |
| void | reset () |
| reset the entire container. NB: no free() is made on the heap. | |
| ~CHeapMemory () | |
Private Types | |
| typedef TAllocatedSpaceMap::iterator | ItAllocatedSpaceMap |
| typedef TEmptySpacePtrMap::iterator | ItEmptySpacePtrMap |
| typedef TEmptySpaceSizeMap::iterator | ItEmptySpaceSizeMap |
| typedef std::map< uint8 *, uint > | TAllocatedSpaceMap |
| typedef std::map< uint8 *, CEmptySpace > | TEmptySpacePtrMap |
| typedef std::multimap< uint, uint8 * > | TEmptySpaceSizeMap |
Private Member Functions | |
| void | addEmptySpace (CEmptySpace &space) |
| void | removeEmptySpace (CEmptySpace &space) |
Private Attributes | |
| uint | _Alignment |
| TAllocatedSpaceMap | _AllocatedSpaceMap |
| TEmptySpaceSizeMap | _EmptySpaceMap |
| for allocate method, the size -> empty space map. | |
| TEmptySpacePtrMap | _EmptySpaces |
| The array of empty spaces. | |
| uint8 * | _HeapPtr |
| uint | _HeapSize |
| uint | _HeapSizeUsed |
|
|
Definition at line 106 of file heap_memory.h. Referenced by free(). |
|
|
Definition at line 101 of file heap_memory.h. Referenced by free(). |
|
|
Definition at line 85 of file heap_memory.h. Referenced by allocate(). |
|
|
Definition at line 105 of file heap_memory.h. |
|
|
Definition at line 100 of file heap_memory.h. |
|
|
Definition at line 84 of file heap_memory.h. |
|
|
Constructor.
Definition at line 38 of file heap_memory.cpp. References _Alignment, and reset().
00039 {
00040 reset();
00041 // For allocate to work even if the heap is not initialized.
00042 _Alignment= 4;
00043 }
|
|
|
Definition at line 45 of file heap_memory.cpp. References reset().
00046 {
00047 reset();
00048 }
|
|
|
Definition at line 107 of file heap_memory.cpp. References _EmptySpaceMap, _EmptySpaces, NLMISC::CHeapMemory::CEmptySpace::Ptr, NLMISC::CHeapMemory::CEmptySpace::Size, and NLMISC::CHeapMemory::CEmptySpace::SizeIt. Referenced by allocate(), free(), and initHeap().
00108 {
00109 // insert and get the iterator on the spaceMap.
00110 space.SizeIt= _EmptySpaceMap.insert( make_pair(space.Size, space.Ptr));
00111
00112 // insert into the list of EmptySpaces.
00113 _EmptySpaces.insert( make_pair(space.Ptr, space) );
00114 }
|
|
|
allocate a block of size bytes. return NULL if not enough space or if size==0. NB: for alignements consideration, allocation are aligned to 4 bytes. Definition at line 118 of file heap_memory.cpp. References _Alignment, _AllocatedSpaceMap, _EmptySpaceMap, _EmptySpaces, _HeapSizeUsed, addEmptySpace(), ItEmptySpaceSizeMap, NLMISC::CHeapMemory::CEmptySpace::Ptr, removeEmptySpace(), NLMISC::CHeapMemory::CEmptySpace::Size, size, and uint. Referenced by NL3D::CVertexBufferHeap::allocate(), NL3D::CVertexArrayRangeATI::allocateVB(), and NL3D::CVertexArrayRangeNVidia::allocateVB().
00119 {
00120 if(size==0)
00121 return NULL;
00122
00123 // Manage alignement.
00124 size= (size + (_Alignment-1)) & (~(_Alignment-1));
00125
00126
00127 // retrieve the best block.
00128 //=========================
00129 CEmptySpace bestSpace;
00130 // NB: do a copy, because of removeEmptySpace() which delete the space.
00131
00132 // Find the smaller space which is >= than size.
00133 ItEmptySpaceSizeMap it;
00134 it= _EmptySpaceMap.lower_bound(size);
00135
00136 // if not found, alloc fails.
00137 if(it == _EmptySpaceMap.end())
00138 return NULL;
00139 else
00140 {
00141 // NB: this space must exist in the "array".
00142 bestSpace= _EmptySpaces[it->second];
00143 }
00144
00145
00146 // remove this empty space from list.
00147 //=========================
00148 removeEmptySpace(bestSpace);
00149
00150
00151 // if any, add the space unused to the list.
00152 //=========================
00153 if(bestSpace.Size > size)
00154 {
00155 CEmptySpace space;
00156 space.Ptr= bestSpace.Ptr + size;
00157 space.Size= bestSpace.Size - size;
00158
00159 addEmptySpace(space);
00160 }
00161
00162
00163 // return / insert the allocated space.
00164 //=========================
00165 _AllocatedSpaceMap.insert(make_pair(bestSpace.Ptr, size));
00166 _HeapSizeUsed+= size;
00167
00168 // return the ptr of start of this empty space.
00169 return bestSpace.Ptr;
00170 }
|
|
|
free a block allocated with alloate(). no-op if NULL. nlstop() if don't find this block.
Definition at line 173 of file heap_memory.cpp. References _AllocatedSpaceMap, _EmptySpaces, _HeapSizeUsed, addEmptySpace(), ItAllocatedSpaceMap, ItEmptySpacePtrMap, nlassert, nlstop, NLMISC::CHeapMemory::CEmptySpace::Ptr, removeEmptySpace(), NLMISC::CHeapMemory::CEmptySpace::Size, size, uint, and uint8. Referenced by NL3D::CVertexBufferHeap::free(), NL3D::CVertexArrayRangeATI::freeVB(), and NL3D::CVertexArrayRangeNVidia::freeVB().
00174 {
00175 if(ptr==NULL)
00176 return;
00177
00178 // Must find the array in allocated spaces.
00179 //==========================
00180 ItAllocatedSpaceMap itAlloc= _AllocatedSpaceMap.find((uint8*)ptr);
00181 if(itAlloc == _AllocatedSpaceMap.end())
00182 {
00183 nlstop;
00184 return;
00185 }
00186 uint size= itAlloc->second;
00187
00188 // free this space from allocated Spaces.
00189 _AllocatedSpaceMap.erase(itAlloc);
00190 _HeapSizeUsed-= size;
00191
00192
00193 // Must find previous or/and next empty space, if any.
00194 //==========================
00195 ItEmptySpacePtrMap itPrevious, itNext;
00196
00197 // find the empty space which is immediately >= than ptr.
00198 itNext= _EmptySpaces.lower_bound((uint8*)ptr);
00199 // NB: it may be end(), if it is the last block (very rare).
00200
00201 // some check. next empty space ptr must be after ptr.
00202 if(itNext!=_EmptySpaces.end())
00203 {
00204 nlassert(itNext->second.Ptr >= (uint8*)ptr + size);
00205 }
00206
00207 // if itNext is not the first empty space, there is an empty space before us.
00208 if( itNext!= _EmptySpaces.begin() )
00209 {
00210 // NB: work even if itNext==end().
00211 itPrevious= itNext;
00212 itPrevious--;
00213 // some check. previous empty space ptr must be before ptr.
00214 nlassert(itPrevious!=_EmptySpaces.end());
00215 nlassert(itPrevious->second.Ptr + itPrevious->second.Size <= (uint8*)ptr );
00216 }
00217 else
00218 itPrevious= _EmptySpaces.end();
00219
00220
00221 // if next exist.
00222 if(itNext!=_EmptySpaces.end())
00223 {
00224 // If Previous is not just after allocated ptr, it means that there is some allocated blocks beetween,
00225 // so it is not a valid empty space to concat.
00226 if(itNext->second.Ptr != (uint8*)ptr + size)
00227 itNext= _EmptySpaces.end();
00228 }
00229 // if previous exist.
00230 if(itPrevious!=_EmptySpaces.end())
00231 {
00232 // If Previous is not just before allocated ptr, it means that there is some allocated blocks beetween,
00233 // so it is not a valid empty space to concat.
00234 if(itPrevious->second.Ptr + itPrevious->second.Size != (uint8*)ptr )
00235 itPrevious=_EmptySpaces.end();
00236 }
00237
00238
00239
00240 // According to configuration, build the new empty space, mreging previous and next, and remove old ones.
00241 //==========================
00242 CEmptySpace newSpace;
00243
00244 // if no previous empty space, then newSpace start at ptr.
00245 if(itPrevious == _EmptySpaces.end())
00246 {
00247 // Start with old allocated block.
00248 newSpace.Ptr= (uint8*)ptr;
00249 newSpace.Size= size;
00250 }
00251 // else, start at previous Ptr.
00252 else
00253 {
00254 // Start with previous block. size is previous size + allocated block size.
00255 newSpace.Ptr= itPrevious->second.Ptr;
00256 newSpace.Size= itPrevious->second.Size + size;
00257 }
00258
00259 // if next empty space, must inc size.
00260 if(itNext != _EmptySpaces.end())
00261 {
00262 newSpace.Size+= itNext->second.Size;
00263 }
00264
00265
00266 // remove old empty space, and add new one.
00267 //==========================
00268
00269 // remove old empty spaces.
00270 if(itPrevious != _EmptySpaces.end())
00271 removeEmptySpace(itPrevious->second);
00272 if(itNext != _EmptySpaces.end())
00273 removeEmptySpace(itNext->second);
00274
00275
00276 // Add the new concatenated empty space.
00277 addEmptySpace(newSpace);
00278 }
|
|
|
return the size passed in setHeap().
Definition at line 67 of file heap_memory.h. References _HeapSize, and uint.
00067 {return _HeapSize;}
|
|
|
return the heap size allocated.
Definition at line 69 of file heap_memory.h. References _HeapSizeUsed, and uint.
00069 {return _HeapSizeUsed;}
|
|
||||||||||||||||
|
init the heap. this reset() the heap. heap ptr is stored in this class, but no CHeapMemory methods write or read into. They use standard heap instead (new / delete).
Definition at line 64 of file heap_memory.cpp. References _Alignment, _HeapPtr, _HeapSize, _HeapSizeUsed, addEmptySpace(), nlstop, NLMISC::CHeapMemory::CEmptySpace::Ptr, reset(), NLMISC::CHeapMemory::CEmptySpace::Size, size, uint, and uint8. Referenced by NL3D::CVertexArrayRangeATI::allocate(), NL3D::CVertexArrayRangeNVidia::allocate(), and NL3D::CVertexBufferHeap::init().
00065 {
00066 // setup alignement.
00067 if(align!=4 && align!=8 && align!=16 && align!=32)
00068 {
00069 nlstop;
00070 align= 4;
00071 }
00072 _Alignment= align;
00073
00074 // Manage alignement.
00075 size= (size) & (~(_Alignment-1));
00076
00077 // clear container.
00078 reset();
00079 if(heap==0 || size==0)
00080 return;
00081
00082 _HeapPtr= (uint8*)heap;
00083 _HeapSize= size;
00084 _HeapSizeUsed= 0;
00085
00086 // Add the only one empty space.
00087 CEmptySpace space;
00088 space.Ptr= _HeapPtr;
00089 space.Size= _HeapSize;
00090
00091 addEmptySpace(space);
00092 }
|
|
|
Definition at line 96 of file heap_memory.cpp. References _EmptySpaceMap, _EmptySpaces, NLMISC::CHeapMemory::CEmptySpace::Ptr, and NLMISC::CHeapMemory::CEmptySpace::SizeIt. Referenced by allocate(), and free().
00097 {
00098 // remove the iterator on the spaceMap.
00099 _EmptySpaceMap.erase( space.SizeIt );
00100
00101 // remove from the list of EmptySpaces. NB: must fo it after all, because "space" may be deleted.
00102 _EmptySpaces.erase( space.Ptr );
00103 }
|
|
|
reset the entire container. NB: no free() is made on the heap.
Definition at line 52 of file heap_memory.cpp. References _AllocatedSpaceMap, _EmptySpaceMap, _EmptySpaces, _HeapPtr, _HeapSize, and _HeapSizeUsed. Referenced by CHeapMemory(), NL3D::CVertexArrayRangeATI::free(), NL3D::CVertexArrayRangeNVidia::free(), initHeap(), and ~CHeapMemory().
00053 {
00054 _EmptySpaces.clear();
00055 _EmptySpaceMap.clear();
00056 _AllocatedSpaceMap.clear();
00057 _HeapPtr= NULL;
00058 _HeapSize= 0;
00059 _HeapSizeUsed= 0;
00060 }
|
|
|
Definition at line 113 of file heap_memory.h. Referenced by allocate(), CHeapMemory(), and initHeap(). |
|
|
Definition at line 120 of file heap_memory.h. Referenced by allocate(), free(), and reset(). |
|
|
for allocate method, the size -> empty space map.
Definition at line 118 of file heap_memory.h. Referenced by addEmptySpace(), allocate(), removeEmptySpace(), and reset(). |
|
|
The array of empty spaces.
Definition at line 116 of file heap_memory.h. Referenced by addEmptySpace(), allocate(), free(), removeEmptySpace(), and reset(). |
|
|
Definition at line 110 of file heap_memory.h. Referenced by initHeap(), and reset(). |
|
|
Definition at line 111 of file heap_memory.h. Referenced by getHeapSize(), initHeap(), and reset(). |
|
|
Definition at line 112 of file heap_memory.h. Referenced by allocate(), free(), getHeapSizeUsed(), initHeap(), and reset(). |
1.3.6