Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

PsnDescriptorMemoryManager.cxx

Go to the documentation of this file.
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 }

logo OpenMask

Documentation generated on Mon Nov 25 15:25:00 2002

Generated with doxygen 1.2.12 by Dimitri van Heesch ,   1997-2001