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

PsnDescriptorMemoryManager Class Reference

defines a memory manager that allocates memory for PsnMemoryElementDescriptors. More...

#include <PsnDescriptorMemoryManager.h>

Inheritance diagram for PsnDescriptorMemoryManager:

Inheritance graph
[legend]
Collaboration diagram for PsnDescriptorMemoryManager:

Collaboration graph
[legend]
List of all members.

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


Detailed Description

defines a memory manager that allocates memory for PsnMemoryElementDescriptors.

Author:
David Margery
Version:
1.0

Definition at line 31 of file PsnDescriptorMemoryManager.h.


Constructor & Destructor Documentation

PsnDescriptorMemoryManager::~PsnDescriptorMemoryManager   [virtual]
 

Desctructor.

Definition at line 5 of file PsnDescriptorMemoryManager.cxx.

00006 {
00007    
00008 }

PsnDescriptorMemoryManager::PsnDescriptorMemoryManager PsnMemoryManager   rawMemoryProvider
 

Constructor.

Parameters:
rawMemoryProvider: if more memory is needed, get it from this memory manager

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 }
   


Member Function Documentation

void * PsnDescriptorMemoryManager::allocateSizeRemembered size_t    size [virtual]
 

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 }

void PsnDescriptorMemoryManager::freeSizeRemembered void *    ptr [virtual]
 

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 }

bool PsnDescriptorMemoryManager::inAdressSpace void *    ptr const [virtual]
 

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 }

bool PsnDescriptorMemoryManager::isFree void *    ptr
 

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 }


Member Data Documentation

size_t PsnDescriptorMemoryManager::_currentMemorySize [protected]
 

the size of the managed memory

Definition at line 70 of file PsnDescriptorMemoryManager.h.

Referenced by allocateSizeRemembered(), and PsnDescriptorMemoryManager().

vector<void *> PsnDescriptorMemoryManager::_freeBlocks [protected]
 

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().

PsnMemoryElementDescriptor* PsnDescriptorMemoryManager::_managedMemoryZones [protected]
 

head of the list of managed memory zones

Definition at line 67 of file PsnDescriptorMemoryManager.h.

Referenced by allocateSizeRemembered(), inAdressSpace(), and PsnDescriptorMemoryManager().

PsnMemoryManager& PsnDescriptorMemoryManager::_rawMemoryProvider [protected]
 

if more memory is needed, get it from this memory manager

Definition at line 56 of file PsnDescriptorMemoryManager.h.

Referenced by allocateSizeRemembered(), and PsnDescriptorMemoryManager().

int PsnDescriptorMemoryManager::_stackTop [protected]
 

the vector is used a a stack

Definition at line 64 of file PsnDescriptorMemoryManager.h.

Referenced by allocateSizeRemembered(), freeSizeRemembered(), isFree(), and PsnDescriptorMemoryManager().


The documentation for this class was generated from the following files:
logo OpenMask

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

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