diff options
| -rw-r--r-- | gc/default/default.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/gc/default/default.c b/gc/default/default.c index 477898fc29..5f008b44a1 100644 --- a/gc/default/default.c +++ b/gc/default/default.c @@ -685,6 +685,8 @@ typedef struct rb_objspace { unsigned long live_ractor_cache_count; + unsigned int sweeping_heaps; /* bitfield: bit i set while heap i is sweeping */ + int fork_vm_lock_lev; } rb_objspace_t; @@ -1020,12 +1022,7 @@ gc_mode_verify(enum gc_mode mode) static inline bool has_sweeping_pages(rb_objspace_t *objspace) { - for (int i = 0; i < HEAP_COUNT; i++) { - if ((&heaps[i])->sweeping_page) { - return TRUE; - } - } - return FALSE; + return objspace->sweeping_heaps != 0; } static inline size_t @@ -3024,6 +3021,7 @@ gc_abort(void *objspace_ptr) } if (is_lazy_sweeping(objspace)) { + objspace->sweeping_heaps = 0; for (int i = 0; i < HEAP_COUNT; i++) { rb_heap_t *heap = &heaps[i]; @@ -3758,6 +3756,9 @@ static void gc_sweep_start_heap(rb_objspace_t *objspace, rb_heap_t *heap) { heap->sweeping_page = ccan_list_top(&heap->pages, struct heap_page, page_node); + if (heap->sweeping_page) { + objspace->sweeping_heaps |= (1u << (heap - heaps)); + } heap->free_pages = NULL; heap->pooled_pages = NULL; if (!objspace->flags.immediate_sweep) { @@ -3984,6 +3985,7 @@ gc_sweep_step(rb_objspace_t *objspace, rb_heap_t *heap) } while ((sweep_page = heap->sweeping_page)); if (!heap->sweeping_page) { + objspace->sweeping_heaps &= ~(1u << (heap - heaps)); gc_sweep_finish_heap(objspace, heap); if (!has_sweeping_pages(objspace)) { |
