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; +}