diff options
author | nagachika <nagachika@ruby-lang.org> | 2022-09-10 16:04:33 +0900 |
---|---|---|
committer | nagachika <nagachika@ruby-lang.org> | 2022-09-10 16:04:33 +0900 |
commit | 4508901fbd8825cc8d9aaf535b5201ade17a8392 (patch) | |
tree | 624f4d554bec1bf4ea2b0b613472ba3de79e185a /gc.c | |
parent | 163947f4dc031bb5e619ae64ad4a6a02f8885717 (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.c | 21 |
1 files changed, 19 insertions, 2 deletions
@@ -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; |