Skip to content

Commit af67261

Browse files
committed
Tweak computation of new heap area size
It now computes slightly more bytes to account for ATB size using truncated division. In other words, any remaining block space that doesn't fill an ATB byte won't be used. So, we round up our next area size to use an exact number of ATB bytes. Fixes #10451
1 parent 3f95c01 commit af67261

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

py/gc.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,9 @@ void gc_add(void *start, void *end) {
311311
#if MICROPY_GC_SPLIT_HEAP_AUTO
312312
// CIRCUITPY-CHANGE: Added function to compute heap size with selective collect table
313313
static size_t compute_heap_size(size_t total_blocks) {
314-
// Add two blocks to account for allocation alignment.
315-
total_blocks += 2;
314+
// Round up to the nearest multiple of BLOCKS_PER_ATB. Partial ATB blocks aren't supported and
315+
// will result in a heap that is too small.
316+
total_blocks = ((total_blocks + BLOCKS_PER_ATB - 1) / BLOCKS_PER_ATB) * BLOCKS_PER_ATB;
316317
size_t atb_bytes = (total_blocks + BLOCKS_PER_ATB - 1) / BLOCKS_PER_ATB;
317318
size_t ftb_bytes = 0;
318319
size_t ctb_bytes = 0;
@@ -326,12 +327,13 @@ static size_t compute_heap_size(size_t total_blocks) {
326327

327328
// Compute bytes needed to build a heap with total_blocks blocks.
328329
size_t total_heap =
329-
atb_bytes
330+
sizeof(mp_state_mem_area_t)
331+
+ atb_bytes
332+
+ ALLOC_TABLE_GAP_BYTE
330333
+ ftb_bytes
331334
+ ctb_bytes
332335
+ pool_bytes
333-
+ ALLOC_TABLE_GAP_BYTE
334-
+ sizeof(mp_state_mem_area_t);
336+
+ BYTES_PER_BLOCK; // Extra block of bytes to account for end pointer alignment
335337

336338
// Round up size to the nearest multiple of BYTES_PER_BLOCK.
337339
total_heap = (total_heap + BYTES_PER_BLOCK - 1) / BYTES_PER_BLOCK;

0 commit comments

Comments
 (0)