2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
12 #include "Evas_Data.h"
13 #include "evas_mempool.h"
17 typedef struct _Pool Pool;
28 _evas_mp_pool_new(Evas_Mempool *pool)
40 item_alloc = ((pool->item_size + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *);
41 p = malloc(sizeof(Pool) + (pool->pool_size * item_alloc));
42 ptr = (void **)(((unsigned char *)p) + sizeof(Pool));
45 for (i = 0; i < pool->pool_size - 1; i++)
47 *ptr = (void **)(((unsigned char *)ptr) + item_alloc);
56 _evas_mp_pool_free(Pool *p)
67 evas_mempool_malloc(Evas_Mempool *pool, int size)
77 for (p = pool->first; p; p = p->next) // look 4 pool from 2nd bucket on
79 if (p->base) // base is not NULL - has a free slot
83 if (pool->last == p) pool->last = p->prev;
84 p->prev->next = p->next;
86 p->next = pool->first;
93 if (!p) // we have reached the end of the list - no free pools
95 p = _evas_mp_pool_new(pool);
98 p->next = pool->first;
99 if (p->next) p->next->prev = p;
100 if (!pool->last) pool->last = p;
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 if (p->prev) p->prev->next = p->next;
110 else pool->first = p->next;
111 p->next->prev = p->prev;
112 ((Pool *)pool->last)->next = p;
113 p->prev = pool->last;
125 evas_mempool_free(Evas_Mempool *pool, void *ptr)
134 int item_alloc, psize;
136 item_alloc = ((pool->item_size + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *);
137 psize = item_alloc * pool->pool_size;
138 for (p = (Pool *)(pool->first); p; p = p->next) // look 4 pool
140 pmem = (void *)(((unsigned char *)p) + sizeof(Pool)); // pool mem base
141 if ((ptr >= pmem) && ((unsigned char *)ptr < (((unsigned char *)pmem) + psize))) // is it in pool mem?
143 *((void **)ptr) = p->base; // freed node points to prev free node
144 p->base = ptr; // next free node is now the one we freed
147 if (p->usage == 0) // free bucket
149 if (p->prev) p->prev->next = p->next;
150 if (p->next) p->next->prev = p->prev;
151 if (pool->last == p) pool->last = p->prev;
152 if (pool->first == p) pool->first = p->next;
153 _evas_mp_pool_free(p);
157 if (p->prev) // if not the first - move to front
159 p->prev->next = p->next;
160 if (p->next) p->next->prev = p->prev;
161 if (pool->last == p) pool->last = p->prev;
163 p->next = pool->first;
175 evas_mempool_calloc(Evas_Mempool *pool, int size)
178 return calloc(1, size);
184 mem = evas_mempool_malloc(pool, size);
185 memset(mem, 0, size);