|
GNU libmicrohttpd 1.0.9
|
memory pool More...
#include "memorypool.h"#include <string.h>#include <stdint.h>#include "mhd_assert.h"#include "mhd_check.h"#include "mhd_limits.h"
Go to the source code of this file.
Macros | |
| #define | _MHD_FALLBACK_PAGE_SIZE (4096) |
| #define | MHD_DEF_PAGE_SIZE_ _MHD_FALLBACK_PAGE_SIZE |
| #define | MAP_FAILED ((void*) -1) |
| #define | ALIGN_SIZE (2 * sizeof(void*)) |
| #define | ROUND_TO_ALIGN(n) |
| #define | _MHD_NOSANITIZE_PTRS |
| #define | _MHD_RED_ZONE_SIZE (0) |
| #define | ROUND_TO_ALIGN_PLUS_RED_ZONE(n) |
| #define | _MHD_POISON_MEMORY(pointer, size) |
| #define | _MHD_UNPOISON_MEMORY(pointer, size) |
| #define | mp_ptr_le_(p1, p2) |
| #define | mp_ptr_diff_(p1, p2) |
Functions | |
| void | MHD_init_mem_pools_ (void) |
| struct MemoryPool * | MHD_pool_create (size_t max) |
| void | MHD_pool_destroy (struct MemoryPool *pool) |
| size_t | MHD_pool_get_free (struct MemoryPool *pool) |
| void * | MHD_pool_allocate (struct MemoryPool *pool, size_t size, bool from_end) |
| bool | MHD_pool_is_resizable_inplace (struct MemoryPool *pool, void *block, size_t block_size) |
| void * | MHD_pool_try_alloc (struct MemoryPool *pool, size_t size, size_t *required_bytes) |
| void * | MHD_pool_reallocate (struct MemoryPool *pool, void *old, size_t old_size, size_t new_size) |
| void | MHD_pool_deallocate (struct MemoryPool *pool, void *block, size_t block_size) |
| void * | MHD_pool_reset (struct MemoryPool *pool, void *keep, size_t copy_bytes, size_t new_size) |
Variables | |
| static size_t | MHD_sys_page_size_ |
memory pool
Definition in file memorypool.c.
| #define _MHD_FALLBACK_PAGE_SIZE (4096) |
Fallback value of page size
Definition at line 63 of file memorypool.c.
| #define _MHD_NOSANITIZE_PTRS |
Definition at line 120 of file memorypool.c.
| #define _MHD_POISON_MEMORY | ( | pointer, | |
| size ) |
Definition at line 123 of file memorypool.c.
Referenced by MHD_pool_create(), MHD_pool_deallocate(), MHD_pool_reallocate(), and MHD_pool_reset().
| #define _MHD_RED_ZONE_SIZE (0) |
Definition at line 121 of file memorypool.c.
Referenced by MHD_pool_deallocate(), MHD_pool_get_free(), and MHD_pool_reallocate().
| #define _MHD_UNPOISON_MEMORY | ( | pointer, | |
| size ) |
Definition at line 124 of file memorypool.c.
Referenced by MHD_pool_allocate(), MHD_pool_destroy(), MHD_pool_reallocate(), MHD_pool_reset(), and MHD_pool_try_alloc().
| #define ALIGN_SIZE (2 * sizeof(void*)) |
Align to 2x word size (as GNU libc does).
Definition at line 91 of file memorypool.c.
Referenced by MHD_init_mem_pools_(), and MHD_pool_create().
| #define MAP_FAILED ((void*) -1) |
Definition at line 85 of file memorypool.c.
Referenced by MHD_pool_create().
| #define MHD_DEF_PAGE_SIZE_ _MHD_FALLBACK_PAGE_SIZE |
Definition at line 70 of file memorypool.c.
Referenced by MHD_init_mem_pools_().
| #define mp_ptr_diff_ | ( | p1, | |
| p2 ) |
The difference in bytes between positions of the first and the second pointers
Definition at line 134 of file memorypool.c.
Referenced by MHD_pool_deallocate(), MHD_pool_is_resizable_inplace(), MHD_pool_reallocate(), and MHD_pool_reset().
| #define mp_ptr_le_ | ( | p1, | |
| p2 ) |
Boolean 'true' if the first pointer is less or equal the second pointer
Definition at line 128 of file memorypool.c.
Referenced by MHD_pool_deallocate(), MHD_pool_is_resizable_inplace(), MHD_pool_reallocate(), and MHD_pool_reset().
| #define ROUND_TO_ALIGN | ( | n | ) |
Round up 'n' to a multiple of ALIGN_SIZE.
Definition at line 96 of file memorypool.c.
Referenced by MHD_pool_allocate(), MHD_pool_create(), MHD_pool_deallocate(), MHD_pool_destroy(), MHD_pool_get_free(), MHD_pool_reallocate(), and MHD_pool_try_alloc().
| #define ROUND_TO_ALIGN_PLUS_RED_ZONE | ( | n | ) |
Definition at line 122 of file memorypool.c.
Referenced by MHD_pool_allocate(), MHD_pool_deallocate(), MHD_pool_is_resizable_inplace(), MHD_pool_reallocate(), MHD_pool_reset(), and MHD_pool_try_alloc().
| void MHD_init_mem_pools_ | ( | void | ) |
Initialise values for memory pools
Definition at line 229 of file memorypool.c.
References ALIGN_SIZE, mhd_assert, MHD_DEF_PAGE_SIZE_, and MHD_sys_page_size_.
Referenced by LLVMFuzzerTestOneInput(), and MHD_init().

