diff --git Makefile Makefile new file mode 100644 index 0000000..a51d6c2 --- /dev/null +++ Makefile @@ -0,0 +1,3 @@ +MODULE = tlsf + +include $(RIOTBASE)/Makefile.base diff --git tlsf-malloc.c tlsf-malloc.c new file mode 100644 index 0000000..cb16af8 --- /dev/null +++ tlsf-malloc.c @@ -0,0 +1,44 @@ +#include "irq.h" +#include "tlsf-malloc.h" + +#include + +void *TLSF_MALLOC_NAME(malloc)(size_t bytes) +{ + unsigned old_state = irq_disable(); + void *result = tlsf_malloc(bytes); + irq_restore(old_state); + return result; +} + +void *TLSF_MALLOC_NAME(calloc)(size_t count, size_t bytes) +{ + void *result = tlsf_malloc(count * bytes); + if (result) { + memset(result, 0, count * bytes); + } + return result; +} + +void *TLSF_MALLOC_NAME(memalign)(size_t align, size_t bytes) +{ + unsigned old_state = irq_disable(); + void *result = tlsf_memalign(align, bytes); + irq_restore(old_state); + return result; +} + +void *TLSF_MALLOC_NAME(realloc)(void *ptr, size_t size) +{ + unsigned old_state = irq_disable(); + void *result = tlsf_realloc(ptr, size); + irq_restore(old_state); + return result; +} + +void TLSF_MALLOC_NAME(free)(void *ptr) +{ + unsigned old_state = irq_disable(); + tlsf_free(ptr); + irq_restore(old_state); +} diff --git tlsf-malloc.h tlsf-malloc.h new file mode 100644 index 0000000..2d8bb4d --- /dev/null +++ tlsf-malloc.h @@ -0,0 +1,26 @@ +#ifndef __TLSF_MALLOC_H +#define __TLSF_MALLOC_H + +#include +#include + +#include "tlsf.h" + +#ifndef TLSF_MALLOC_PREFIX +# define TLSF_MALLOC_PREFIX +#endif +#define __TLSF_MALLOC_NAME(A, B) A ## B +#define _TLSF_MALLOC_NAME(A, B) __TLSF_MALLOC_NAME(A, B) +#define TLSF_MALLOC_NAME(NAME) _TLSF_MALLOC_NAME(TLSF_MALLOC_PREFIX, NAME) + +void *TLSF_MALLOC_NAME(malloc)(size_t bytes); + +void *TLSF_MALLOC_NAME(calloc)(size_t count, size_t bytes); + +void *TLSF_MALLOC_NAME(memalign)(size_t align, size_t bytes); + +void *TLSF_MALLOC_NAME(realloc)(void *ptr, size_t size); + +void TLSF_MALLOC_NAME(free)(void *ptr); + +#endif diff --git tlsf.c tlsf.c index 3fb5ebd..99c84b2 100644 --- tlsf.c +++ tlsf.c @@ -25,4 +24,0 @@ enum tlsf_private -#if defined (TLSF_64BIT) - /* All allocation sizes and addresses are aligned to 8 bytes. */ - ALIGN_SIZE_LOG2 = 3, -#else @@ -30,3 +26,2 @@ enum tlsf_private - ALIGN_SIZE_LOG2 = 2, -#endif - ALIGN_SIZE = (1 << ALIGN_SIZE_LOG2), +#define ALIGN_SIZE_LOG2 (2) +#define ALIGN_SIZE (1 << ALIGN_SIZE_LOG2) @@ -45,7 +39,0 @@ enum tlsf_private -#if defined (TLSF_64BIT) - /* - ** TODO: We can increase this to support larger sizes, at the expense - ** of more overhead in the TLSF structure. - */ - FL_INDEX_MAX = 32, -#else @@ -53 +40,0 @@ enum tlsf_private -#endif @@ -73 +60 @@ enum tlsf_private -#define tlsf_assert assert +#define tlsf_assert(X) do { if (0) { (void) (X); } } while (0) @@ -147 +134 @@ static const size_t block_start_offset = -static const size_t block_size_min = +static const size_t block_size_min = @@ -165,0 +153 @@ typedef struct control_t +static control_t *control; @@ -168,0 +157,4 @@ typedef ptrdiff_t tlsfptr_t; +#ifdef DEVELHELP +void *default_pool; +#endif + @@ -345 +337 @@ static void mapping_search(size_t size, int* fli, int* sli) -static block_header_t* search_suitable_block(control_t* control, int* fli, int* sli) +static block_header_t* search_suitable_block(int* fli, int* sli) @@ -354 +346 @@ static block_header_t* search_suitable_block(control_t* control, int* fli, int* - unsigned int sl_map = control->sl_bitmap[fl] & (~0 << sl); + unsigned int sl_map = control->sl_bitmap[fl] & (((unsigned int)~0) << sl); @@ -358 +350 @@ static block_header_t* search_suitable_block(control_t* control, int* fli, int* - const unsigned int fl_map = control->fl_bitmap & (~0 << (fl + 1)); + const unsigned int fl_map = control->fl_bitmap & (((unsigned int)~0) << (fl + 1)); @@ -378 +370 @@ static block_header_t* search_suitable_block(control_t* control, int* fli, int* -static void remove_free_block(control_t* control, block_header_t* block, int fl, int sl) +static void remove_free_block(block_header_t* block, int fl, int sl) @@ -407 +399 @@ static void remove_free_block(control_t* control, block_header_t* block, int fl, -static void insert_free_block(control_t* control, block_header_t* block, int fl, int sl) +static void insert_free_block(block_header_t* block, int fl, int sl) @@ -428 +420 @@ static void insert_free_block(control_t* control, block_header_t* block, int fl, -static void block_remove(control_t* control, block_header_t* block) +static void block_remove(block_header_t* block) @@ -432 +424 @@ static void block_remove(control_t* control, block_header_t* block) - remove_free_block(control, block, fl, sl); + remove_free_block(block, fl, sl); @@ -436 +428 @@ static void block_remove(control_t* control, block_header_t* block) -static void block_insert(control_t* control, block_header_t* block) +static void block_insert(block_header_t* block) @@ -440 +432 @@ static void block_insert(control_t* control, block_header_t* block) - insert_free_block(control, block, fl, sl); + insert_free_block(block, fl, sl); @@ -481 +473 @@ static block_header_t* block_absorb(block_header_t* prev, block_header_t* block) -static block_header_t* block_merge_prev(control_t* control, block_header_t* block) +static block_header_t* block_merge_prev(block_header_t* block) @@ -488 +480 @@ static block_header_t* block_merge_prev(control_t* control, block_header_t* bloc - block_remove(control, prev); + block_remove(prev); @@ -496 +488 @@ static block_header_t* block_merge_prev(control_t* control, block_header_t* bloc -static block_header_t* block_merge_next(control_t* control, block_header_t* block) +static block_header_t* block_merge_next(block_header_t* block) @@ -504 +496 @@ static block_header_t* block_merge_next(control_t* control, block_header_t* bloc - block_remove(control, next); + block_remove(next); @@ -512 +504 @@ static block_header_t* block_merge_next(control_t* control, block_header_t* bloc -static void block_trim_free(control_t* control, block_header_t* block, size_t size) +static void block_trim_free(block_header_t* block, size_t size) @@ -520 +512 @@ static void block_trim_free(control_t* control, block_header_t* block, size_t si - block_insert(control, remaining_block); + block_insert(remaining_block); @@ -525 +517 @@ static void block_trim_free(control_t* control, block_header_t* block, size_t si -static void block_trim_used(control_t* control, block_header_t* block, size_t size) +static void block_trim_used(block_header_t* block, size_t size) @@ -534,2 +526,2 @@ static void block_trim_used(control_t* control, block_header_t* block, size_t si - remaining_block = block_merge_next(control, remaining_block); - block_insert(control, remaining_block); + remaining_block = block_merge_next(remaining_block); + block_insert(remaining_block); @@ -539 +531 @@ static void block_trim_used(control_t* control, block_header_t* block, size_t si -static block_header_t* block_trim_free_leading(control_t* control, block_header_t* block, size_t size) +static block_header_t* block_trim_free_leading(block_header_t* block, size_t size) @@ -549 +541 @@ static block_header_t* block_trim_free_leading(control_t* control, block_header_ - block_insert(control, block); + block_insert(block); @@ -555 +547 @@ static block_header_t* block_trim_free_leading(control_t* control, block_header_ -static block_header_t* block_locate_free(control_t* control, size_t size) +static block_header_t* block_locate_free(size_t size) @@ -563 +555 @@ static block_header_t* block_locate_free(control_t* control, size_t size) - block = search_suitable_block(control, &fl, &sl); + block = search_suitable_block(&fl, &sl); @@ -569 +561 @@ static block_header_t* block_locate_free(control_t* control, size_t size) - remove_free_block(control, block, fl, sl); + remove_free_block(block, fl, sl); @@ -575 +567 @@ static block_header_t* block_locate_free(control_t* control, size_t size) -static void* block_prepare_used(control_t* control, block_header_t* block, size_t size) +static void* block_prepare_used(block_header_t* block, size_t size) @@ -580 +572 @@ static void* block_prepare_used(control_t* control, block_header_t* block, size_ - block_trim_free(control, block, size); + block_trim_free(block, size); @@ -588 +580 @@ static void* block_prepare_used(control_t* control, block_header_t* block, size_ -static void control_construct(control_t* control) +static void control_construct(void) @@ -605,0 +598 @@ static void control_construct(control_t* control) +#ifdef DEVELHELP @@ -608,0 +602 @@ static void control_construct(control_t* control) +typedef void (*tlsf_walker)(void* ptr, size_t size, int used); @@ -610 +604 @@ static void control_construct(control_t* control) -typedef struct integrity_t +static void default_walker(void* ptr, size_t size, int used) @@ -612,20 +606,2 @@ typedef struct integrity_t - int prev_status; - int status; -} integrity_t; - -#define tlsf_insist(x) { tlsf_assert(x); if (!(x)) { status--; } } - -static void 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); - const int this_prev_status = block_is_prev_free(block) ? 1 : 0; - const int this_status = block_is_free(block) ? 1 : 0; - const size_t this_block_size = block_size(block); - - int status = 0; - tlsf_insist(integ->prev_status == this_prev_status && "prev status incorrect"); - tlsf_insist(size == this_block_size && "block size incorrect"); - - integ->prev_status = this_status; - integ->status += status; + printf("\tMemory @ %p is %s, size: %u (block: %p)\n", ptr, used ? "used" : "free", + (unsigned int)size, (void*) block_from_ptr(ptr)); @@ -634 +610 @@ static void integrity_walker(void* ptr, size_t size, int used, void* user) -int tlsf_check(tlsf_t tlsf) +void tlsf_walk_pool(void *pool) @@ -636,7 +612 @@ int tlsf_check(tlsf_t tlsf) - int i, j; - - control_t* control = tlsf_cast(control_t*, tlsf); - int status = 0; - - /* Check that the free lists and bitmaps are accurate. */ - for (i = 0; i < FL_INDEX_COUNT; ++i) + if (!pool) @@ -644,37 +614 @@ int tlsf_check(tlsf_t tlsf) - for (j = 0; j < SL_INDEX_COUNT; ++j) - { - const int fl_map = control->fl_bitmap & (1 << i); - const int sl_list = control->sl_bitmap[i]; - const int sl_map = sl_list & (1 << j); - const block_header_t* block = control->blocks[i][j]; - - /* Check that first- and second-level lists agree. */ - if (!fl_map) - { - tlsf_insist(!sl_map && "second-level map must be null"); - } - - if (!sl_map) - { - tlsf_insist(block == &control->block_null && "block list must be null"); - continue; - } - - /* Check that there is at least one free block. */ - tlsf_insist(sl_list && "no free blocks in second-level map"); - tlsf_insist(block != &control->block_null && "block should not be null"); - - while (block != &control->block_null) - { - int fli, sli; - tlsf_insist(block_is_free(block) && "block should be free"); - tlsf_insist(!block_is_prev_free(block) && "blocks should have coalesced"); - tlsf_insist(!block_is_free(block_next(block)) && "blocks should have coalesced"); - tlsf_insist(block_is_prev_free(block_next(block)) && "block should be free"); - tlsf_insist(block_size(block) >= block_size_min && "block not minimum size"); - - mapping_insert(block_size(block), &fli, &sli); - tlsf_insist(fli == i && sli == j && "block size indexed in wrong list"); - block = block->next_free; - } - } + pool = default_pool; @@ -682,15 +615,0 @@ int tlsf_check(tlsf_t tlsf) - - return status; -} - -#undef tlsf_insist - -static void 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)); -} - -void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void* user) -{ - tlsf_walker pool_walker = walker ? walker : default_walker; @@ -702 +621 @@ void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void* user) - pool_walker( + default_walker( @@ -705,2 +624 @@ void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void* user) - !block_is_free(block), - user); + !block_is_free(block)); @@ -720,0 +639 @@ size_t tlsf_block_size(void* ptr) +#endif @@ -722,49 +641 @@ size_t tlsf_block_size(void* ptr) -int tlsf_check_pool(pool_t pool) -{ - /* Check that the blocks are physically correct. */ - integrity_t integ = { 0, 0 }; - tlsf_walk_pool(pool, integrity_walker, &integ); - - return integ.status; -} - -/* -** Size of the TLSF structures in a given memory block passed to -** tlsf_create, equal to the size of a control_t -*/ -size_t tlsf_size() -{ - return sizeof(control_t); -} - -size_t tlsf_align_size() -{ - return ALIGN_SIZE; -} - -size_t tlsf_block_size_min() -{ - return block_size_min; -} - -size_t tlsf_block_size_max() -{ - return block_size_max; -} - -/* -** Overhead of the TLSF structures in a given memory block passes to -** tlsf_add_pool, equal to the overhead of a free block and the -** sentinel block. -*/ -size_t tlsf_pool_overhead() -{ - return 2 * block_header_overhead; -} - -size_t tlsf_alloc_overhead() -{ - return block_header_overhead; -} - -pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes) +int tlsf_add_pool(void* mem, size_t bytes) @@ -775 +646 @@ pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes) - const size_t pool_overhead = tlsf_pool_overhead(); + const size_t pool_overhead = 2 * block_header_overhead; @@ -787,6 +658 @@ pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes) -#if defined (TLSF_64BIT) - printf("tlsf_add_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 - printf("tlsf_add_pool: Memory size must be between %u and %u bytes.\n", + printf("tlsf_add_pool: Memory size must be between %u and %u bytes.\n", @@ -795 +660,0 @@ pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes) -#endif @@ -808 +673 @@ pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes) - block_insert(tlsf_cast(control_t*, tlsf), block); + block_insert(block); @@ -816,13 +681,3 @@ pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes) - return mem; -} - -void tlsf_remove_pool(tlsf_t tlsf, pool_t pool) -{ - control_t* control = tlsf_cast(control_t*, tlsf); - block_header_t* block = offset_to_block(pool, -(int)block_header_overhead); - - int fl = 0, sl = 0; - - tlsf_assert(block_is_free(block) && "block should be free"); - tlsf_assert(!block_is_free(block_next(block)) && "next block should not be free"); - tlsf_assert(block_size(block_next(block)) == 0 && "next block size should be zero"); +#ifdef DEVELHELP + default_pool = mem; +#endif @@ -830,2 +685 @@ void tlsf_remove_pool(tlsf_t tlsf, pool_t pool) - mapping_insert(block_size(block), &fl, &sl); - remove_free_block(control, block, fl, sl); + return 1; @@ -838,2 +692 @@ void tlsf_remove_pool(tlsf_t tlsf, pool_t pool) -#if _DEBUG -int test_ffs_fls() +void tlsf_create(void* mem) @@ -841,34 +693,0 @@ int test_ffs_fls() - /* Verify ffs/fls work properly. */ - int rv = 0; - rv += (tlsf_ffs(0) == -1) ? 0 : 0x1; - rv += (tlsf_fls(0) == -1) ? 0 : 0x2; - rv += (tlsf_ffs(1) == 0) ? 0 : 0x4; - rv += (tlsf_fls(1) == 0) ? 0 : 0x8; - rv += (tlsf_ffs(0x80000000) == 31) ? 0 : 0x10; - rv += (tlsf_ffs(0x80008000) == 15) ? 0 : 0x20; - rv += (tlsf_fls(0x80000008) == 31) ? 0 : 0x40; - rv += (tlsf_fls(0x7FFFFFFF) == 30) ? 0 : 0x80; - -#if defined (TLSF_64BIT) - rv += (tlsf_fls_sizet(0x80000000) == 31) ? 0 : 0x100; - rv += (tlsf_fls_sizet(0x100000000) == 32) ? 0 : 0x200; - rv += (tlsf_fls_sizet(0xffffffffffffffff) == 63) ? 0 : 0x400; -#endif - - if (rv) - { - printf("tlsf_create: %x ffs/fls tests failed!\n", rv); - } - return rv; -} -#endif - -tlsf_t tlsf_create(void* mem) -{ -#if _DEBUG - if (test_ffs_fls()) - { - return 0; - } -#endif - @@ -879 +698 @@ tlsf_t tlsf_create(void* mem) - return 0; + return; @@ -882 +701 @@ tlsf_t tlsf_create(void* mem) - control_construct(tlsf_cast(control_t*, mem)); + control = tlsf_cast(control_t*, mem); @@ -884,14 +703 @@ tlsf_t tlsf_create(void* mem) - return tlsf_cast(tlsf_t, mem); -} - -tlsf_t tlsf_create_with_pool(void* mem, size_t bytes) -{ - tlsf_t tlsf = tlsf_create(mem); - tlsf_add_pool(tlsf, (char*)mem + tlsf_size(), bytes - tlsf_size()); - return tlsf; -} - -void tlsf_destroy(tlsf_t tlsf) -{ - /* Nothing to do. */ - (void)tlsf; + control_construct(); @@ -900 +706 @@ void tlsf_destroy(tlsf_t tlsf) -pool_t tlsf_get_pool(tlsf_t tlsf) +void tlsf_create_with_pool(void* mem, size_t bytes) @@ -902 +708,2 @@ pool_t tlsf_get_pool(tlsf_t tlsf) - return tlsf_cast(pool_t, (char*)tlsf + tlsf_size()); + tlsf_create(mem); + tlsf_add_pool((char*)mem + sizeof(control_t), bytes - sizeof(control_t)); @@ -905 +712 @@ pool_t tlsf_get_pool(tlsf_t tlsf) -void* tlsf_malloc(tlsf_t tlsf, size_t size) +void* tlsf_malloc(size_t size) @@ -907 +713,0 @@ void* tlsf_malloc(tlsf_t tlsf, size_t size) - control_t* control = tlsf_cast(control_t*, tlsf); @@ -909,2 +715,2 @@ void* tlsf_malloc(tlsf_t tlsf, size_t size) - block_header_t* block = block_locate_free(control, adjust); - return block_prepare_used(control, block, adjust); + block_header_t* block = block_locate_free(adjust); + return block_prepare_used(block, adjust); @@ -913 +719 @@ void* tlsf_malloc(tlsf_t tlsf, size_t size) -void* tlsf_memalign(tlsf_t tlsf, size_t align, size_t size) +void* tlsf_memalign(size_t align, size_t size) @@ -915 +720,0 @@ void* tlsf_memalign(tlsf_t tlsf, size_t align, size_t size) - control_t* control = tlsf_cast(control_t*, tlsf); @@ -932 +737 @@ void* tlsf_memalign(tlsf_t tlsf, size_t align, size_t size) - block_header_t* block = block_locate_free(control, aligned_size); + block_header_t* block = block_locate_free(aligned_size); @@ -960 +765 @@ void* tlsf_memalign(tlsf_t tlsf, size_t align, size_t size) - block = block_trim_free_leading(control, block, gap); + block = block_trim_free_leading(block, gap); @@ -964 +769 @@ void* tlsf_memalign(tlsf_t tlsf, size_t align, size_t size) - return block_prepare_used(control, block, adjust); + return block_prepare_used(block, adjust); @@ -967 +772 @@ void* tlsf_memalign(tlsf_t tlsf, size_t align, size_t size) -void tlsf_free(tlsf_t tlsf, void* ptr) +void tlsf_free(void* ptr) @@ -972 +776,0 @@ void tlsf_free(tlsf_t tlsf, void* ptr) - control_t* control = tlsf_cast(control_t*, tlsf); @@ -976,3 +780,3 @@ void tlsf_free(tlsf_t tlsf, void* ptr) - block = block_merge_prev(control, block); - block = block_merge_next(control, block); - block_insert(control, block); + block = block_merge_prev(block); + block = block_merge_next(block); + block_insert(block); @@ -995 +799 @@ void tlsf_free(tlsf_t tlsf, void* ptr) -void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) +void* tlsf_realloc(void* ptr, size_t size) @@ -997 +800,0 @@ void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) - control_t* control = tlsf_cast(control_t*, tlsf); @@ -1003 +806 @@ void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) - tlsf_free(tlsf, ptr); + tlsf_free(ptr); @@ -1008 +811 @@ void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) - p = tlsf_malloc(tlsf, size); + p = tlsf_malloc(size); @@ -1027 +830 @@ void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) - p = tlsf_malloc(tlsf, size); + p = tlsf_malloc(size); @@ -1032 +835 @@ void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) - tlsf_free(tlsf, ptr); + tlsf_free(ptr); @@ -1040 +843 @@ void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) - block_merge_next(control, block); + block_merge_next(block); @@ -1045 +848 @@ void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) - block_trim_used(control, block, adjust); + block_trim_used(block, adjust); diff --git tlsf.h tlsf.h index 72496a1..6c945e5 100644 --- tlsf.h +++ tlsf.h @@ -25,5 +24,0 @@ extern "C" { -/* tlsf_t: a TLSF structure. Can contain 1 to N pools. */ -/* pool_t: a block of memory that TLSF can manage. */ -typedef void* tlsf_t; -typedef void* pool_t; - @@ -31,4 +26,2 @@ typedef void* pool_t; -tlsf_t tlsf_create(void* mem); -tlsf_t tlsf_create_with_pool(void* mem, size_t bytes); -void tlsf_destroy(tlsf_t tlsf); -pool_t tlsf_get_pool(tlsf_t tlsf); +void tlsf_create(void* mem); +void tlsf_create_with_pool(void* mem, size_t bytes); @@ -37,2 +30 @@ pool_t tlsf_get_pool(tlsf_t tlsf); -pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes); -void tlsf_remove_pool(tlsf_t tlsf, pool_t pool); +int tlsf_add_pool(void* mem, size_t bytes); @@ -41,7 +33,4 @@ void tlsf_remove_pool(tlsf_t tlsf, pool_t pool); -void* tlsf_malloc(tlsf_t tlsf, size_t bytes); -void* tlsf_memalign(tlsf_t tlsf, size_t align, size_t bytes); -void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size); -void tlsf_free(tlsf_t tlsf, void* ptr); - -/* Returns internal block size, not original request size */ -size_t tlsf_block_size(void* ptr); +void* tlsf_malloc(size_t bytes); +void* tlsf_memalign(size_t align, size_t bytes); +void* tlsf_realloc(void* ptr, size_t size); +void tlsf_free(void* ptr); @@ -49,14 +38,3 @@ size_t tlsf_block_size(void* ptr); -/* Overheads/limits of internal structures. */ -size_t tlsf_size(); -size_t tlsf_align_size(); -size_t tlsf_block_size_min(); -size_t tlsf_block_size_max(); -size_t tlsf_pool_overhead(); -size_t tlsf_alloc_overhead(); - -/* Debugging. */ -typedef void (*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); -int tlsf_check_pool(pool_t pool); +#ifdef DEVELHELP +void tlsf_walk_pool(void *pool); +#endif