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)))
89 struct MemoryPool *pool;
91 pool = malloc (
sizeof (
struct MemoryPool));
98 pool->memory = MMAP (
NULL, max, PROT_READ | PROT_WRITE,
99 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
105 pool->memory = malloc (max);
106 if (pool->memory ==
NULL)
134 if (pool->is_mmap ==
MHD_NO)
137 MUNMAP (pool->memory, pool->size);
155 size_t size,
int from_end)
161 if ( (0 == asize) && (0 != size) )
163 if ((pool->pos + asize > pool->end) || (pool->pos + asize < pool->pos))
167 ret = &pool->memory[pool->end - asize];
172 ret = &pool->memory[pool->pos];
206 if ( (0 == asize) && (0 != new_size) )
208 if ((pool->end < old_size) || (pool->end < asize))
211 if ((pool->pos >= old_size) && (&pool->memory[pool->pos - old_size] == old))
214 if (pool->pos + asize - old_size <= pool->end)
217 pool->pos += asize - old_size;
218 if (asize < old_size)
219 memset (&pool->memory[pool->pos], 0, old_size - asize);
225 if (asize <= old_size)
227 if ((pool->pos + asize >= pool->pos) &&
228 (pool->pos + asize <= pool->end))
231 ret = &pool->memory[pool->pos];
232 memcpy (ret, old, old_size);
258 if (keep != pool->memory)
260 memmove (pool->memory, keep, size);
265 pool->end = pool->size;
266 memset (&pool->memory[size],
void MHD_pool_destroy(struct MemoryPool *pool)
void * MHD_pool_allocate(struct MemoryPool *pool, size_t size, int from_end)
void * MHD_pool_reallocate(struct MemoryPool *pool, void *old, size_t old_size, size_t new_size)
#define ROUND_TO_ALIGN(n)
void * MHD_pool_reset(struct MemoryPool *pool, void *keep, size_t size)
struct MemoryPool * MHD_pool_create(size_t max)
memory pool; mostly used for efficient (de)allocation for each connection and bounding memory use for...