9 #include "evas_mempool.h"
13 typedef struct _Pool Pool;
24 _evas_mp_pool_new(Evas_Mempool *pool)
35 ((pool->item_size + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *);
36 p = malloc(sizeof(Pool) + (pool->pool_size * item_alloc));
37 ptr = (void **)(((unsigned char *)p) + sizeof(Pool));
40 for (i = 0; i < pool->pool_size - 1; i++)
42 *ptr = (void **)(((unsigned char *)ptr) + item_alloc);
51 _evas_mp_pool_free(Pool *p)
59 evas_mempool_malloc(Evas_Mempool *pool, int size __UNUSED__)
67 for (p = pool->first; p; p = p->next) // look 4 pool from 2nd bucket on
69 if (p->base) // base is not NULL - has a free slot
76 p->prev->next = p->next;
78 p->next = pool->first;
86 if (!p) // we have reached the end of the list - no free pools
88 p = _evas_mp_pool_new(pool);
93 p->next = pool->first;
103 mem = p->base; // this points to the next free block - so take it
104 p->base = *((void **)mem); // base now points to the next free block
105 if (!p->base) // move to end - it just filled up
109 p->prev->next = p->next;
111 pool->first = p->next;
113 p->next->prev = p->prev;
114 ((Pool *)pool->last)->next = p;
115 p->prev = pool->last;
127 evas_mempool_free(Evas_Mempool *pool, void *ptr)
134 int item_alloc, psize;
137 ((pool->item_size + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *);
138 psize = item_alloc * pool->pool_size;
139 for (p = (Pool *)(pool->first); p; p = p->next) // look 4 pool
141 pmem = (void *)(((unsigned char *)p) + sizeof(Pool)); // pool mem base
143 ((unsigned char *)ptr < (((unsigned char *)pmem) + psize))) // is it in pool mem?
145 *((void **)ptr) = p->base; // freed node points to prev free node
146 p->base = ptr; // next free node is now the one we freed
149 if (p->usage == 0) // free bucket
152 p->prev->next = p->next;
155 p->next->prev = p->prev;
158 pool->last = p->prev;
160 if (pool->first == p)
161 pool->first = p->next;
163 _evas_mp_pool_free(p);
165 else if (p->prev) // if not the first - move to front
167 p->prev->next = p->next;
169 p->next->prev = p->prev;
172 pool->last = p->prev;
175 p->next = pool->first;
188 evas_mempool_calloc(Evas_Mempool *pool, int size)
191 return calloc(1, size);
195 mem = evas_mempool_malloc(pool, size);
196 memset(mem, 0, size);