00001 #include "PsnDescriptorMemoryManager.h" 00002 00003 #include "PsnMemoryElementDescriptor.h" 00004 00005 PsnDescriptorMemoryManager::~PsnDescriptorMemoryManager() 00006 { 00007 00008 } 00009 00010 PsnDescriptorMemoryManager::PsnDescriptorMemoryManager ( PsnMemoryManager & rawMemoryProvider) : 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 } 00036 00037 00038 00039 bool PsnDescriptorMemoryManager::inAdressSpace ( void * ptr ) const 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 } 00051 00052 void * PsnDescriptorMemoryManager::allocateSizeRemembered (size_t 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 } 00096 00097 00098 void PsnDescriptorMemoryManager::freeSizeRemembered ( void * ptr) 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 } 00111 00112 bool PsnDescriptorMemoryManager::isFree (void * ptr) 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 }
| Documentation generated on Mon Nov 25 15:25:00 2002 |
Generated with doxygen 1.2.12 by Dimitri van Heesch , 1997-2001 |