diff options
| author | Matt Valentine-House <matt@eightbitraptor.com> | 2026-03-31 13:04:50 +0100 |
|---|---|---|
| committer | Matt Valentine-House <matt@eightbitraptor.com> | 2026-04-09 13:24:09 +0100 |
| commit | 5c968c5078f87e539f72712fecefc61f53a6ff29 (patch) | |
| tree | 505a59c284dd21a3ce74515382480ca0576cbf1b | |
| parent | aa5f1922cdebba1a7d47b33bcfe72bf5e39e9734 (diff) | |
Cache has_sweeping_pages as a bitfield
| -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)) { |
