28 #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
29 #define MAP_ANONYMOUS MAP_ANON
32 #define MAP_FAILED ((void*)-1)
38 #define ALIGN_SIZE (2 * sizeof(void*))
43 #define ROUND_TO_ALIGN(n) ((n+(ALIGN_SIZE-1)) & (~(ALIGN_SIZE-1)))
82 struct MemoryPool *pool;
84 pool = malloc (
sizeof (
struct MemoryPool));
88 pool->memory =
MMAP (
NULL, max, PROT_READ | PROT_WRITE,
89 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
95 pool->memory = malloc (max);
96 if (pool->memory ==
NULL)
121 if (pool->is_mmap ==
MHD_NO)
124 MUNMAP (pool->memory, pool->size);
135 size_t size,
int from_end)
140 if ((pool->pos + size > pool->end) || (pool->pos + size < pool->pos))
144 ret = &pool->memory[pool->end - size];
149 ret = &pool->memory[pool->pos];
180 if ((pool->end < old_size) || (pool->end < new_size))
183 if ((pool->pos >= old_size) && (&pool->memory[pool->pos - old_size] == old))
186 if (pool->pos + new_size - old_size <= pool->end)
189 pool->pos += new_size - old_size;
190 if (new_size < old_size)
191 memset (&pool->memory[pool->pos], 0, old_size - new_size);
197 if (new_size <= old_size)
199 if ((pool->pos + new_size >= pool->pos) &&
200 (pool->pos + new_size <= pool->end))
203 ret = &pool->memory[pool->pos];
204 memcpy (ret, old, old_size);
205 pool->pos += new_size;
228 if (keep != pool->memory)
230 memmove (pool->memory, keep, size);
235 pool->end = pool->size;