KJ Tsanaktsidis
dc9d2455b6
Add a missing asan_unpoisoning_p in gc_set_candidate_object_i
...
It walks the heap, and checks for T_NONE and T_ZOMBIE objects, so it
needs to unpoison these slots before accessing them when ASAN is
enabled.
2024-03-28 09:49:10 +11:00
Peter Zhu
c50b6425b4
Remove st_lookup when updating object ID
2024-03-27 11:41:08 -04:00
Peter Zhu
4566843b3e
Check FL_SEEN_OBJ_ID before looking up in table
...
This is an optimization for compaction so that we only lookup in the
obj_to_id_tbl table only when FL_SEEN_OBJ_ID is set.
2024-03-27 11:41:08 -04:00
Peter Zhu
aa794cc5a2
Turn GC off at boot on Windows
...
This is to stop crashes like:
.\miniruby.exe: [BUG] Segmentation fault
ruby 3.4.0dev (2024-03-26T15:38:26Z pull/10370/merge 040ea2ae2f) [x64-mswin64_140]
-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0003 E:000d00 DUMMY [FINISH]
-- Threading information ---------------------------------------------------
Total ractor count: 1
Ruby thread count for this ractor: 1
-- C level backtrace information -------------------------------------------
C:\Windows\SYSTEM32\ntdll.dll(NtWaitForSingleObject+0x14) [0x00007FFA091AFC74]
C:\Windows\System32\KERNELBASE.dll(WaitForSingleObjectEx+0x93) [0x00007FFA05BB4513]
D:\a\ruby\ruby\build\miniruby.exe(rb_print_backtrace+0x3e) [0x00007FF64E536EFE] d:\a\ruby\ruby\src\vm_dump.c:844
D:\a\ruby\ruby\build\miniruby.exe(rb_vm_bugreport+0x1ae) [0x00007FF64E5370B2] d:\a\ruby\ruby\src\vm_dump.c:1154
D:\a\ruby\ruby\build\miniruby.exe(rb_bug_for_fatal_signal+0x77) [0x00007FF64E3FF357] d:\a\ruby\ruby\src\error.c:1087
D:\a\ruby\ruby\build\miniruby.exe(sigsegv+0x71) [0x00007FF64E4C79E5] d:\a\ruby\ruby\src\signal.c:926
C:\Windows\System32\ucrtbase.dll(seh_filter_exe+0x233) [0x00007FFA0521CE03]
D:\a\ruby\ruby\build\miniruby.exe(`__scrt_common_main_seh'::`1'::filt$0+0x16) [0x00007FF64E594DA0] f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:269
C:\Windows\SYSTEM32\VCRUNTIME140.dll(_C_specific_handler+0x9f) [0x00007FF9E54AF73F]
C:\Windows\SYSTEM32\ntdll.dll(_chkstk+0x11f) [0x00007FFA091B4C2F]
C:\Windows\SYSTEM32\ntdll.dll(RtlWalkFrameChain+0x14bf) [0x00007FFA09114CEF]
C:\Windows\SYSTEM32\ntdll.dll(KiUserExceptionDispatcher+0x2e) [0x00007FFA091B399E]
D:\a\ruby\ruby\build\miniruby.exe(newobj_of+0x6d) [0x00007FF64E418615] d:\a\ruby\ruby\src\gc.c:2949
D:\a\ruby\ruby\build\miniruby.exe(rb_wb_protected_newobj_of+0x32) [0x00007FF64E41C7DA] d:\a\ruby\ruby\src\gc.c:2974
D:\a\ruby\ruby\build\miniruby.exe(str_new0+0x64) [0x00007FF64E4E7F48] d:\a\ruby\ruby\src\string.c:887
D:\a\ruby\ruby\build\miniruby.exe(rb_enc_str_new+0x40) [0x00007FF64E4D89B8] d:\a\ruby\ruby\src\string.c:945
D:\a\ruby\ruby\build\miniruby.exe(iseq_compile_each0+0xdd7) [0x00007FF64E3B4A23] d:\a\ruby\ruby\src\compile.c:10368
D:\a\ruby\ruby\build\miniruby.exe(iseq_compile_each+0x74) [0x00007FF64E3B3C40] d:\a\ruby\ruby\src\compile.c:9971
2024-03-27 09:39:23 -04:00
Peter Zhu
f14e52c8c4
Fix setting GC stress at boot when objspace not available
2024-03-27 09:39:23 -04:00
eileencodes
e16086b7f2
Refactor init_copy gc attributes
...
This PR moves `rb_copy_wb_protected_attribute` and
`rb_gc_copy_finalizer` into a single function called
`rb_gc_copy_attributes` to be called by `init_copy`. This reduces the
surface area of the GC API.
Co-authored-by: Peter Zhu <peter@peterzhu.ca>
2024-03-26 14:29:36 -04:00
Peter Zhu
9cf754b648
Fix --debug=gc_stress flag
...
ruby_env_debug_option gets called after Init_gc_stress, so the
--debug=gc_stress flag never works.
2024-03-25 13:07:39 -04:00
KJ Tsanaktsidis
2535a09e85
Check ASAN fake stacks when marking non-current threads
...
Currently, we check the values on the machine stack & register state to
see if they're actually a pointer to an ASAN fake stack, and mark the
values on the fake stack too if required. However, we are only doing
that for the _current_ thread (the one actually running the GC), not for
any other thread in the program.
Make rb_gc_mark_machine_context (which is called for marking non-current
threads) perform the same ASAN fake stack handling that
mark_current_machine_context performs.
[Bug #20310 ]
2024-03-25 14:57:04 +11:00
KJ Tsanaktsidis
48d3bdddba
Move asan_fake_stack_handle to EC, not thread
...
It's really a property of the EC; each fiber (which has its own EC) also
has its own asan_fake_stack_handle.
[Bug #20310 ]
2024-03-25 14:57:04 +11:00
Peter Zhu
806edd2956
Pass objspace into heap_check_moved_i
2024-03-21 10:43:07 -04:00
Peter Zhu
9a6a6b4ba6
Pass objspace into root_obj_check_moved_i
2024-03-21 10:43:07 -04:00
Peter Zhu
e07441f05f
Make rb_aligned_malloc private
...
It is not used anywhere else.
2024-03-20 10:27:41 -04:00
Peter Zhu
4469729558
Remove rb_raw_obj_info_basic
...
It's not used outside of gc.c.
2024-03-18 10:19:11 -04:00
Peter Zhu
185112f4ff
Remove unused macro TF
2024-03-15 16:03:26 -04:00
Peter Zhu
59785680dd
Remove unused macro GC_NOTIFY in gc.c
2024-03-15 15:44:05 +09:00
Peter Zhu
c2170e5c2b
Fix typo from gloabl_object_list to global_object_list
2024-03-14 13:52:20 -04:00
Peter Zhu
4559a161af
Move gloabl_object_list from objspace to VM
...
This is to be consistent with the mark_object_ary that is in the VM.
2024-03-14 13:29:59 -04:00
Peter Zhu
ff51dc5654
[Feature #20265 ] Remove rb_newobj_of and RB_NEWOBJ_OF
2024-03-14 12:53:04 -04:00
Peter Zhu
8e1831406f
[Feature #20265 ] Remove rb_newobj and RB_NEWOBJ
2024-03-14 12:53:04 -04:00
Peter Zhu
3896f9940e
Make special const and too complex shapes before T_OBJECT shapes
2024-03-13 09:55:52 -04:00
Peter Zhu
6b0434c0f7
Don't create per size pool shapes for non-T_OBJECT
2024-03-13 09:55:52 -04:00
Peter Zhu
6ad347a105
Don't directly read the SIZE_POOL_COUNT in shapes
...
This removes the assumption about SIZE_POOL_COUNT for shapes.
2024-03-13 09:55:52 -04:00
Peter Zhu
e12bc5c572
Remove dead function rb_obj_rgengc_promoted_p
2024-03-11 11:04:20 -04:00
Peter Zhu
9f31577987
Reuse rb_gc_writebarrier_unprotect in rb_copy_wb_protected_attribute
2024-03-11 09:30:15 -04:00
Jean Boussier
d4f3dcf4df
Refactor VM root modules
...
This `st_table` is used to both mark and pin classes
defined from the C API. But `vm->mark_object_ary` already
does both much more efficiently.
Currently a Ruby process starts with 252 rooted classes,
which uses `7224B` in an `st_table` or `2016B` in an `RArray`.
So a baseline of 5kB saved, but since `mark_object_ary` is
preallocated with `1024` slots but only use `405` of them,
it's a net `7kB` save.
`vm->mark_object_ary` is also being refactored.
Prior to this changes, `mark_object_ary` was a regular `RArray`, but
since this allows for references to be moved, it was marked a second
time from `rb_vm_mark()` to pin these objects.
This has the detrimental effect of marking these references on every
minors even though it's a mostly append only list.
But using a custom TypedData we can save from having to mark
all the references on minor GC runs.
Addtionally, immediate values are now ignored and not appended
to `vm->mark_object_ary` as it's just wasted space.
2024-03-06 15:33:43 -05:00
Jean Boussier
b4a69351ec
Move FL_SINGLETON to FL_USER1
...
This frees FL_USER0 on both T_MODULE and T_CLASS.
Note: prior to this, FL_SINGLETON was never set on T_MODULE,
so checking for `FL_SINGLETON` without first checking that
`FL_TYPE` was `T_CLASS` was valid. That's no longer the case.
2024-03-06 13:11:41 -05:00
Peter Zhu
5a3ae06a09
Remove dead function rb_obj_rgengc_writebarrier_protected_p
2024-03-01 15:41:16 -05:00
Peter Zhu
6f31dd495c
Don't check_rvalue_consistency in is_markable_object
...
is_markable_object is called by rb_objspace_markable_object_p, which
may pass a T_NONE object. check_rvalue_consistency will fail if a T_NONE
object is passed in.
2024-03-01 13:38:49 -05:00
Peter Zhu
d3ae5808bb
Remove each_machine_stack_value
...
The function is only used by rb_gc_mark_machine_stack.
2024-02-29 14:26:31 -05:00
Peter Zhu
3d61477900
Remove unused gc_mark_stack_values
2024-02-29 13:23:50 -05:00
Peter Zhu
6665ec26db
Remove check for is_markable_object in gc_mark_stack_values
...
gc_mark_and_pin already checks for is_markable_object.
2024-02-29 13:23:50 -05:00
Peter Zhu
4c0f0b90a4
Assume that FL_FINALIZE is in finalizer_table
...
If FL_FINALIZE is set but not in finalizer_table, then rb_bug.
2024-02-29 11:07:53 -05:00
Peter Zhu
8a918b456c
Add gc_each_object for walking the heap
2024-02-29 10:57:24 -05:00
Peter Zhu
950c60623b
Delete from finalizer_table before running finalizer
...
The finalizer could trigger a GC, which would cause FL_FINALIZE to be
out of sync with the finalizer table.
2024-02-29 09:38:13 -05:00
Peter Zhu
d5bca0668c
Unset FL_FINALIZE before running the finalizer
...
The finalizer could trigger a GC, so FL_FINALIZE could get out of sync
with the finalizer table.
2024-02-29 09:37:38 -05:00
Peter Zhu
4b92b60f0b
Use array initialization rather than for loop
2024-02-28 14:54:21 -05:00
Peter Zhu
5481dbef07
Make rb_define_finalizer_no_check private
2024-02-28 13:45:19 -05:00
Peter Zhu
dcc976add9
Remove unused rb_gc_id2ref_obj_tbl
2024-02-28 12:21:38 -05:00
Peter Zhu
7b69563b36
Add check for finalizer in verify_internal_constency
...
This adds a check in GC.verify_internal_constency that FL_FINALIZE flags
is set if, and only if it is in finalizer_table.
2024-02-28 10:41:11 -05:00
Peter Zhu
48f433fd40
Change T_ZOMBIE flag check from an assertion
...
Assertions are only enable on debug builds, so it will now check for
flags of T_ZOMBIE objects on all builds in GC.verify_internal_consistency.
2024-02-28 10:41:11 -05:00
Peter Zhu
e8e2415bb3
Use RB_SPECIAL_CONST_P instead of rb_special_const_p
...
rb_special_const_p returns a VALUE (Qtrue or Qfalse), so we shouldn't
assume that Qfalse is 0. We should instead use RB_SPECIAL_CONST_P.
2024-02-27 21:11:11 -05:00
Peter Zhu
08731182b8
Change is_garbage_object to return a bool
2024-02-27 14:52:02 -05:00
Peter Zhu
3c44f6da6c
Simplify is_garbage_object
2024-02-27 14:52:02 -05:00
Peter Zhu
1f740cd111
Remove is_swept_object
...
The name is misleading, as it seems like the function checks whether the
object is swept or not. But the function only checks whether the page is
before or after sweeping.
2024-02-27 12:10:48 -05:00
Peter Zhu
2396b7a62f
Change is_live_object to return a bool
2024-02-27 10:03:42 -05:00
Peter Zhu
9ba53cb688
Simplify is_live_object
2024-02-27 10:03:42 -05:00
Peter Zhu
78ae6dbb11
Remove rb_objspace_marked_object_p
...
rb_objspace_marked_object_p is no longer used in the objspace module, so
we can remove it.
2024-02-26 17:05:34 -05:00
Peter Zhu
7538703d1b
Make rb_objspace_data_type_memsize private
...
rb_objspace_data_type_memsize is not used in the objspace module, so we
can make it private.
2024-02-26 17:05:34 -05:00
Peter Zhu
c9b6cd4223
Remove unused rb_objspace_each_objects_without_setup
2024-02-26 14:34:24 -05:00
Peter Zhu
27e3e44390
Fix verify_internal_consistency_i for zombie objects
...
FL_FINALIZE is now kept for zombie objects.
2024-02-26 11:38:44 -05:00