| void * MHD_pool_allocate | ( | struct MemoryPool * | pool, |
| size_t | size, | ||
| bool | from_end ) |
Allocate size bytes from the pool.
| pool | memory pool to use for the operation |
| size | number of bytes to allocate |
| from_end | allocate from end of pool (set to 'true'); use this for small, persistent allocations that will never be reallocated |
Definition at line 419 of file memorypool.c.
References _MHD_UNPOISON_MEMORY, mhd_assert, NULL, ROUND_TO_ALIGN, and ROUND_TO_ALIGN_PLUS_RED_ZONE.
Referenced by fz_op_alloc(), fz_op_alloc_all(), MHD_connection_alloc_memory_(), and MHD_connection_set_initial_state_().

| struct MemoryPool * MHD_pool_create | ( | size_t | max | ) |
Create a memory pool.
| max | maximum size of the pool |
Definition at line 290 of file memorypool.c.
References _MHD_POISON_MEMORY, ALIGN_SIZE, MAP_FAILED, mhd_assert, MHD_sys_page_size_, NULL, and ROUND_TO_ALIGN.
Referenced by fz_pool_open(), LLVMFuzzerTestOneInput(), and new_connection_process_().

| void MHD_pool_deallocate | ( | struct MemoryPool * | pool, |
| void * | block, | ||
| size_t | block_size ) |
Deallocate a block of memory obtained from the pool.
If the given block is not the most recently (re)allocated block, the memory of the this block allocation may be not released until the pool is destroyed or reset.
| pool | memory pool to use for the operation |
| block | the allocated block, the NULL is tolerated |
| block_size | the size of the allocated block |
Definition at line 678 of file memorypool.c.
References _MHD_POISON_MEMORY, _MHD_RED_ZONE_SIZE, mhd_assert, mp_ptr_diff_, mp_ptr_le_, NULL, ROUND_TO_ALIGN, and ROUND_TO_ALIGN_PLUS_RED_ZONE.
Referenced by connection_shrink_read_buffer(), fz_op_dealloc(), and transmit_error_response_len().

| void MHD_pool_destroy | ( | struct MemoryPool * | pool | ) |
Destroy a memory pool.
| pool | memory pool to destroy |
Definition at line 361 of file memorypool.c.
References _MHD_UNPOISON_MEMORY, mhd_assert, NULL, and ROUND_TO_ALIGN.
Referenced by fz_pool_close(), LLVMFuzzerTestOneInput(), MHD_cleanup_connections(), MHD_connection_close_(), and new_connection_process_().

| size_t MHD_pool_get_free | ( | struct MemoryPool * | pool | ) |
Check how much memory is left in the pool
| pool | pool to check |
Definition at line 394 of file memorypool.c.
References _MHD_RED_ZONE_SIZE, mhd_assert, and ROUND_TO_ALIGN.
Referenced by connection_maximize_write_buffer(), fz_check_invariants(), fz_op_alloc(), fz_op_alloc_all(), fz_op_dealloc(), fz_op_realloc(), fz_op_realloc_new(), fz_op_reset(), fz_op_squeeze(), fz_op_try_alloc(), fz_pool_open(), try_grow_read_buffer(), and try_ready_chunked_body().

