/* -*- C++ -*- */ #ifndef _LAZYSLOTHEAP_H_ #define _LAZYSLOTHEAP_H_ /* This heap manages memory in units of Chunks. malloc returns a slot within a chunk, while free returns slots back to a chunk. Once a chunk is COMPLETELY empty, it is returned to the superheap. */ #include #include template class LazySlotHeap : public Super { public: LazySlotHeap (void) : myChunk (new (Super::malloc (sz)) Chunk()) {} ~LazySlotHeap (void) { // Give up our chunk. Super::free (myChunk); } inline void * malloc (size_t sz) { assert (sz == chunkSize); void * ptr = myChunk->getSlot(); if (ptr == NULL) { myChunk = new (Super::malloc (sz)) Chunk(); ptr = myChunk->getSlot(); assert (ptr != NULL); } return ; } inline void free (void * ptr) { /// Return a slot to its chunk. Chunk * ch = Chunk::getChunk (ptr); ch->putSlot (ptr); // Once the chunk is completely empty, free it. if (ch->getNumSlotsAvailable() == ch->getNumSlots()) { if (ch == myChunk) { // If this was 'our' chunk, get another one. myChunk = new (Super::malloc (sz)) Chunk(); } Super::free (ch); } } private: Chunk * myChunk; }; #endif