From 791878ead2e464d6a752a281ce75bec8fcd543a1 Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Mon, 4 Nov 2024 10:02:51 +0100 Subject: [PATCH] feat(tlsf): Add function to find a block from a pointer --- include/tlsf.h | 9 +++++++++ tlsf.c | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/include/tlsf.h b/include/tlsf.h index 94bd67a..aa912d7 100644 --- a/include/tlsf.h +++ b/include/tlsf.h @@ -63,6 +63,15 @@ void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void* user); int tlsf_check(tlsf_t tlsf); int tlsf_check_pool(pool_t pool); +/** + * @brief Find the block containing the pointer passed as parameter + * + * @param pool The pool into which to look for the block + * @param ptr The pointer we want to find the containing block of + * @return void* The pointer to the containing block if found, NULL if not. + */ +void* tlsf_find_containing_block(pool_t pool, void *ptr); + /** * @brief Weak function called on every free block of memory allowing the user to implement * application specific checks on the memory. diff --git a/tlsf.c b/tlsf.c index 23c5aa3..1e8d069 100644 --- a/tlsf.c +++ b/tlsf.c @@ -710,3 +710,23 @@ void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) return p; } + +void* tlsf_find_containing_block(pool_t pool, void *ptr) +{ + block_header_t* block = offset_to_block(pool, -(int)block_header_overhead); + + while (block && !block_is_last(block)) + { + if (!block_is_free(block)) { + void *block_end = block_to_ptr(block) + block_size(block); + if (block_to_ptr(block) <= ptr && block_end > ptr) { + // we found the containing block, return + return block_to_ptr(block); + } + } + + block = block_next(block); + } + + return NULL; +}