36 MemoryPool::MemoryPool(
void * m_beg,
size_t m_size):initbeg((char*)m_beg), initend(((char*)m_beg)+m_size)
38 Memory m((
char*) m_beg, m_size);
39 freelist.push_back(m);
44 for(list<Memory>::iterator iter = freelist.begin(); iter != freelist.end(); ++iter)
46 if ((*iter).size > size)
48 char * free = (*iter).begin;
49 (*iter).begin +=
size;
55 cout <<
"No pinned memory available" << endl;
62 if( ((
char*) base) >= initbeg && (((
char*)base) + size) < initend)
64 list<Memory>::iterator titr = freelist.begin();
65 list<Memory>::iterator litr = freelist.begin();
68 if( (
char*)base < titr->begaddr())
70 if(titr->begaddr() == ((
char*)base) +
size)
72 titr->begin = (
char*)base;
77 Memory m((
char*) base, size);
78 freelist.insert(titr, m);
81 else if( litr == freelist.end() )
83 if(titr->endaddr() == (
char*)base)
89 Memory m((
char*) base, size);
90 freelist.insert(litr, m);
96 while( litr != freelist.end() && litr->begaddr() < (
char*)base)
102 if(titr->endaddr() == (
char*)base)
105 if( litr == freelist.end() || litr->begaddr() != ((
char*)base) +
size)
111 titr->size += (size + litr->size);
112 freelist.erase(litr);
117 if( litr == freelist.end() || litr->begaddr() != ((
char*)base) +
size)
119 Memory m((
char*) base, size);
122 freelist.insert(litr, m);
126 litr->begin = (
char*)base;
134 cerr <<
"Memory starting at " << base <<
" and ending at " 135 << (
void*) ((
char*) base +
size) <<
" is out of pool bounds, cannot dealloc()" << endl;
143 for(list<Memory>::const_iterator iter = mpool.freelist.begin(); iter != mpool.freelist.end(); ++iter, ++i)
145 outfile <<
"Chunk " << i <<
" of size: " << (*iter).size <<
" starts:" << (
void*)(*iter).begin
146 <<
" and ends: " << (
void*) ((*iter).begin + (*iter).size) << endl ;
void dealloc(void *base, size_t size)
void * alloc(size_t size)
friend std::ofstream & operator<<(std::ofstream &outfile, const MemoryPool &mpool)