00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <new>
00033
00034 inline
00035 Sacado::Fad::MemPool::MemPool(unsigned int elem_size, unsigned int n_elem,
00036 unsigned int pre_alloc) :
00037 esize(elem_size < sizeof(Link) ? sizeof(Link) : elem_size),
00038 n(n_elem),
00039 csize(esize*n+sizeof(Chunk)),
00040 chunks(NULL),
00041 head(NULL),
00042 num_chunks(0)
00043 {
00044
00045 if (pre_alloc)
00046 for (unsigned int i=0; i<pre_alloc; i++)
00047 grow();
00048 }
00049
00050 inline
00051 Sacado::Fad::MemPool::~MemPool()
00052 {
00053 Chunk * nc = chunks;
00054 while (nc != NULL) {
00055 Chunk * p = nc;
00056 nc = nc->next;
00057 operator delete((void*) p);
00058 }
00059 }
00060
00061 inline void*
00062 Sacado::Fad::MemPool::alloc()
00063 {
00064 if (head == NULL)
00065 grow();
00066 Link *p = head;
00067 head = p->next;
00068
00069 return p;
00070 }
00071
00072 inline void
00073 Sacado::Fad::MemPool::free(void *b)
00074 {
00075 if (b == NULL)
00076 return;
00077 Link *p = static_cast<Link*>(b);
00078 p->next = head;
00079 head = p;
00080 }
00081
00082 inline void
00083 Sacado::Fad::MemPool::grow()
00084 {
00085
00086 void *p = operator new(csize);
00087 Chunk *c = static_cast<Chunk*>(p);
00088 c->mem = static_cast<char*>(p)+sizeof(Chunk);
00089 c->next = chunks;
00090 chunks = c;
00091 ++num_chunks;
00092
00093
00094 char *start = c->mem;
00095 char *last = &start[(n-1)*esize];
00096
00097 for (char *q = start; q<last; q += esize)
00098 reinterpret_cast<Link*>(q)->next = reinterpret_cast<Link*>(q+esize);
00099 reinterpret_cast<Link*>(last)->next = NULL;
00100 head = reinterpret_cast<Link*>(start);
00101 }