From 5d28a43eb8e8343b76591e1625eb12730242cccb Mon Sep 17 00:00:00 2001 From: d-netto Date: Wed, 19 Jul 2023 14:07:44 -0300 Subject: [PATCH 1/2] faster valid object lookup in conservative gc --- src/gc.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/gc.c b/src/gc.c index ec6d6b42cc71e..7b50a6cd10fad 100644 --- a/src/gc.c +++ b/src/gc.c @@ -4070,18 +4070,10 @@ JL_DLLEXPORT jl_value_t *jl_gc_internal_obj_base_ptr(void *p) // before the freelist pointer was either live during the last // sweep or has been allocated since. if (gc_page_data(cell) == gc_page_data(pool->freelist) - && (char *)cell < (char *)pool->freelist) { + && (char *)cell < (char *)pool->freelist) goto valid_object; - } - else { - jl_taggedvalue_t *v = pool->freelist; - while (v != NULL) { - if (v == cell) { - return NULL; - } - v = v->next; - } - } + else + return NULL; // Not a freelist entry, therefore a valid object. valid_object: // We have to treat objects with type `jl_buff_tag` differently, From b4c9e42eccaf94d6eb2b4860397a5ab1ccda5fdb Mon Sep 17 00:00:00 2001 From: d-netto Date: Thu, 20 Jul 2023 17:15:38 -0300 Subject: [PATCH 2/2] suggestion from code review --- src/gc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gc.c b/src/gc.c index 7b50a6cd10fad..54d1bf53dbf75 100644 --- a/src/gc.c +++ b/src/gc.c @@ -4072,8 +4072,9 @@ JL_DLLEXPORT jl_value_t *jl_gc_internal_obj_base_ptr(void *p) if (gc_page_data(cell) == gc_page_data(pool->freelist) && (char *)cell < (char *)pool->freelist) goto valid_object; - else - return NULL; + // already skipped marked or old objects above, so here + // the age bits are 0, thus the object is on the freelist + return NULL; // Not a freelist entry, therefore a valid object. valid_object: // We have to treat objects with type `jl_buff_tag` differently,