| From 76f37069b107ebc4dab50aa2ed553a3f751dc671 Mon Sep 17 00:00:00 2001 |
| From: Xiang Xiao <xiaoxiang@xiaomi.com> |
| Date: Tue, 9 Mar 2021 21:54:16 +0800 |
| Subject: [PATCH 4/8] Add tlsf_extend_pool function |
| |
| could work with sbrk to extend the pool size dynamically |
| |
| Change-Id: I4f2cda419f88a31bc478e74813ebcd0d1275617c |
| --- |
| tlsf.c | 56 ++++++++++++++++++++++++++++++++++++++++++-------------- |
| tlsf.h | 1 + |
| 2 files changed, 43 insertions(+), 14 deletions(-) |
| |
| diff --git a/tlsf.c tlsf/tlsf/tlsf.c |
| index 66daf33..6fd281a 100644 |
| --- a/tlsf.c |
| +++ tlsf/tlsf/tlsf.c |
| @@ -997,17 +997,18 @@ TLSF_API size_t tlsf_alloc_overhead(void) |
| return block_header_overhead;
|
| }
|
|
|
| -TLSF_API pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes)
|
| +TLSF_API pool_t tlsf_extend_pool(tlsf_t tlsf, void* mem, size_t bytes, size_t incr)
|
| {
|
| block_header_t* block;
|
| block_header_t* next;
|
|
|
| + control_t* control = tlsf_cast(control_t*, tlsf);
|
| const size_t pool_overhead = tlsf_pool_overhead();
|
| const size_t pool_bytes = align_down(bytes - pool_overhead, ALIGN_SIZE);
|
|
|
| if (((ptrdiff_t)mem % ALIGN_SIZE) != 0)
|
| {
|
| - tlsf_printf("tlsf_add_pool: Memory must be aligned by %u bytes.\n",
|
| + tlsf_printf("tlsf_extend_pool: Memory must be aligned by %u bytes.\n",
|
| (unsigned int)ALIGN_SIZE);
|
| return 0;
|
| }
|
| @@ -1015,27 +1016,49 @@ TLSF_API pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes) |
| if (pool_bytes < block_size_min || pool_bytes > block_size_max)
|
| {
|
| #if defined (TLSF_64BIT)
|
| - tlsf_printf("tlsf_add_pool: Memory size must be between 0x%x and 0x%x00 bytes.\n",
|
| + tlsf_printf("tlsf_extend_pool: Memory size must be between 0x%x and 0x%x00 bytes.\n",
|
| (unsigned int)(pool_overhead + block_size_min),
|
| (unsigned int)((pool_overhead + block_size_max) / 256));
|
| #else
|
| - tlsf_printf("tlsf_add_pool: Memory size must be between %u and %u bytes.\n",
|
| + tlsf_printf("tlsf_extend_pool: Memory size must be between %u and %u bytes.\n",
|
| (unsigned int)(pool_overhead + block_size_min),
|
| (unsigned int)(pool_overhead + block_size_max));
|
| #endif
|
| return 0;
|
| }
|
|
|
| - /*
|
| - ** Create the main free block. Offset the start of the block slightly
|
| - ** so that the prev_phys_block field falls outside of the pool -
|
| - ** it will never be used.
|
| - */
|
| - block = offset_to_block(mem, -(tlsfptr_t)block_header_overhead);
|
| - block_set_size(block, pool_bytes);
|
| - block_set_free(block);
|
| - block_set_prev_used(block);
|
| - block_insert(tlsf_cast(control_t*, tlsf), block);
|
| + if (incr > 0 && incr < tlsf_block_size_min())
|
| + {
|
| + tlsf_printf("tlsf_extend_pool: Increased size must be at least %u bytes.\n",
|
| + (unsigned int)tlsf_block_size_min());
|
| + return 0;
|
| + }
|
| +
|
| + if (incr == 0) /* Initialize the pool */
|
| + {
|
| + /*
|
| + ** Create the main free block. Offset the start of the block slightly
|
| + ** so that the prev_phys_block field falls outside of the pool -
|
| + ** it will never be used.
|
| + */
|
| + block = offset_to_block(mem, -(tlsfptr_t)block_header_overhead);
|
| + block_set_size(block, pool_bytes);
|
| + block_set_free(block);
|
| + block_set_prev_used(block);
|
| + block_insert(control, block);
|
| + }
|
| + else /* Extend the pool */
|
| + {
|
| + /* Extend the sentinel block */
|
| + const size_t new_bytes = align_down((bytes + incr) -
|
| + (pool_overhead + pool_bytes) - block_header_overhead, ALIGN_SIZE);
|
| +
|
| + block = offset_to_block(mem, pool_bytes);
|
| + block_set_size(block, new_bytes);
|
| + block_set_free(block);
|
| + block = block_merge_prev(control, block);
|
| + block_insert(control, block);
|
| + }
|
|
|
| /* Split the block to create a zero-size sentinel block. */
|
| next = block_link_next(block);
|
| @@ -1046,6 +1069,11 @@ TLSF_API pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes) |
| return mem;
|
| }
|
|
|
| +TLSF_API pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes)
|
| +{
|
| + return tlsf_extend_pool(tlsf, mem, bytes, 0);
|
| +}
|
| +
|
| TLSF_API void tlsf_remove_pool(tlsf_t tlsf, pool_t pool)
|
| {
|
| control_t* control = tlsf_cast(control_t*, tlsf);
|
| diff --git a/tlsf.h tlsf/tlsf/tlsf.h |
| index c2c4161..085e053 100644 |
| --- a/tlsf.h |
| +++ tlsf/tlsf/tlsf.h |
| @@ -63,6 +63,7 @@ TLSF_API pool_t tlsf_get_pool(tlsf_t tlsf); |
|
|
| /* Add/remove memory pools. */
|
| TLSF_API pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes);
|
| +TLSF_API pool_t tlsf_extend_pool(tlsf_t tlsf, void* mem, size_t bytes, size_t incr);
|
| TLSF_API void tlsf_remove_pool(tlsf_t tlsf, pool_t pool);
|
|
|
| /* malloc/memalign/realloc/free replacements. */
|
| -- |
| 2.34.1 |
| |