Skip to content

Commit ea58573

Browse files
committed
Don't free in sweep thread for typeddata that aren't concur free safe
1 parent dd89a08 commit ea58573

1 file changed

Lines changed: 4 additions & 9 deletions

File tree

gc/default/default.c

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4412,7 +4412,7 @@ gc_pre_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *p
44124412
bool free_immediately = false;
44134413
void (*dfree)(void *);
44144414
if (RTYPEDDATA_P(vp)) {
4415-
free_immediately = (RTYPEDDATA_TYPE(vp)->flags & RUBY_TYPED_FREE_IMMEDIATELY) != 0;
4415+
free_immediately = (RTYPEDDATA_TYPE(vp)->flags & RUBY_TYPED_FREE_IMMEDIATELY) != 0 && (RTYPEDDATA_TYPE(vp)->flags & RUBY_TYPED_CONCURRENT_FREE_SAFE) != 0;
44164416
dfree = RTYPEDDATA_TYPE(vp)->function.dfree;
44174417
}
44184418
else {
@@ -4428,13 +4428,8 @@ gc_pre_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *p
44284428
}
44294429
}
44304430
else {
4431-
if (rb_gc_obj_has_blacklisted_vm_weak_references(vp)) {
4432-
sweep_in_ruby_thread(objspace, page, vp, false);
4433-
break;
4434-
}
4435-
else {
4436-
goto free;
4437-
}
4431+
sweep_in_ruby_thread(objspace, page, vp, false);
4432+
break;
44384433
}
44394434
break;
44404435
}
@@ -5294,7 +5289,7 @@ gc_sweep_step(rb_objspace_t *objspace, rb_heap_t *heap)
52945289
GC_ASSERT(!sweep_page->deferred_freelist);
52955290
} else {
52965291
sweep_page->free_slots = free_slots;
5297-
sweep_page->final_slots += deferred_free_final_slots;
5292+
// NOTE: sweep_page->final slots have already been updated by make_zombie
52985293
GC_ASSERT(sweep_page->free_slots <= sweep_page->total_slots);
52995294
GC_ASSERT(sweep_page->final_slots <= sweep_page->total_slots);
53005295
sweep_page->heap->total_freed_objects += ctx.freed_slots;

0 commit comments

Comments
 (0)