| bool MHD_pool_is_resizable_inplace | ( | struct MemoryPool * | pool, |
| void * | block, | ||
| size_t | block_size ) |
Checks whether allocated block is re-sizable in-place. If block is not re-sizable in-place, it still could be shrunk, but freed memory will not be re-used until reset of the pool.
| pool | the memory pool to use |
| block | the pointer to the allocated block to check |
| block_size | the size of the allocated block |
Definition at line 460 of file memorypool.c.
References mhd_assert, mp_ptr_diff_, mp_ptr_le_, NULL, and ROUND_TO_ALIGN_PLUS_RED_ZONE.
Referenced by connection_maximize_write_buffer(), connection_shrink_read_buffer(), fz_op_realloc(), fz_op_resizable(), fz_op_squeeze(), MHD_connection_alloc_memory_(), try_grow_read_buffer(), and try_ready_chunked_body().

| void * MHD_pool_reallocate | ( | struct MemoryPool * | pool, |
| void * | old, | ||
| size_t | old_size, | ||
| size_t | new_size ) |
Reallocate a block of memory obtained from the pool. This is particularly efficient when growing or shrinking the block that was last (re)allocated. If the given block is not the most recently (re)allocated block, the memory of the previous allocation may be not released until the pool is destroyed or reset.
| pool | memory pool to use for the operation |
| old | the existing block |
| old_size | the size of the existing block |
| new_size | the new size of the block |
Definition at line 553 of file memorypool.c.
References _MHD_POISON_MEMORY, _MHD_RED_ZONE_SIZE, _MHD_UNPOISON_MEMORY, mhd_assert, MHD_CHECK_RET_, mp_ptr_diff_, mp_ptr_le_, NULL, ROUND_TO_ALIGN, and ROUND_TO_ALIGN_PLUS_RED_ZONE.
Referenced by connection_maximize_write_buffer(), connection_shrink_read_buffer(), fz_op_realloc(), fz_op_realloc_new(), fz_op_resizable(), fz_op_squeeze(), MHD_connection_alloc_memory_(), MHD_connection_handle_read(), try_grow_read_buffer(), and try_ready_chunked_body().

| void * MHD_pool_reset | ( | struct MemoryPool * | pool, |
| void * | keep, | ||
| size_t | copy_bytes, | ||
| size_t | new_size ) |
Clear all entries from the memory pool except for keep of the given copy_bytes. The pointer returned should be a buffer of new_size where the first copy_bytes are from keep.
| pool | memory pool to use for the operation |
| keep | pointer to the entry to keep (maybe NULL) |
| copy_bytes | how many bytes need to be kept at this address |
| new_size | how many bytes should the allocation we return have? (should be larger or equal to copy_bytes) |
Size of area to zero-out
Definition at line 798 of file memorypool.c.
References _MHD_POISON_MEMORY, _MHD_UNPOISON_MEMORY, mhd_assert, MHD_sys_page_size_, mp_ptr_diff_, mp_ptr_le_, NULL, and ROUND_TO_ALIGN_PLUS_RED_ZONE.
Referenced by connection_reset(), fz_op_reset(), fz_pool_open(), and transmit_error_response_len().

| void * MHD_pool_try_alloc | ( | struct MemoryPool * | pool, |
| size_t | size, | ||
| size_t * | required_bytes ) |
Try to allocate size bytes memory area from the pool.
If allocation fails, required_bytes is updated with size required to be freed in the pool from rellocatable area to allocate requested number of bytes. Allocated memory area is always not rellocatable ("from end").
| pool | memory pool to use for the operation | |
| size | the size of memory in bytes to allocate | |
| [out] | required_bytes | the pointer to variable to be updated with the size of the required additional free memory area, set to 0 if function succeeds. Cannot be NULL. |
Definition at line 501 of file memorypool.c.
References _MHD_UNPOISON_MEMORY, mhd_assert, NULL, ROUND_TO_ALIGN, ROUND_TO_ALIGN_PLUS_RED_ZONE, and SIZE_MAX.
Referenced by fz_op_squeeze(), fz_op_try_alloc(), and MHD_connection_alloc_memory_().

|
static |
Size of memory page
Definition at line 216 of file memorypool.c.
Referenced by MHD_init_mem_pools_(), MHD_pool_create(), and MHD_pool_reset().