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));
94 #if defined(MAP_ANONYMOUS) || defined(_WIN32) 98 #if defined(MAP_ANONYMOUS) && !defined(_WIN32) 99 pool->memory = mmap (
NULL,
101 PROT_READ | PROT_WRITE,
102 MAP_PRIVATE | MAP_ANONYMOUS,
105 #elif defined(_WIN32) 106 pool->memory = VirtualAlloc (
NULL,
108 MEM_COMMIT | MEM_RESERVE,
115 (
NULL == pool->memory))
117 pool->memory = malloc (max);
118 if (
NULL == pool->memory)
146 if (
MHD_NO == pool->is_mmap)
149 #if defined(MAP_ANONYMOUS) && !defined(_WIN32) 150 munmap (pool->memory,
152 #elif defined(_WIN32) 153 VirtualFree (pool->memory,
172 return (pool->end - pool->pos);
196 if ( (0 == asize) && (0 != size) )
198 if ( (pool->pos + asize > pool->end) ||
199 (pool->pos + asize < pool->pos))
203 ret = &pool->memory[pool->end - asize];
208 ret = &pool->memory[pool->pos];
245 if ( (pool->end < old_size) ||
246 (pool->end < asize) )
249 if ( (pool->pos >= old_size) &&
250 (&pool->memory[pool->pos - old_size] == old) )
253 if (pool->pos + asize - old_size <= pool->end)
256 pool->pos += asize - old_size;
257 if (asize < old_size)
258 memset (&pool->memory[pool->pos],
266 if (asize <= old_size)
268 if ((pool->pos + asize >= pool->pos) &&
269 (pool->pos + asize <= pool->end))
272 ret = &pool->memory[pool->pos];
304 if ( (
NULL != keep) &&
305 (keep != pool->memory) )
308 memmove (pool->memory,
313 pool->end = pool->size;
315 if (pool->size > copy_bytes)
316 memset (&pool->memory[copy_bytes],
318 pool->size - copy_bytes);
void * MHD_pool_reset(struct MemoryPool *pool, void *keep, size_t copy_bytes, size_t new_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)
size_t MHD_pool_get_free(struct MemoryPool *pool)
#define ROUND_TO_ALIGN(n)
struct MemoryPool * MHD_pool_create(size_t max)
memory pool; mostly used for efficient (de)allocation for each connection and bounding memory use for...