#include <PsnDescriptorMemoryManager.h>
Inheritance diagram for PsnDescriptorMemoryManager:


Public Methods | |
| virtual | ~PsnDescriptorMemoryManager () |
| Desctructor. | |
| PsnDescriptorMemoryManager (PsnMemoryManager &rawMemoryProvider) | |
| Constructor. | |
| virtual void * | allocateSizeRemembered (size_t size) |
| alloc a memory zone that can be correctly freed by calling freeSizeRemembered with the resulting pointer | |
| virtual void | freeSizeRemembered (void *ptr) |
| free a memory zone allocated with allocateSizeRemembered | |
| virtual bool | inAdressSpace (void *ptr) const |
| find out if a given adress is managed by the current memory manager | |
| bool | isFree (void *ptr) |
| make sure a pointer is in the list of unused memory element descriptors | |
Protected Attributes | |
| PsnMemoryManager & | _rawMemoryProvider |
| if more memory is needed, get it from this memory manager | |
| vector< void * > | _freeBlocks |
| the list of available memory blocks. | |
| int | _stackTop |
| the vector is used a a stack | |
| PsnMemoryElementDescriptor * | _managedMemoryZones |
| head of the list of managed memory zones | |
| size_t | _currentMemorySize |
| the size of the managed memory | |
Definition at line 31 of file PsnDescriptorMemoryManager.h.
|
|
Desctructor.
Definition at line 5 of file PsnDescriptorMemoryManager.cxx.
00006 {
00007
00008 }
|
|
|
Constructor.
Definition at line 10 of file PsnDescriptorMemoryManager.cxx. References _currentMemorySize, _freeBlocks, _managedMemoryZones, _rawMemoryProvider, _stackTop, PsnMemoryManager::allocateSizeRemembered(), PsnMemoryElementDescriptor::base, PsnMemoryElementDescriptor::next, vector< void * >::push_back(), vector< void * >::reserve(), and PsnMemoryElementDescriptor::size.
00010 : 00011 PsnMemoryManager (), 00012 _rawMemoryProvider ( rawMemoryProvider ), 00013 _stackTop (-1) 00014 { 00015 // a bit less than a memory page 00016 _currentMemorySize = 85 * sizeof (PsnMemoryElementDescriptor) ; 00017 00018 _freeBlocks.reserve ( 85 ) ; 00019 00020 void * memory = _rawMemoryProvider.allocateSizeRemembered ( _currentMemorySize ) ; 00021 00022 for ( void * mem = memory; 00023 mem != (void *) ((unsigned int)memory + _currentMemorySize) ; 00024 mem = (void *) ((unsigned int)mem + sizeof (PsnMemoryElementDescriptor) ) ) 00025 { 00026 _freeBlocks.push_back(mem) ; 00027 ++_stackTop ; 00028 } 00029 00030 _managedMemoryZones = new (& _rawMemoryProvider) PsnMemoryElementDescriptor() ; 00031 _managedMemoryZones->base = (unsigned int)memory ; 00032 _managedMemoryZones->size = _currentMemorySize ; 00033 _managedMemoryZones->next = 0 ; 00034 00035 } |
|
|
alloc a memory zone that can be correctly freed by calling freeSizeRemembered with the resulting pointer
Implements PsnMemoryManager. Definition at line 52 of file PsnDescriptorMemoryManager.cxx. References _currentMemorySize, _freeBlocks, _managedMemoryZones, _rawMemoryProvider, _stackTop, PsnMemoryManager::allocateSizeRemembered(), PsnMemoryElementDescriptor::base, vector< void * >::capacity(), isFree(), PsnMemoryElementDescriptor::next, vector< void * >::resize(), and PsnMemoryElementDescriptor::size.
00053 {
00054 // this memory manager only allocates memory for memoryElementDescriptors
00055 assert ( size == sizeof (PsnMemoryElementDescriptor) ) ;
00056
00057 void * result ;
00058 if (_stackTop == -1)
00059 {
00060 // allocate an other memory zone for memory element decriptors
00061 size_t allocatedMemory = _currentMemorySize ;
00062
00063 void * memory = _rawMemoryProvider.allocateSizeRemembered ( allocatedMemory ) ;
00064
00065 _freeBlocks.resize (_freeBlocks.capacity() + allocatedMemory/sizeof (PsnMemoryElementDescriptor), NULL ) ;
00066
00067 for ( void * mem = memory;
00068 mem != (void *) ((unsigned int)memory + allocatedMemory) ;
00069 mem = (void *) ((unsigned int)mem + sizeof (PsnMemoryElementDescriptor) ) )
00070 {
00071 ++_stackTop ;
00072 _freeBlocks[_stackTop] = mem ;
00073 }
00074 PsnMemoryElementDescriptor * newMemoryZones = new (& _rawMemoryProvider) PsnMemoryElementDescriptor() ;
00075 newMemoryZones->base = (unsigned int)memory ;
00076 newMemoryZones->size = allocatedMemory ;
00077 newMemoryZones->next = (unsigned int) _managedMemoryZones ;
00078
00079 _managedMemoryZones = newMemoryZones ;
00080
00081 _currentMemorySize += allocatedMemory ;
00082
00083 //recursive call
00084 result = allocateSizeRemembered (size) ;
00085 }
00086 else
00087 {
00088 result = _freeBlocks[_stackTop] ;
00089 --_stackTop ;
00090 }
00091 #ifdef _DEBUGMEMORYMANAGEMENT
00092 assert ( !isFree (result) ) ;
00093 #endif
00094 return result ;
00095 }
|
|
|
free a memory zone allocated with allocateSizeRemembered
Implements PsnMemoryManager. Definition at line 98 of file PsnDescriptorMemoryManager.cxx. References _freeBlocks, _stackTop, isFree(), and vector< void * >::size().
00099 {
00100 #ifdef _DEBUGMEMORYMANAGEMENT
00101 // make sure no double free happens
00102 assert ( ! isFree (ptr) ) ;
00103 assert ( _stackTop < _freeBlocks.size() ) ;
00104 #endif
00105 ++_stackTop ;
00106 _freeBlocks[_stackTop] = ptr ;
00107 #ifdef _DEBUGMEMORYMANAGEMENT
00108 assert ( isFree ( ptr ) ) ;
00109 #endif
00110 }
|
|
|
find out if a given adress is managed by the current memory manager
Implements PsnMemoryManager. Definition at line 39 of file PsnDescriptorMemoryManager.cxx. References _managedMemoryZones, PsnMemoryElementDescriptor::inAdressSpace(), and PsnMemoryElementDescriptor::next.
00040 {
00041 bool result = false ;
00042 unsigned int adress = (unsigned int ) ptr ;
00043 PsnMemoryElementDescriptor * current = _managedMemoryZones ;
00044 while ( (! result) && ( current != NULL ) )
00045 {
00046 result = current->inAdressSpace ( adress ) ;
00047 current = (PsnMemoryElementDescriptor *) current->next ;
00048 }
00049 return result ;
00050 }
|
|
|
make sure a pointer is in the list of unused memory element descriptors
Definition at line 112 of file PsnDescriptorMemoryManager.cxx. References _freeBlocks, and _stackTop. Referenced by allocateSizeRemembered(), and freeSizeRemembered().
00113 {
00114 #ifndef _DEBUGMEMORYMANAGEMENT
00115 // this should only be used when debugging
00116 assert ( false ) ;
00117 #endif
00118 bool found = false ;
00119 int i = 0 ;
00120 while ( (!found) && ( i != _stackTop+1 ) )
00121 {
00122 found = ( ptr == _freeBlocks[i] ) ;
00123 ++i ;
00124 }
00125 return found ;
00126 }
|
|
|
the size of the managed memory
Definition at line 70 of file PsnDescriptorMemoryManager.h. Referenced by allocateSizeRemembered(), and PsnDescriptorMemoryManager(). |
|
|
the list of available memory blocks. a vector is used because allocation can be done by block, and there for only once for n descriptors here, Definition at line 61 of file PsnDescriptorMemoryManager.h. Referenced by allocateSizeRemembered(), freeSizeRemembered(), isFree(), and PsnDescriptorMemoryManager(). |
|
|
head of the list of managed memory zones
Definition at line 67 of file PsnDescriptorMemoryManager.h. Referenced by allocateSizeRemembered(), inAdressSpace(), and PsnDescriptorMemoryManager(). |
|
|
if more memory is needed, get it from this memory manager
Definition at line 56 of file PsnDescriptorMemoryManager.h. Referenced by allocateSizeRemembered(), and PsnDescriptorMemoryManager(). |
|
|
the vector is used a a stack
Definition at line 64 of file PsnDescriptorMemoryManager.h. Referenced by allocateSizeRemembered(), freeSizeRemembered(), isFree(), and PsnDescriptorMemoryManager(). |
| Documentation generated on Mon Nov 25 15:25:57 2002 |
Generated with doxygen 1.2.12 by Dimitri van Heesch , 1997-2001 |