From 84048e02ba6ba3adc76e749eace802f3e2e5865c Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Tue, 27 Feb 2024 12:27:38 +0100 Subject: [PATCH] change(tlsf): Add return value to tlsf_walker This commit adds a return boolean value to the tlsf_walker function allowing users to interrupt the traversal of the pool when returning from any call to the tlsf_walker. --- tlsf.c | 12 ++++++++---- tlsf.h | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/tlsf.c b/tlsf.c index cc3d7af..e61fd67 100644 --- a/tlsf.c +++ b/tlsf.c @@ -659,7 +659,7 @@ typedef struct integrity_t #define tlsf_insist(x) { if (!(x)) { status--; } } -static void integrity_walker(void* ptr, size_t size, int used, void* user) +static bool integrity_walker(void* ptr, size_t size, int used, void* user) { block_header_t* block = block_from_ptr(ptr); integrity_t* integ = tlsf_cast(integrity_t*, user); @@ -691,6 +691,8 @@ static void integrity_walker(void* ptr, size_t size, int used, void* user) integ->prev_status = this_status; integ->status += status; + + return true; } @@ -750,10 +752,11 @@ int tlsf_check(tlsf_t tlsf) #undef tlsf_insist -static void default_walker(void* ptr, size_t size, int used, void* user) +static bool default_walker(void* ptr, size_t size, int used, void* user) { (void)user; printf("\t%p %s size: %x (%p)\n", ptr, used ? "used" : "free", (unsigned int)size, block_from_ptr(ptr)); + return true; } void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void* user) @@ -762,9 +765,10 @@ void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void* user) block_header_t* block = offset_to_block(pool, -(int)block_header_overhead); - while (block && !block_is_last(block)) + bool ret_val = true; + while (block && !block_is_last(block) && ret_val == true) { - pool_walker( + ret_val = pool_walker( block_to_ptr(block), block_size(block), !block_is_free(block), diff --git a/tlsf.h b/tlsf.h index 7f6cc18..ca071b1 100644 --- a/tlsf.h +++ b/tlsf.h @@ -58,7 +58,7 @@ size_t tlsf_alloc_overhead(void); size_t tlsf_fit_size(tlsf_t tlsf, size_t size); /* Debugging. */ -typedef void (*tlsf_walker)(void* ptr, size_t size, int used, void* user); +typedef bool (*tlsf_walker)(void* ptr, size_t size, int used, void* user); void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void* user); /* Returns nonzero if any internal consistency check fails. */ int tlsf_check(tlsf_t tlsf);