25#if defined (TLSF_64BIT)
45#
if defined (TLSF_64BIT)
65#define tlsf_cast(t, exp) ((t) (exp))
66#define tlsf_min(a, b) ((a) < (b) ? (a) : (b))
67#define tlsf_max(a, b) ((a) > (b) ? (a) : (b))
72#if !defined (tlsf_assert)
73#define tlsf_assert assert
80#define _tlsf_glue2(x, y) x ## y
81#define _tlsf_glue(x, y) _tlsf_glue2(x, y)
82#define tlsf_static_assert(exp) \
83 typedef char _tlsf_glue(static_assert, __LINE__) [(exp) ? 1 : -1]
180 const size_t oldsize = block->
size;
277 tlsf_assert(0 == (align & (align - 1)) &&
"must align to a power of two");
278 return (
x + (align - 1)) & ~(align - 1);
283 tlsf_assert(0 == (align & (align - 1)) &&
"must align to a power of two");
284 return x - (
x & (align - 1));
291 tlsf_assert(0 == (align & (align - 1)) &&
"must align to a power of two");
354 unsigned int sl_map =
control->sl_bitmap[fl] & (~0 << sl);
358 const unsigned int fl_map =
control->fl_bitmap & (~0 << (fl + 1));
367 sl_map =
control->sl_bitmap[fl];
369 tlsf_assert(sl_map &&
"internal error - second level bitmap is null");
374 return control->blocks[fl][sl];
382 tlsf_assert(prev &&
"prev_free field can not be null");
383 tlsf_assert(next &&
"next_free field can not be null");
388 if (
control->blocks[fl][sl] == block)
390 control->blocks[fl][sl] = next;
393 if (next == &
control->block_null)
395 control->sl_bitmap[fl] &= ~(1 << sl);
400 control->fl_bitmap &= ~(1 << fl);
410 tlsf_assert(current &&
"free list cannot have a null entry");
411 tlsf_assert(block &&
"cannot insert a null entry into the free list");
417 &&
"block not aligned properly");
422 control->blocks[fl][sl] = block;
423 control->fl_bitmap |= (1 << fl);
424 control->sl_bitmap[fl] |= (1 << sl);
458 &&
"remaining block not aligned properly");
486 tlsf_assert(prev &&
"prev physical block can't be null");
499 tlsf_assert(next &&
"next physical block can't be null");
552 return remaining_block;
564 if(block && !block->
size)
619#define tlsf_insist(x) { tlsf_assert(x); if (!(x)) { status--; } }
628 const size_t this_block_size =
block_size(block);
650 const int fl_map =
control->fl_bitmap & (1 <<
i);
651 const int sl_list =
control->sl_bitmap[
i];
652 const int sl_map = sl_list & (1 <<
j);
658 tlsf_insist(!sl_map &&
"second-level map must be null");
668 tlsf_insist(sl_list &&
"no free blocks in second-level map");
671 while (block != &
control->block_null)
681 tlsf_insist(fli ==
i && sli ==
j &&
"block size indexed in wrong list");
682 block = block->next_free;
695 printf(
"\t%p %s size: %x (%p)\n", ptr, used ?
"used" :
"free", (
unsigned int)
size,
block_from_ptr(ptr));
784 printf(
"tlsf_add_pool: Memory must be aligned by %u bytes.\n",
791#if defined (TLSF_64BIT)
792 printf(
"tlsf_add_pool: Memory size must be between 0x%x and 0x%x00 bytes.\n",
796 printf(
"tlsf_add_pool: Memory size must be between %u and %u bytes.\n",
847 rv += (
tlsf_ffs(0) == -1) ? 0 : 0x1;
848 rv += (
tlsf_fls(0) == -1) ? 0 : 0x2;
851 rv += (
tlsf_ffs(0x80000000) == 31) ? 0 : 0x10;
852 rv += (
tlsf_ffs(0x80008000) == 15) ? 0 : 0x20;
853 rv += (
tlsf_fls(0x80000008) == 31) ? 0 : 0x40;
854 rv += (
tlsf_fls(0x7FFFFFFF) == 30) ? 0 : 0x80;
856#if defined (TLSF_64BIT)
864 printf(
"tlsf_create: %x ffs/fls tests failed!\n", rv);
881 printf(
"tlsf_create: Memory must be aligned to %u bytes.\n",
934 const size_t aligned_size = (align <=
ALIGN_SIZE) ? adjust : size_with_gap;
949 if (gap && gap < gap_minimum)
951 const size_t gap_remain = gap_minimum - gap;
952 const size_t offset =
tlsf_max(gap_remain, align);
953 const void* next_aligned =
tlsf_cast(
void*,
956 aligned =
align_ptr(next_aligned, align);
963 tlsf_assert(gap >= gap_minimum &&
"gap size too small");
1005 if (ptr &&
size == 0)
1029 if (adjust > cursize && (!
block_is_free(next) || adjust > combined))
1042 if (adjust > cursize)
pool_t pool
Definition Util.cpp:167
register unsigned j
Definition inflate.c:1576
register unsigned i
Definition inflate.c:1575
unsigned x[BMAX+1]
Definition inflate.c:1586
float control
Definition lilv_test.c:1462
#define offsetof(TYPE, MEMBER)
Definition list.h:42
unsigned int sl_bitmap[FL_INDEX_COUNT]
Definition tlsf.c:160
unsigned int fl_bitmap
Definition tlsf.c:159
block_header_t * blocks[FL_INDEX_COUNT][SL_INDEX_COUNT]
Definition tlsf.c:163
block_header_t block_null
Definition tlsf.c:156
int prev_status
Definition tlsf.c:615
int status
Definition tlsf.c:616
#define tlsf_max(a, b)
Definition tlsf.c:67
void tlsf_free(tlsf_t tlsf, void *ptr)
Definition tlsf.c:971
static int block_is_prev_free(const block_header_t *block)
Definition tlsf.c:204
size_t tlsf_block_size_max()
Definition tlsf.c:754
static void control_construct(control_t *control)
Definition tlsf.c:591
#define tlsf_cast(t, exp)
Definition tlsf.c:65
static size_t block_size(const block_header_t *block)
Definition tlsf.c:173
static void block_set_size(block_header_t *block, size_t size)
Definition tlsf.c:178
int tlsf_check_pool(pool_t pool)
Definition tlsf.c:726
static const size_t block_start_offset
Definition tlsf.c:139
static const size_t block_size_min
Definition tlsf.c:147
ptrdiff_t tlsfptr_t
Definition tlsf.c:167
static void block_insert(control_t *control, block_header_t *block)
Definition tlsf.c:436
static void block_set_used(block_header_t *block)
Definition tlsf.c:199
static void block_remove(control_t *control, block_header_t *block)
Definition tlsf.c:428
#define tlsf_static_assert(exp)
Definition tlsf.c:82
#define tlsf_min(a, b)
Definition tlsf.c:66
#define tlsf_insist(x)
Definition tlsf.c:619
void * tlsf_realloc(tlsf_t tlsf, void *ptr, size_t size)
Definition tlsf.c:999
static void block_trim_free(control_t *control, block_header_t *block, size_t size)
Definition tlsf.c:512
static void block_mark_as_used(block_header_t *block)
Definition tlsf.c:268
static void mapping_insert(size_t size, int *fli, int *sli)
Definition tlsf.c:315
static void block_set_prev_free(block_header_t *block)
Definition tlsf.c:209
size_t tlsf_block_size(void *ptr)
Definition tlsf.c:715
size_t tlsf_pool_overhead()
Definition tlsf.c:764
pool_t tlsf_add_pool(tlsf_t tlsf, void *mem, size_t bytes)
Definition tlsf.c:774
size_t tlsf_size()
Definition tlsf.c:739
static void block_mark_as_free(block_header_t *block)
Definition tlsf.c:260
#define tlsf_assert
Definition tlsf.c:73
size_t tlsf_alloc_overhead()
Definition tlsf.c:769
static int block_is_last(const block_header_t *block)
Definition tlsf.c:184
static void * block_to_ptr(const block_header_t *block)
Definition tlsf.c:225
static block_header_t * block_prev(const block_header_t *block)
Definition tlsf.c:238
static int block_is_free(const block_header_t *block)
Definition tlsf.c:189
static const size_t block_header_free_bit
Definition tlsf.c:129
static size_t adjust_request_size(size_t size, size_t align)
Definition tlsf.c:299
static block_header_t * block_from_ptr(const void *ptr)
Definition tlsf.c:219
void * tlsf_memalign(tlsf_t tlsf, size_t align, size_t size)
Definition tlsf.c:917
static block_header_t * block_locate_free(control_t *control, size_t size)
Definition tlsf.c:555
size_t tlsf_align_size()
Definition tlsf.c:744
tlsf_t tlsf_create_with_pool(void *mem, size_t bytes)
Definition tlsf.c:891
tlsf_t tlsf_create(void *mem)
Definition tlsf.c:870
void * tlsf_malloc(tlsf_t tlsf, size_t size)
Definition tlsf.c:909
static block_header_t * block_next(const block_header_t *block)
Definition tlsf.c:244
static void mapping_search(size_t size, int *fli, int *sli)
Definition tlsf.c:335
static block_header_t * block_link_next(block_header_t *block)
Definition tlsf.c:253
static int block_can_split(block_header_t *block, size_t size)
Definition tlsf.c:443
static void block_set_prev_used(block_header_t *block)
Definition tlsf.c:214
static block_header_t * block_merge_prev(control_t *control, block_header_t *block)
Definition tlsf.c:481
static void integrity_walker(void *ptr, size_t size, int used, void *user)
Definition tlsf.c:621
static block_header_t * search_suitable_block(control_t *control, int *fli, int *sli)
Definition tlsf.c:345
pool_t tlsf_get_pool(tlsf_t tlsf)
Definition tlsf.c:904
static const size_t block_header_overhead
Definition tlsf.c:136
static void default_walker(void *ptr, size_t size, int used, void *user)
Definition tlsf.c:692
tlsf_private
Definition tlsf.c:24
@ FL_INDEX_MAX
Definition tlsf.c:52
@ ALIGN_SIZE_LOG2
Definition tlsf.c:30
@ FL_INDEX_COUNT
Definition tlsf.c:56
@ ALIGN_SIZE
Definition tlsf.c:32
@ SMALL_BLOCK_SIZE
Definition tlsf.c:58
@ SL_INDEX_COUNT
Definition tlsf.c:54
@ FL_INDEX_SHIFT
Definition tlsf.c:55
static size_t align_down(size_t x, size_t align)
Definition tlsf.c:281
static const size_t block_size_max
Definition tlsf.c:149
int tlsf_check(tlsf_t tlsf)
Definition tlsf.c:638
static void insert_free_block(control_t *control, block_header_t *block, int fl, int sl)
Definition tlsf.c:407
static block_header_t * block_merge_next(control_t *control, block_header_t *block)
Definition tlsf.c:496
size_t tlsf_block_size_min()
Definition tlsf.c:749
static void * align_ptr(const void *ptr, size_t align)
Definition tlsf.c:287
static void block_trim_used(control_t *control, block_header_t *block, size_t size)
Definition tlsf.c:525
static void remove_free_block(control_t *control, block_header_t *block, int fl, int sl)
Definition tlsf.c:378
static block_header_t * block_trim_free_leading(control_t *control, block_header_t *block, size_t size)
Definition tlsf.c:539
static size_t align_up(size_t x, size_t align)
Definition tlsf.c:275
static void block_set_free(block_header_t *block)
Definition tlsf.c:194
static void * block_prepare_used(control_t *control, block_header_t *block, size_t size)
Definition tlsf.c:578
static block_header_t * offset_to_block(const void *ptr, size_t size)
Definition tlsf.c:232
void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void *user)
Definition tlsf.c:698
void tlsf_remove_pool(tlsf_t tlsf, pool_t pool)
Definition tlsf.c:823
static block_header_t * block_split(block_header_t *block, size_t size)
Definition tlsf.c:449
static const size_t block_header_prev_free_bit
Definition tlsf.c:130
void tlsf_destroy(tlsf_t tlsf)
Definition tlsf.c:898
tlsf_public
Definition tlsf.c:17
@ SL_INDEX_COUNT_LOG2
Definition tlsf.c:19
static block_header_t * block_absorb(block_header_t *prev, block_header_t *block)
Definition tlsf.c:471
void(* tlsf_walker)(void *ptr, size_t size, int used, void *user)
Definition tlsf.h:58
void * tlsf_t
Definition tlsf.h:27
void * pool_t
Definition tlsf.h:28
tlsf_decl int tlsf_ffs(unsigned int word)
Definition tlsfbits.h:145
#define tlsf_fls_sizet
Definition tlsfbits.h:175
tlsf_decl int tlsf_fls(unsigned int word)
Definition tlsfbits.h:150
uch * p
Definition crypt.c:594
memcpy(hh, h, RAND_HEAD_LEN)
#define void
Definition unzip.h:396