summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2022-09-10 16:04:33 +0900
committernagachika <nagachika@ruby-lang.org>2022-09-10 16:04:33 +0900
commit4508901fbd8825cc8d9aaf535b5201ade17a8392 (patch)
tree624f4d554bec1bf4ea2b0b613472ba3de79e185a /gc.c
parent163947f4dc031bb5e619ae64ad4a6a02f8885717 (diff)
merge revision(s) 261753249996d46e00c2549fff2527816bf387db: [Backport #18936]
Free cached mark stack chunks when freeing objspace Cached mark stack chunks should also be freed when freeing objspace. --- gc.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index ef9327df1f..7863f9590a 100644
--- a/gc.c
+++ b/gc.c
@@ -1738,6 +1738,7 @@ rb_objspace_alloc(void)
}
static void free_stack_chunks(mark_stack_t *);
+static void mark_stack_free_cache(mark_stack_t *);
static void heap_page_free(rb_objspace_t *objspace, struct heap_page *page);
void
@@ -1777,7 +1778,10 @@ rb_objspace_free(rb_objspace_t *objspace)
}
st_free_table(objspace->id_to_obj_tbl);
st_free_table(objspace->obj_to_id_tbl);
+
free_stack_chunks(&objspace->mark_stack);
+ mark_stack_free_cache(&objspace->mark_stack);
+
free(objspace);
}
@@ -5997,9 +6001,8 @@ pop_mark_stack_chunk(mark_stack_t *stack)
}
static void
-free_stack_chunks(mark_stack_t *stack)
+mark_stack_chunk_list_free(stack_chunk_t *chunk)
{
- stack_chunk_t *chunk = stack->chunk;
stack_chunk_t *next = NULL;
while (chunk != NULL) {
@@ -6010,6 +6013,20 @@ free_stack_chunks(mark_stack_t *stack)
}
static void
+free_stack_chunks(mark_stack_t *stack)
+{
+ mark_stack_chunk_list_free(stack->chunk);
+}
+
+static void
+mark_stack_free_cache(mark_stack_t *stack)
+{
+ mark_stack_chunk_list_free(stack->cache);
+ stack->cache_size = 0;
+ stack->unused_cache_size = 0;
+}
+
+static void
push_mark_stack(mark_stack_t *stack, VALUE data)
{
VALUE obj = data;