summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gc/default/default.c14
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)) {