diff --git a/pkg/tlsf/.gitignore b/pkg/tlsf/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..58a9b88df597ce4e37b5d48a1d5ac9d15a7817ec --- /dev/null +++ b/pkg/tlsf/.gitignore @@ -0,0 +1 @@ +/tlsf-*.zip diff --git a/pkg/tlsf/Makefile b/pkg/tlsf/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..7ea14d4eaca37a7f9a4033ba0955f4d7f4b6b4f6 --- /dev/null +++ b/pkg/tlsf/Makefile @@ -0,0 +1,41 @@ +PKG_NAME = tlsf +PKG_VERSION = 3.0 +PKG_FILE = tlsf-$(PKG_VERSION).zip +PKG_URL = http://tlsf.baisoku.org/$(PKG_FILE) + +ifeq (, $(UNZIP)) + ifeq (0, $(shell which unzip 2>&1 > /dev/null ; echo $$?)) + UNZIP := $(shell which unzip) + else + ifeq (0, $(shell which 7z 2>&1 > /dev/null ; echo $$?)) + UNZIP := $(shell which 7z) x + else + $(error "Neither unzip nor 7z is installed.") + endif + endif +endif + +.PHONY: all clean patch reset + +all: $(BINDIR)$(PKG_NAME).a + +$(BINDIR)$(PKG_NAME).a: $(BINDIR)$(PKG_NAME)-src/Makefile + $(AD)make -C $(<D) + +$(BINDIR)$(PKG_NAME)-src/Makefile: $(CURDIR)/$(PKG_FILE) $(CURDIR)/patch.txt + @rm -rf $(@D) + @mkdir -p $(@D) + $(AD)cd $(@D) && $(UNZIP) $(CURDIR)/$(PKG_FILE) + $(AD)cd $(@D) && patch --binary -p0 -N -i $(CURDIR)/patch.txt + +$(CURDIR)/$(PKG_FILE): + $(AD)wget -nv -c -O $@ $(PKG_URL) + +clean:: + rm -rf $(BINDIR)$(PKG_NAME)-src/ + +distclean:: clean + rm -f $(CURDIR)/$(PKG_FILE) + +Makefile.include: + @true diff --git a/pkg/tlsf/Makefile.include b/pkg/tlsf/Makefile.include new file mode 100644 index 0000000000000000000000000000000000000000..9313f40066dbf6f338f799f9427f5a6ea2969a41 --- /dev/null +++ b/pkg/tlsf/Makefile.include @@ -0,0 +1 @@ +INCLUDES += -I$(BINDIR)tlsf-src diff --git a/pkg/tlsf/patch.txt b/pkg/tlsf/patch.txt new file mode 100644 index 0000000000000000000000000000000000000000..ad87cc36a38461ec39dacd46f5359a42769f9bfc --- /dev/null +++ b/pkg/tlsf/patch.txt @@ -0,0 +1,636 @@ +diff -NdaU0 tlsf.c tlsf.c +--- tlsf.c ++++ tlsf.c +@@ -25,4 +24,0 @@ +-#if defined (TLSF_64BIT) +- /* All allocation sizes and addresses are aligned to 8 bytes. */ +- ALIGN_SIZE_LOG2 = 3, +-#else +@@ -30,3 +26,2 @@ +- 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 @@ +-#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 @@ +-#endif +@@ -73 +60 @@ +-#define tlsf_assert assert ++#define tlsf_assert(X) do { if (0) { (void) (X); } } while (0) +@@ -165,0 +153,14 @@ ++static control_t control __attribute__ ((aligned(ALIGN_SIZE))) = { ++ .block_null = { ++ .next_free = &control.block_null, ++ .prev_free = &control.block_null, ++ }, ++ .fl_bitmap = 0, ++ .sl_bitmap = {0}, ++ .blocks = { ++ [0 ... FL_INDEX_COUNT-1] = { ++ [0 ... SL_INDEX_COUNT-1] = &control.block_null ++ } ++ } ++}; ++ +@@ -345 +346 @@ +-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 +355 @@ +- unsigned int sl_map = control->sl_bitmap[fl] & (~0 << sl); ++ unsigned int sl_map = control.sl_bitmap[fl] & (~0 << sl); +@@ -358 +359 @@ +- const unsigned int fl_map = control->fl_bitmap & (~0 << (fl + 1)); ++ const unsigned int fl_map = control.fl_bitmap & (~0 << (fl + 1)); +@@ -367 +368 @@ +- sl_map = control->sl_bitmap[fl]; ++ sl_map = control.sl_bitmap[fl]; +@@ -374 +375 @@ +- return control->blocks[fl][sl]; ++ return control.blocks[fl][sl]; +@@ -378 +379 @@ +-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) +@@ -388 +389 @@ +- if (control->blocks[fl][sl] == block) ++ if (control.blocks[fl][sl] == block) +@@ -390 +391 @@ +- control->blocks[fl][sl] = next; ++ control.blocks[fl][sl] = next; +@@ -393 +394 @@ +- if (next == &control->block_null) ++ if (next == &control.block_null) +@@ -395 +396 @@ +- control->sl_bitmap[fl] &= ~(1 << sl); ++ control.sl_bitmap[fl] &= ~(1 << sl); +@@ -398 +399 @@ +- if (!control->sl_bitmap[fl]) ++ if (!control.sl_bitmap[fl]) +@@ -400 +401 @@ +- control->fl_bitmap &= ~(1 << fl); ++ control.fl_bitmap &= ~(1 << fl); +@@ -407 +408 @@ +-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) +@@ -409 +410 @@ +- block_header_t* current = control->blocks[fl][sl]; ++ block_header_t* current = control.blocks[fl][sl]; +@@ -413 +414 @@ +- block->prev_free = &control->block_null; ++ block->prev_free = &control.block_null; +@@ -422,3 +423,3 @@ +- control->blocks[fl][sl] = block; +- control->fl_bitmap |= (1 << fl); +- control->sl_bitmap[fl] |= (1 << sl); ++ control.blocks[fl][sl] = block; ++ control.fl_bitmap |= (1 << fl); ++ control.sl_bitmap[fl] |= (1 << sl); +@@ -428 +429 @@ +-static void block_remove(control_t* control, block_header_t* block) ++static void block_remove(block_header_t* block) +@@ -432 +433 @@ +- remove_free_block(control, block, fl, sl); ++ remove_free_block(block, fl, sl); +@@ -436 +437 @@ +-static void block_insert(control_t* control, block_header_t* block) ++static void block_insert(block_header_t* block) +@@ -440 +441 @@ +- insert_free_block(control, block, fl, sl); ++ insert_free_block(block, fl, sl); +@@ -481 +482 @@ +-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 +489 @@ +- block_remove(control, prev); ++ block_remove(prev); +@@ -496 +497 @@ +-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 +505 @@ +- block_remove(control, next); ++ block_remove(next); +@@ -512 +513 @@ +-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 +521 @@ +- block_insert(control, remaining_block); ++ block_insert(remaining_block); +@@ -525 +526 @@ +-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 +535,2 @@ +- 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 +540 @@ +-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 +550 @@ +- block_insert(control, block); ++ block_insert(block); +@@ -555 +556 @@ +-static block_header_t* block_locate_free(control_t* control, size_t size) ++static block_header_t* block_locate_free(size_t size) +@@ -563 +564 @@ +- block = search_suitable_block(control, &fl, &sl); ++ block = search_suitable_block(&fl, &sl); +@@ -569 +570 @@ +- remove_free_block(control, block, fl, sl); ++ remove_free_block(block, fl, sl); +@@ -575 +576 @@ +-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 +581 @@ +- block_trim_free(control, block, size); ++ block_trim_free(block, size); +@@ -587,184 +588 @@ +-/* Clear structure and point all empty lists at the null block. */ +-static void control_construct(control_t* control) +-{ +- int i, j; +- +- control->block_null.next_free = &control->block_null; +- control->block_null.prev_free = &control->block_null; +- +- control->fl_bitmap = 0; +- for (i = 0; i < FL_INDEX_COUNT; ++i) +- { +- control->sl_bitmap[i] = 0; +- for (j = 0; j < SL_INDEX_COUNT; ++j) +- { +- control->blocks[i][j] = &control->block_null; +- } +- } +-} +- +-/* +-** Debugging utilities. +-*/ +- +-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; +-} +- +-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) +- { +- 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; +- } +- } +- } +- +- 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; +- block_header_t* block = +- offset_to_block(pool, -(int)block_header_overhead); +- +- while (block && !block_is_last(block)) +- { +- pool_walker( +- block_to_ptr(block), +- block_size(block), +- !block_is_free(block), +- user); +- block = block_next(block); +- } +-} +- +-size_t tlsf_block_size(void* ptr) +-{ +- size_t size = 0; +- if (ptr) +- { +- const block_header_t* block = block_from_ptr(ptr); +- size = block_size(block); +- } +- return size; +-} +- +-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 +593 @@ +- const size_t pool_overhead = tlsf_pool_overhead(); ++ const size_t pool_overhead = 2 * block_header_overhead; +@@ -787,5 +604,0 @@ +-#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 +@@ -795 +607,0 @@ +-#endif +@@ -808 +620 @@ +- block_insert(tlsf_cast(control_t*, tlsf), block); ++ block_insert(block); +@@ -816,16 +628 @@ +- 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"); +- +- mapping_insert(block_size(block), &fl, &sl); +- remove_free_block(control, block, fl, sl); ++ return 1; +@@ -838,68 +635 @@ +-#if _DEBUG +-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 +- +- if (((tlsfptr_t)mem % ALIGN_SIZE) != 0) +- { +- printf("tlsf_create: Memory must be aligned to %u bytes.\n", +- (unsigned int)ALIGN_SIZE); +- return 0; +- } +- +- control_construct(tlsf_cast(control_t*, 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; +-} +- +-pool_t tlsf_get_pool(tlsf_t tlsf) +-{ +- return tlsf_cast(pool_t, (char*)tlsf + tlsf_size()); +-} +- +-void* tlsf_malloc(tlsf_t tlsf, size_t size) ++void* tlsf_malloc(size_t size) +@@ -907 +636,0 @@ +- control_t* control = tlsf_cast(control_t*, tlsf); +@@ -909,2 +638,2 @@ +- 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 +642 @@ +-void* tlsf_memalign(tlsf_t tlsf, size_t align, size_t size) ++void* tlsf_memalign(size_t align, size_t size) +@@ -915 +643,0 @@ +- control_t* control = tlsf_cast(control_t*, tlsf); +@@ -932 +660 @@ +- block_header_t* block = block_locate_free(control, aligned_size); ++ block_header_t* block = block_locate_free(aligned_size); +@@ -960 +688 @@ +- block = block_trim_free_leading(control, block, gap); ++ block = block_trim_free_leading(block, gap); +@@ -964 +692 @@ +- return block_prepare_used(control, block, adjust); ++ return block_prepare_used(block, adjust); +@@ -967 +695 @@ +-void tlsf_free(tlsf_t tlsf, void* ptr) ++void tlsf_free(void* ptr) +@@ -972 +699,0 @@ +- control_t* control = tlsf_cast(control_t*, tlsf); +@@ -976,3 +703,3 @@ +- 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 +722 @@ +-void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) ++void* tlsf_realloc(void* ptr, size_t size) +@@ -997 +723,0 @@ +- control_t* control = tlsf_cast(control_t*, tlsf); +@@ -1003 +729 @@ +- tlsf_free(tlsf, ptr); ++ tlsf_free(ptr); +@@ -1008 +734 @@ +- p = tlsf_malloc(tlsf, size); ++ p = tlsf_malloc(size); +@@ -1027 +753 @@ +- p = tlsf_malloc(tlsf, size); ++ p = tlsf_malloc(size); +@@ -1032 +758 @@ +- tlsf_free(tlsf, ptr); ++ tlsf_free(ptr); +@@ -1040 +766 @@ +- block_merge_next(control, block); ++ block_merge_next(block); +@@ -1045 +771 @@ +- block_trim_used(control, block, adjust); ++ block_trim_used(block, adjust); +diff -NdaU0 tlsf.h tlsf.h +--- tlsf.h ++++ tlsf.h +@@ -21,15 +20,0 @@ +-#if defined(__cplusplus) +-extern "C" { +-#endif +- +-/* 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; +- +-/* Create/destroy a memory pool. */ +-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); +- +@@ -37,2 +22 @@ +-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,26 +25,4 @@ +-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); +- +-/* 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); +- +-#if defined(__cplusplus) +-}; +-#endif ++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); +diff -NdaU0 Makefile Makefile +--- Makefile ++++ Makefile +@@ -0,0 +1,3 @@ ++MODULE = tlsf ++ ++include $(RIOTBASE)/Makefile.base +diff -NdaU0 tlsf-malloc.c tlsf-malloc.c +--- tlsf-malloc.c ++++ tlsf-malloc.c +@@ -0,0 +1,44 @@ ++#include "irq.h" ++#include "tlsf-malloc.h" ++ ++#include <string.h> ++ ++void *TLSF_MALLOC_NAME(malloc)(size_t bytes) ++{ ++ unsigned old_state = disableIRQ(); ++ void *result = tlsf_malloc(bytes); ++ restoreIRQ(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 = disableIRQ(); ++ void *result = tlsf_memalign(align, bytes); ++ restoreIRQ(old_state); ++ return result; ++} ++ ++void *TLSF_MALLOC_NAME(realloc)(void *ptr, size_t size) ++{ ++ unsigned old_state = disableIRQ(); ++ void *result = tlsf_realloc(ptr, size); ++ restoreIRQ(old_state); ++ return result; ++} ++ ++void TLSF_MALLOC_NAME(free)(void *ptr) ++{ ++ unsigned old_state = disableIRQ(); ++ tlsf_free(ptr); ++ restoreIRQ(old_state); ++} +diff -NdaU0 tlsf-malloc.h tlsf-malloc.h +--- tlsf-malloc.h ++++ tlsf-malloc.h +@@ -0,0 +1,26 @@ ++#ifndef __TLSF_MALLOC_H ++#define __TLSF_MALLOC_H ++ ++#include <stdbool.h> ++#include <stddef.h> ++ ++#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