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)))
104 struct MemoryPool *pool;
106 pool = malloc (
sizeof (
struct MemoryPool));
109 #if defined(MAP_ANONYMOUS) || defined(_WIN32)
110 if (max <= 32 * 1024)
113 #if defined(MAP_ANONYMOUS) && ! defined(_WIN32)
114 pool->memory = mmap (
NULL,
116 PROT_READ | PROT_WRITE,
117 MAP_PRIVATE | MAP_ANONYMOUS,
120 #elif defined(_WIN32)
121 pool->memory = VirtualAlloc (
NULL,
123 MEM_COMMIT | MEM_RESERVE,
130 (
NULL == pool->memory))
132 pool->memory = malloc (max);
133 if (
NULL == pool->memory)
138 pool->is_mmap =
false;
142 pool->is_mmap =
true;
164 #if defined(MAP_ANONYMOUS) && ! defined(_WIN32)
165 munmap (pool->memory,
167 #elif defined(_WIN32)
168 VirtualFree (pool->memory,
187 return (pool->end - pool->pos);
211 if ( (0 == asize) && (0 != size) )
213 if ( (pool->pos + asize > pool->end) ||
214 (pool->pos + asize < pool->pos))
218 ret = &pool->memory[pool->end - asize];
223 ret = &pool->memory[pool->pos];
260 if ( (pool->end < old_size) ||
261 (pool->end < asize) )
264 if ( (pool->pos >= old_size) &&
265 (&pool->memory[pool->pos - old_size] == old) )
268 if (pool->pos + asize - old_size <= pool->end)
271 pool->pos += asize - old_size;
272 if (asize < old_size)
273 memset (&pool->memory[pool->pos],
281 if (asize <= old_size)
283 if ((pool->pos + asize >= pool->pos) &&
284 (pool->pos + asize <= pool->end))
287 ret = &pool->memory[pool->pos];
319 if ( (
NULL != keep) &&
320 (keep != pool->memory) )
323 memmove (pool->memory,
328 pool->end = pool->size;
330 if (pool->size > copy_bytes)
331 memset (&pool->memory[copy_bytes],
333 pool->size - copy_bytes);
void MHD_pool_destroy(struct MemoryPool *pool)
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)
struct MemoryPool * MHD_pool_create(size_t max)
#define ROUND_TO_ALIGN(n)
void * MHD_pool_reset(struct MemoryPool *pool, void *keep, size_t copy_bytes, size_t new_size)
_MHD_EXTERN void MHD_free(void *ptr)
void * MHD_pool_allocate(struct MemoryPool *pool, size_t size, int from_end)
memory pool; mostly used for efficient (de)allocation for each connection and bounding memory use for...