43#if defined(_SC_PAGE_SIZE)
44#define MHD_SC_PAGESIZE _SC_PAGE_SIZE
45#elif defined(_SC_PAGESIZE)
46#define MHD_SC_PAGESIZE _SC_PAGESIZE
51#if defined(MHD_USE_PAGESIZE_MACRO) || defined(MHD_USE_PAGE_SIZE_MACRO)
55#ifdef HAVE_SYS_PARAM_H
63#define _MHD_FALLBACK_PAGE_SIZE (4096)
65#if defined(MHD_USE_PAGESIZE_MACRO)
66#define MHD_DEF_PAGE_SIZE_ PAGESIZE
67#elif defined(MHD_USE_PAGE_SIZE_MACRO)
68#define MHD_DEF_PAGE_SIZE_ PAGE_SIZE
70#define MHD_DEF_PAGE_SIZE_ _MHD_FALLBACK_PAGE_SIZE
74#ifdef MHD_ASAN_POISON_ACTIVE
75#include <sanitizer/asan_interface.h>
79#if defined(MAP_ANON) && ! defined(MAP_ANONYMOUS)
80#define MAP_ANONYMOUS MAP_ANON
83#define MAP_FAILED NULL
84#elif ! defined(MAP_FAILED)
85#define MAP_FAILED ((void*) -1)
91#define ALIGN_SIZE (2 * sizeof(void*))
96#define ROUND_TO_ALIGN(n) (((n) + (ALIGN_SIZE - 1)) \
97 / (ALIGN_SIZE) *(ALIGN_SIZE))
119#ifndef MHD_ASAN_POISON_ACTIVE
120#define _MHD_NOSANITIZE_PTRS
121#define _MHD_RED_ZONE_SIZE (0)
122#define ROUND_TO_ALIGN_PLUS_RED_ZONE(n) ROUND_TO_ALIGN(n)
123#define _MHD_POISON_MEMORY(pointer, size) (void)0
124#define _MHD_UNPOISON_MEMORY(pointer, size) (void)0
128#define mp_ptr_le_(p1,p2) \
129 (((const uint8_t*)(p1)) <= ((const uint8_t*)(p2)))
134#define mp_ptr_diff_(p1,p2) \
135 ((size_t)(((const uint8_t*)(p1)) - ((const uint8_t*)(p2))))
137#define _MHD_RED_ZONE_SIZE (ALIGN_SIZE)
138#define ROUND_TO_ALIGN_PLUS_RED_ZONE(n) (ROUND_TO_ALIGN(n) + _MHD_RED_ZONE_SIZE)
139#define _MHD_POISON_MEMORY(pointer, size) \
140 ASAN_POISON_MEMORY_REGION ((pointer), (size))
141#define _MHD_UNPOISON_MEMORY(pointer, size) \
142 ASAN_UNPOISON_MEMORY_REGION ((pointer), (size))
143#if defined(FUNC_PTRCOMPARE_CAST_WORKAROUND_WORKS)
147#define mp_ptr_le_(p1,p2) \
148 (((uintptr_t)((const void*)(p1))) <= ((uintptr_t)((const void*)(p2))))
153#define mp_ptr_diff_(p1,p2) \
154 ((size_t)(((uintptr_t)((const uint8_t*)(p1))) - \
155 ((uintptr_t)((const uint8_t*)(p2)))))
156#elif defined(FUNC_ATTR_PTRCOMPARE_WORKS) && \
157 defined(FUNC_ATTR_PTRSUBTRACT_WORKS)
162__attribute__((no_sanitize (
"pointer-compare"))) static
bool
165 return (((
const uint8_t *) p1) <= ((
const uint8_t *) p2));
176__attribute__((no_sanitize (
"pointer-subtract"))) static
size_t
179 return (
size_t) (((
const uint8_t *) p1) - ((
const uint8_t *) p2));
183#elif defined(FUNC_ATTR_NOSANITIZE_WORKS)
188__attribute__((no_sanitize (
"address"))) static
bool
191 return (((
const uint8_t *) p1) <= ((
const uint8_t *) p2));
201__attribute__((no_sanitize (
"address"))) static
size_t
204 return (
size_t) (((
const uint8_t *) p1) - ((
const uint8_t *) p2));
209#error User-poisoning cannot be used
217#if defined(MHD_USE_PAGESIZE_MACRO_STATIC)
219#elif defined(MHD_USE_PAGE_SIZE_MACRO_STATIC)
231#ifdef MHD_SC_PAGESIZE
233 result = sysconf (MHD_SC_PAGESIZE);
292 struct MemoryPool *pool;
297 pool = malloc (
sizeof (
struct MemoryPool));
300#if defined(MAP_ANONYMOUS) || defined(_WIN32)
301 if ( (max <= 32 * 1024) ||
311#if defined(MAP_ANONYMOUS) && ! defined(_WIN32)
312 pool->memory = mmap (
NULL,
314 PROT_READ | PROT_WRITE,
315 MAP_PRIVATE | MAP_ANONYMOUS,
319 pool->memory = VirtualAlloc (
NULL,
321 MEM_COMMIT | MEM_RESERVE,
331 pool->memory = malloc (alloc_size);
332 if (
NULL == pool->memory)
337 pool->is_mmap =
false;
339#if defined(MAP_ANONYMOUS) || defined(_WIN32)
342 pool->is_mmap =
true;
347 pool->end = alloc_size;
348 pool->size = alloc_size;
367 mhd_assert (pool->size >= pool->end - pool->pos);
373#if defined(MAP_ANONYMOUS) && ! defined(_WIN32)
374 munmap (pool->memory,
377 VirtualFree (pool->memory,
397 mhd_assert (pool->size >= pool->end - pool->pos);
399#ifdef MHD_ASAN_POISON_ACTIVE
427 mhd_assert (pool->size >= pool->end - pool->pos);
432 if (asize > pool->end - pool->pos)
436 ret = &pool->memory[pool->end - asize];
441 ret = &pool->memory[pool->pos];
465 mhd_assert (pool->size >= pool->end - pool->pos);
470 const size_t block_offset =
mp_ptr_diff_ (block, pool->memory);
473 mhd_assert (pool->size >= block_offset + block_size);
503 size_t *required_bytes)
509 mhd_assert (pool->size >= pool->end - pool->pos);
517 if (asize > pool->end - pool->pos)
521 if (asize <= pool->end)
522 *required_bytes = asize - (pool->end - pool->pos);
528 ret = &pool->memory[pool->end - asize];
562 mhd_assert (pool->size >= pool->end - pool->pos);
566#if defined(MHD_ASAN_POISON_ACTIVE) && defined(HAVE___ASAN_REGION_IS_POISONED)
578 if (new_size > pool->size)
583 const size_t old_offset =
mp_ptr_diff_ (old, pool->memory);
584 const bool shrinking = (old_size > new_size);
601 (old_offset + old_size),
606 (pool->pos > old_offset));
612 memset ((uint8_t *) old + new_size, 0, old_size - new_size);
618 const size_t new_apos =
629 if (new_size > pool->size - old_offset)
631 if ( (new_apos > pool->end) ||
632 (new_apos < pool->pos) )
636 pool->pos = new_apos;
645 if ( (asize < new_size) ||
646 (asize > pool->end - pool->pos) )
649 new_blc = pool->memory + pool->pos;
656 memcpy (new_blc, old, old_size);
658 memset (old, 0, old_size);
683 mhd_assert (pool->size >= pool->end - pool->pos);
690 const size_t block_offset =
mp_ptr_diff_ (block, pool->memory);
698 (block_offset != pool->pos) || (block_size == 0));
702 memset (block, 0, block_size);
705#if ! defined(MHD_FAVOR_SMALL_CODE) && ! defined(MHD_ASAN_POISON_ACTIVE)
709 if (block_offset < pool->end)
723 if (alg_end > pool->size)
724 alg_end = pool->size;
726 if (alg_end == pool->pos)
731#if defined(MHD_ASAN_POISON_ACTIVE)
732 if (alg_start != block_offset)
735 alg_start - block_offset);
737 else if (0 != alg_start)
739 bool need_red_zone_before;
741#if defined(HAVE___ASAN_REGION_IS_POISONED)
742 need_red_zone_before =
743 (
NULL == __asan_region_is_poisoned (pool->memory
747#elif defined(HAVE___ASAN_ADDRESS_IS_POISONED)
748 need_red_zone_before =
749 (0 == __asan_address_is_poisoned (pool->memory + alg_start - 1));
751 need_red_zone_before =
true;
753 if (need_red_zone_before)
762 pool->pos = alg_start;
772 if (block_offset == pool->end)
775 const size_t alg_end =
804 mhd_assert (pool->size >= pool->end - pool->pos);
812 (pool->size >=
mp_ptr_diff_ (keep, pool->memory) + copy_bytes));
813#if defined(MHD_ASAN_POISON_ACTIVE) && defined(HAVE___ASAN_REGION_IS_POISONED)
814 mhd_assert (
NULL == __asan_region_is_poisoned (keep, copy_bytes));
817 if ( (
NULL != keep) &&
818 (keep != pool->memory) )
821 memmove (pool->memory,
826 if (pool->size > copy_bytes)
830 to_zero = pool->size - copy_bytes;
836 uint8_t *recommit_addr;
839 recommit_addr = pool->memory + pool->size - to_recommit;
843 if (VirtualFree (recommit_addr,
847 to_zero -= to_recommit;
849 if (recommit_addr != VirtualAlloc (recommit_addr,
857 memset (&pool->memory[copy_bytes],
870 if (pool->pos > pool->size)
871 pool->pos = pool->size;
872 pool->end = pool->size;
874 pool->size - new_size);
void MHD_init_mem_pools_(void)
void * MHD_pool_reallocate(struct MemoryPool *pool, void *old, size_t old_size, size_t new_size)
void MHD_pool_destroy(struct MemoryPool *pool)
#define mp_ptr_diff_(p1, p2)
bool MHD_pool_is_resizable_inplace(struct MemoryPool *pool, void *block, size_t block_size)
#define MHD_DEF_PAGE_SIZE_
#define _MHD_FALLBACK_PAGE_SIZE
void MHD_pool_deallocate(struct MemoryPool *pool, void *block, size_t block_size)
void * MHD_pool_try_alloc(struct MemoryPool *pool, size_t size, size_t *required_bytes)
#define ROUND_TO_ALIGN_PLUS_RED_ZONE(n)
#define _MHD_UNPOISON_MEMORY(pointer, size)
size_t MHD_pool_get_free(struct MemoryPool *pool)
void * MHD_pool_reset(struct MemoryPool *pool, void *keep, size_t copy_bytes, size_t new_size)
static size_t MHD_sys_page_size_
struct MemoryPool * MHD_pool_create(size_t max)
void * MHD_pool_allocate(struct MemoryPool *pool, size_t size, bool from_end)
#define mp_ptr_le_(p1, p2)
#define ROUND_TO_ALIGN(n)
#define _MHD_POISON_MEMORY(pointer, size)
#define _MHD_RED_ZONE_SIZE
memory pool; mostly used for efficient (de)allocation for each connection and bounding memory use for...
#define mhd_assert(ignore)
macros for MHD_CHECK_(), always-compiled memory-safety invariants
#define MHD_CHECK_RET_(expr, retval)
limits values definitions