Skip to content

Commit 5c968c5

Browse files
Cache has_sweeping_pages as a bitfield
1 parent aa5f192 commit 5c968c5

1 file changed

Lines changed: 8 additions & 6 deletions

File tree

gc/default/default.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,8 @@ typedef struct rb_objspace {
685685

686686
unsigned long live_ractor_cache_count;
687687

688+
unsigned int sweeping_heaps; /* bitfield: bit i set while heap i is sweeping */
689+
688690
int fork_vm_lock_lev;
689691
} rb_objspace_t;
690692

@@ -1020,12 +1022,7 @@ gc_mode_verify(enum gc_mode mode)
10201022
static inline bool
10211023
has_sweeping_pages(rb_objspace_t *objspace)
10221024
{
1023-
for (int i = 0; i < HEAP_COUNT; i++) {
1024-
if ((&heaps[i])->sweeping_page) {
1025-
return TRUE;
1026-
}
1027-
}
1028-
return FALSE;
1025+
return objspace->sweeping_heaps != 0;
10291026
}
10301027

10311028
static inline size_t
@@ -3024,6 +3021,7 @@ gc_abort(void *objspace_ptr)
30243021
}
30253022

30263023
if (is_lazy_sweeping(objspace)) {
3024+
objspace->sweeping_heaps = 0;
30273025
for (int i = 0; i < HEAP_COUNT; i++) {
30283026
rb_heap_t *heap = &heaps[i];
30293027

@@ -3758,6 +3756,9 @@ static void
37583756
gc_sweep_start_heap(rb_objspace_t *objspace, rb_heap_t *heap)
37593757
{
37603758
heap->sweeping_page = ccan_list_top(&heap->pages, struct heap_page, page_node);
3759+
if (heap->sweeping_page) {
3760+
objspace->sweeping_heaps |= (1u << (heap - heaps));
3761+
}
37613762
heap->free_pages = NULL;
37623763
heap->pooled_pages = NULL;
37633764
if (!objspace->flags.immediate_sweep) {
@@ -3984,6 +3985,7 @@ gc_sweep_step(rb_objspace_t *objspace, rb_heap_t *heap)
39843985
} while ((sweep_page = heap->sweeping_page));
39853986

39863987
if (!heap->sweeping_page) {
3988+
objspace->sweeping_heaps &= ~(1u << (heap - heaps));
39873989
gc_sweep_finish_heap(objspace, heap);
39883990

39893991
if (!has_sweeping_pages(objspace)) {

0 commit comments

Comments
 (0)