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