Skip to content

Commit e4a2c73

Browse files
committed
simplify resize api
1 parent ae42353 commit e4a2c73

File tree

4 files changed

+36
-40
lines changed

4 files changed

+36
-40
lines changed

bench.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,11 @@ static void run_alloc_benchmark(size_t loops, size_t blk_min, size_t blk_max,
9292
}
9393

9494
static size_t max_size;
95+
static void* mem = 0;
9596

96-
static size_t resize(tlsf* _t, void* _start, size_t old_size, size_t req_size) {
97+
static void* resize(tlsf* _t, size_t req_size) {
9798
(void)_t;
98-
(void)_start;
99-
return req_size > max_size ? old_size : req_size;
99+
return req_size <= max_size ? mem : 0;
100100
}
101101

102102
int main(int argc, char **argv) {
@@ -129,7 +129,8 @@ int main(int argc, char **argv) {
129129
}
130130

131131
max_size = blk_max * num_blks;
132-
tlsf_init(&t, malloc(max_size), resize);
132+
mem = malloc(max_size);
133+
tlsf_init(&t, resize);
133134

134135
void** blk_array = (void**)calloc(num_blks, sizeof(void*));
135136
assert(blk_array);

test.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,27 @@
1616
static size_t PAGE;
1717
static size_t MAX_PAGES;
1818
static size_t curr_pages = 0;
19+
static void* start_addr = 0;
1920

20-
static size_t resize(tlsf* t, void* start, size_t old_size, size_t req_size) {
21+
static void* resize(tlsf* t, size_t req_size) {
2122
(void)t;
2223

24+
if (!start_addr)
25+
start_addr = mmap(0, MAX_PAGES * PAGE,
26+
PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE,
27+
-1, 0);
28+
2329
size_t req_pages = (req_size + PAGE - 1) / PAGE;
2430
if (req_pages > MAX_PAGES)
25-
return old_size;
31+
return 0;
2632

2733
if (req_pages != curr_pages) {
2834
if (req_pages < curr_pages)
29-
madvise((char*)start + PAGE * req_pages, (size_t)(curr_pages - req_pages) * PAGE, MADV_DONTNEED);
35+
madvise((char*)start_addr + PAGE * req_pages, (size_t)(curr_pages - req_pages) * PAGE, MADV_DONTNEED);
3036
curr_pages = req_pages;
3137
}
3238

33-
return req_size;
39+
return start_addr;
3440
}
3541

3642
static void random_test(tlsf* t, size_t spacelen, const size_t cap) {
@@ -153,11 +159,8 @@ int main(void) {
153159
PAGE = (size_t)sysconf(_SC_PAGESIZE);
154160
MAX_PAGES = 20 * TLSF_MAX_SIZE / PAGE;
155161

156-
void* p = mmap(0, MAX_PAGES * PAGE,
157-
PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE,
158-
-1, 0);
159162
tlsf t;
160-
tlsf_init(&t, p, resize);
163+
tlsf_init(&t, resize);
161164

162165
srand((unsigned int)time(0));
163166
large_size_test(&t);

tlsf.c

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -342,48 +342,43 @@ TLSF_INL void* block_use(tlsf* t, tlsf_block* block, size_t size) {
342342
return block_payload(block);
343343
}
344344

345-
TLSF_INL tlsf_block* get_sentinel(tlsf* t) {
346-
return to_block(t->size ? (char*)t->start + t->size - 2*BLOCK_OVERHEAD : (char*)t->start - BLOCK_OVERHEAD);
347-
}
348-
349-
TLSF_INL void check_sentinel(tlsf* t, tlsf_block* block) {
350-
(void)t;
345+
TLSF_INL void check_sentinel(tlsf_block* block) {
351346
(void)block;
352-
TLSF_ASSERT(get_sentinel(t) == block, "not the sentinel");
353347
TLSF_ASSERT(!block_size(block), "sentinel should be last");
354348
TLSF_ASSERT(!block_is_free(block), "sentinel block should not be free");
355349
}
356350

357351
static bool arena_grow(tlsf* t, size_t size) {
358-
size_t req_size = (t->size ? t->size + BLOCK_OVERHEAD : 2*BLOCK_OVERHEAD) + size,
359-
new_size = t->resize(t, t->start, t->size, req_size);
360-
TLSF_ASSERT(new_size == t->size || new_size == req_size, "invalid size after grow");
361-
if (new_size == t->size)
352+
size_t req_size = (t->size ? t->size + BLOCK_OVERHEAD : 2*BLOCK_OVERHEAD) + size;
353+
void* addr = t->resize(t, req_size);
354+
if (!addr)
362355
return false;
363-
tlsf_block* block = get_sentinel(t);
356+
TLSF_ASSERT((size_t)addr % ALIGN_SIZE == 0, "wrong heap alignment address");
357+
tlsf_block* block = to_block(t->size ? (char*)addr + t->size - 2*BLOCK_OVERHEAD : (char*)addr - BLOCK_OVERHEAD);
364358
if (!t->size)
365359
block->header = 0;
366-
check_sentinel(t, block);
360+
check_sentinel(block);
367361
block->header |= size | BLOCK_BIT_FREE;
368362
block = block_merge_prev(t, block);
369363
block_insert(t, block);
370364
tlsf_block* sentinel = block_link_next(block);
371365
sentinel->header = BLOCK_BIT_PREV_FREE;
372-
t->size = new_size;
373-
check_sentinel(t, sentinel);
366+
t->size = req_size;
367+
check_sentinel(sentinel);
374368
return true;
375369
}
376370

377371
static void arena_shrink(tlsf* t, tlsf_block* block) {
378-
check_sentinel(t, block_next(block));
379-
size_t size = block_size(block),
380-
req_size = (char*)block == (char*)t->start - BLOCK_OVERHEAD ? 0 : t->size - size - BLOCK_OVERHEAD;
381-
TLSF_ASSERT(t->size >= size, "invalid heap size before shrink");
382-
t->size = t->resize(t, t->start, t->size, req_size);
383-
TLSF_ASSERT(t->size == req_size, "invalid heap size after shrink");
372+
check_sentinel(block_next(block));
373+
size_t size = block_size(block);
374+
TLSF_ASSERT(t->size + BLOCK_OVERHEAD >= size, "invalid heap size before shrink");
375+
t->size = t->size - size - BLOCK_OVERHEAD;
376+
if (t->size == BLOCK_OVERHEAD)
377+
t->size = 0;
378+
t->resize(t, t->size);
384379
if (t->size) {
385380
block->header = 0;
386-
check_sentinel(t, block);
381+
check_sentinel(block);
387382
}
388383
}
389384

@@ -403,11 +398,9 @@ TLSF_INL tlsf_block* block_find_free(tlsf* t, size_t size) {
403398
return block;
404399
}
405400

406-
TLSF_API void tlsf_init(tlsf* t, void* start, tlsf_resize resize) {
401+
TLSF_API void tlsf_init(tlsf* t, tlsf_resize resize) {
407402
memset(t, 0, sizeof (tlsf));
408-
t->start = start;
409403
t->resize = resize;
410-
TLSF_ASSERT((size_t)t->start % ALIGN_SIZE == 0, "wrong alignment");
411404
}
412405

413406
TLSF_API void* tlsf_malloc(tlsf* t, size_t size) {

tlsf.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,16 @@
1313
#define TLSF_MAX_SIZE (((size_t)1 << (_TLSF_FL_MAX - 1)) - sizeof (size_t))
1414

1515
typedef struct tlsf_ tlsf;
16-
typedef size_t (*tlsf_resize)(tlsf*, void*, size_t, size_t);
16+
typedef void* (*tlsf_resize)(tlsf*, size_t);
1717

1818
struct tlsf_ {
1919
uint32_t fl, sl[_TLSF_FL_COUNT];
2020
struct tlsf_block_* block[_TLSF_FL_COUNT][_TLSF_SL_COUNT];
2121
tlsf_resize resize;
22-
void* start;
2322
size_t size;
2423
};
2524

26-
TLSF_API void tlsf_init(tlsf*, void*, tlsf_resize);
25+
TLSF_API void tlsf_init(tlsf*, tlsf_resize);
2726
TLSF_API void* tlsf_aalloc(tlsf*, size_t, size_t);
2827
TLSF_API void* tlsf_malloc(tlsf*, size_t);
2928
TLSF_API void* tlsf_realloc(tlsf*, void*, size_t);

0 commit comments

Comments
 (0)