Source Code (Use browser search to find items of interest.)

Class Index

kdelibs'KZoneAllocator (./kdelibs/kdecore/kallocator.h:42)

class KZoneAllocator
{
public:
    /**
     * Create a ZoneAllocator 
     * @param _blockSize Size in bytes of the blocks requested from malloc. 
     */
    KZoneAllocator(long _blockSize = 128*1024);

    /**
     * Destruct the ZoneAllocator and free all memory allocated by it.
     */
    ~KZoneAllocator();

    /**
     * Allocate a memory block.
     * @param _size Size in bytes of the memory block. Memory is not alligned!
     */
    void* allocate(size_t _size);
                
protected:    
    long blockSize;
    QList<char> memoryBlocks;
    char *currentBlock;
    long blockOffset;
private:
    KZoneAllocatorPrivate *d;
};

kdelibs'KZoneAllocator::KZoneAllocator() (./kdelibs/kdecore/kallocator.cpp:28)

KZoneAllocator::KZoneAllocator(long _blockSize)
: blockSize(_blockSize), blockOffset(0)
{
    currentBlock = new char[_blockSize];
    memoryBlocks.append(currentBlock);
}


kdelibs'KZoneAllocator::~KZoneAllocator() (./kdelibs/kdecore/kallocator.cpp:35)

KZoneAllocator::~KZoneAllocator()
{
    while (!memoryBlocks.isEmpty())
    {
        char *oldBuffer = (char *) memoryBlocks.take(0);
        delete [] oldBuffer;
    }
}

void *

kdelibs'KZoneAllocator::allocate() (./kdelibs/kdecore/kallocator.cpp:45)

KZoneAllocator::allocate(size_t _size)
{
   // Use the size of (void *) as alignment
   const size_t alignment = sizeof(void *);
   _size = (_size + alignment - 1) & ~(alignment - 1);   

   if ((long) _size + blockOffset > blockSize)
   {
      currentBlock = new char[blockSize];
      memoryBlocks.append(currentBlock);
      blockOffset = 0;
      printf("Allocating block #%d\n", memoryBlocks.count());
   } 
   void *result = (void *)(currentBlock+blockOffset);
   blockOffset += _size;
   return result;
}