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, max, PROT_READ | PROT_WRITE,
100 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
101 #elif defined(_WIN32) 102 pool->memory = VirtualAlloc(
NULL, max, MEM_COMMIT | MEM_RESERVE,
110 pool->memory = malloc (max);
111 if (pool->memory ==
NULL)
139 if (pool->is_mmap ==
MHD_NO)
142 #if defined(MAP_ANONYMOUS) && !defined(_WIN32) 143 munmap (pool->memory, pool->size);
144 #elif defined(_WIN32) 145 VirtualFree(pool->memory, 0, MEM_RELEASE);
166 size_t size,
int from_end)
172 if ( (0 == asize) && (0 != size) )
174 if ((pool->pos + asize > pool->end) || (pool->pos + asize < pool->pos))
178 ret = &pool->memory[pool->end - asize];
183 ret = &pool->memory[pool->pos];
217 if ( (0 == asize) && (0 != new_size) )
219 if ((pool->end < old_size) || (pool->end < asize))
222 if ( (pool->pos >= old_size) &&
223 (&pool->memory[pool->pos - old_size] == old) )
226 if (pool->pos + asize - old_size <= pool->end)
229 pool->pos += asize - old_size;
230 if (asize < old_size)
231 memset (&pool->memory[pool->pos], 0, old_size - asize);
237 if (asize <= old_size)
239 if ((pool->pos + asize >= pool->pos) &&
240 (pool->pos + asize <= pool->end))
243 ret = &pool->memory[pool->pos];
244 memmove (ret, old, old_size);
274 if (keep != pool->memory)
276 memmove (pool->memory,
282 pool->end = pool->size;
284 memset (&pool->memory[copy_bytes],
286 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)
#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...