mirror of
https://github.com/micropython/micropython.git
synced 2026-01-06 20:20:14 +01:00
py/gc: Be sure to count last allocated block at heap end in stats.
Previously, if there was chain of allocated blocks ending with the last block of heap, it wasn't included in number of 1/2-block or max block size stats.
This commit is contained in:
31
py/gc.c
31
py/gc.c
@@ -327,18 +327,9 @@ void gc_info(gc_info_t *info) {
|
||||
info->num_1block = 0;
|
||||
info->num_2block = 0;
|
||||
info->max_block = 0;
|
||||
for (size_t block = 0, len = 0; block < MP_STATE_MEM(gc_alloc_table_byte_len) * BLOCKS_PER_ATB; block++) {
|
||||
bool finish = false;
|
||||
for (size_t block = 0, len = 0; !finish;) {
|
||||
size_t kind = ATB_GET_KIND(block);
|
||||
if (kind == AT_FREE || kind == AT_HEAD) {
|
||||
if (len == 1) {
|
||||
info->num_1block += 1;
|
||||
} else if (len == 2) {
|
||||
info->num_2block += 1;
|
||||
}
|
||||
if (len > info->max_block) {
|
||||
info->max_block = len;
|
||||
}
|
||||
}
|
||||
switch (kind) {
|
||||
case AT_FREE:
|
||||
info->free += 1;
|
||||
@@ -359,6 +350,24 @@ void gc_info(gc_info_t *info) {
|
||||
// shouldn't happen
|
||||
break;
|
||||
}
|
||||
|
||||
block++;
|
||||
finish = (block == MP_STATE_MEM(gc_alloc_table_byte_len) * BLOCKS_PER_ATB);
|
||||
// Get next block type if possible
|
||||
if (!finish) {
|
||||
kind = ATB_GET_KIND(block);
|
||||
}
|
||||
|
||||
if (finish || kind == AT_FREE || kind == AT_HEAD) {
|
||||
if (len == 1) {
|
||||
info->num_1block += 1;
|
||||
} else if (len == 2) {
|
||||
info->num_2block += 1;
|
||||
}
|
||||
if (len > info->max_block) {
|
||||
info->max_block = len;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
info->used *= BYTES_PER_BLOCK;
|
||||
|
||||
Reference in New Issue
Block a user