@@ -342,48 +342,43 @@ TLSF_INL void* block_use(tlsf* t, tlsf_block* block, size_t size) {
342
342
return block_payload (block );
343
343
}
344
344
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 ) {
351
346
(void )block ;
352
- TLSF_ASSERT (get_sentinel (t ) == block , "not the sentinel" );
353
347
TLSF_ASSERT (!block_size (block ), "sentinel should be last" );
354
348
TLSF_ASSERT (!block_is_free (block ), "sentinel block should not be free" );
355
349
}
356
350
357
351
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 )
362
355
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 );
364
358
if (!t -> size )
365
359
block -> header = 0 ;
366
- check_sentinel (t , block );
360
+ check_sentinel (block );
367
361
block -> header |= size | BLOCK_BIT_FREE ;
368
362
block = block_merge_prev (t , block );
369
363
block_insert (t , block );
370
364
tlsf_block * sentinel = block_link_next (block );
371
365
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 );
374
368
return true;
375
369
}
376
370
377
371
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 );
384
379
if (t -> size ) {
385
380
block -> header = 0 ;
386
- check_sentinel (t , block );
381
+ check_sentinel (block );
387
382
}
388
383
}
389
384
@@ -403,11 +398,9 @@ TLSF_INL tlsf_block* block_find_free(tlsf* t, size_t size) {
403
398
return block ;
404
399
}
405
400
406
- TLSF_API void tlsf_init (tlsf * t , void * start , tlsf_resize resize ) {
401
+ TLSF_API void tlsf_init (tlsf * t , tlsf_resize resize ) {
407
402
memset (t , 0 , sizeof (tlsf ));
408
- t -> start = start ;
409
403
t -> resize = resize ;
410
- TLSF_ASSERT ((size_t )t -> start % ALIGN_SIZE == 0 , "wrong alignment" );
411
404
}
412
405
413
406
TLSF_API void * tlsf_malloc (tlsf * t , size_t size ) {
0 commit comments