need more lock in finalize_list()
Some data should be accessed in parallel so they should be protected by the lock.
This commit is contained in:
parent
556a728508
commit
1ba05f5b2d
5
gc.c
5
gc.c
@ -2735,6 +2735,7 @@ make_io_zombie(rb_objspace_t *objspace, VALUE obj)
|
|||||||
static void
|
static void
|
||||||
obj_free_object_id(rb_objspace_t *objspace, VALUE obj)
|
obj_free_object_id(rb_objspace_t *objspace, VALUE obj)
|
||||||
{
|
{
|
||||||
|
ASSERT_vm_locking();
|
||||||
st_data_t o = (st_data_t)obj, id;
|
st_data_t o = (st_data_t)obj, id;
|
||||||
|
|
||||||
GC_ASSERT(FL_TEST(obj, FL_SEEN_OBJ_ID));
|
GC_ASSERT(FL_TEST(obj, FL_SEEN_OBJ_ID));
|
||||||
@ -3672,6 +3673,8 @@ finalize_list(rb_objspace_t *objspace, VALUE zombie)
|
|||||||
|
|
||||||
run_final(objspace, zombie);
|
run_final(objspace, zombie);
|
||||||
|
|
||||||
|
RB_VM_LOCK_ENTER();
|
||||||
|
{
|
||||||
GC_ASSERT(BUILTIN_TYPE(zombie) == T_ZOMBIE);
|
GC_ASSERT(BUILTIN_TYPE(zombie) == T_ZOMBIE);
|
||||||
if (FL_TEST(zombie, FL_SEEN_OBJ_ID)) {
|
if (FL_TEST(zombie, FL_SEEN_OBJ_ID)) {
|
||||||
obj_free_object_id(objspace, zombie);
|
obj_free_object_id(objspace, zombie);
|
||||||
@ -3681,8 +3684,6 @@ finalize_list(rb_objspace_t *objspace, VALUE zombie)
|
|||||||
GC_ASSERT(heap_pages_final_slots > 0);
|
GC_ASSERT(heap_pages_final_slots > 0);
|
||||||
GC_ASSERT(page->final_slots > 0);
|
GC_ASSERT(page->final_slots > 0);
|
||||||
|
|
||||||
RB_VM_LOCK_ENTER();
|
|
||||||
{
|
|
||||||
heap_pages_final_slots--;
|
heap_pages_final_slots--;
|
||||||
page->final_slots--;
|
page->final_slots--;
|
||||||
page->free_slots++;
|
page->free_slots++;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user