Nobuyoshi Nakada
3d5b6ddff8
Fix compilation on M1 Mac
...
As PAGE_SIZE may not be a preprocessor constant, dispatch at
runtime in that case.
2021-05-05 23:54:36 +09:00
Benoit Daloze
0764d323d8
Fix -Wundef warnings for patterns #if HAVE
...
* See [Feature #17752 ]
* Using this to detect them:
git grep -P 'if\s+HAVE' | grep -Pv 'HAVE_LONG_LONG|/ChangeLog|HAVE_TYPEOF'
2021-05-04 14:56:55 +02:00
Benoit Daloze
68d6bd0873
Fix trivial -Wundef warnings
...
* See [Feature #17752 ]
Co-authored-by: xtkoba (Tee KOBAYASHI) <xtkoba+ruby@gmail.com>
2021-05-04 14:56:55 +02:00
Aaron Patterson
9a6226c61e
Eagerly allocate instance variable tables along with object
...
This allows us to allocate the right size for the object in advance,
meaning that we don't have to pay the cost of ivar table extension
later. The idea is that if an object type ever became "extended" at
some point, then it is very likely it will become extended again. So we
may as well allocate the ivar table up front.
2021-05-03 14:11:48 -07:00
Yusuke Endoh
e48109d86f
Partially revert 2c7d3b3a72
...
to make imemo_ast WB-protected again. Only the test is kept.
2021-04-27 17:05:19 +09:00
Yusuke Endoh
2c7d3b3a72
node.c (rb_ast_new): imemo_ast is WB-unprotected
...
Previously imemo_ast was handled as WB-protected which caused a segfault
of the following code:
# shareable_constant_value: literal
M0 = {}
M1 = {}
...
M100000 = {}
My analysis is here: `shareable_constant_value: literal` creates many
Hash instances during parsing, and add them to node_buffer of imemo_ast.
However, the contents are missed because imemo_ast is incorrectly
WB-protected.
This changeset makes imemo_ast as WB-unprotected.
2021-04-26 22:46:51 +09:00
Ryuta Kamizono
33f2ff3bab
Fix some typos by spell checker
2021-04-26 10:07:41 +09:00
Aaron Patterson
32643cfb1d
check ep during compaction because it can be null
...
This commit adds a check on the ep just like in the mark function. The
env can contain null bytes if allocation tracing is enabled.
We're seeing errors during autocompaction like this:
```
(lldb) bt 40
* thread #1 , name = 'ruby', stop reason = signal SIGABRT
frame #0 : 0x00007f7d64b6018b libc.so.6`raise + 203
frame #1 : 0x00007f7d64b3f859 libc.so.6`abort + 299
frame #2 : 0x000055af5f2fefc9 ruby`die at error.c:764:5
frame #3 : 0x000055af5f2ff1ac ruby`rb_bug_for_fatal_signal(default_sighandler=0x0000000000000000, sig=11, ctx=0x000055af60bc3340, fmt="") at error.c:804:5
frame #4 : 0x000055af5f4bd08f ruby`sigsegv(sig=11, info=0x000055af60bc3470, ctx=0x000055af60bc3340) at signal.c:960:5
frame #5 : 0x00007f7d64ebe3c0 libpthread.so.0`__restore_rt
frame #6 : 0x000055af5f339b0a ruby`gc_ref_update_imemo(objspace=0x000055af60b2b040, obj=0x00007f7d5b513fd0) at gc.c:9046:13
frame #7 : 0x000055af5f339172 ruby`gc_update_object_references(objspace=0x000055af60b2b040, obj=0x00007f7d5b513fd0) at gc.c:9307:9
frame #8 : 0x000055af5f338e79 ruby`gc_ref_update(vstart=0x00007f7d5b510010, vend=0x00007f7d5b513ff8, stride=40, objspace=0x000055af60b2b040, page=0x000055af62577aa0) at gc.c:9452:21
frame #9 : 0x000055af5f337846 ruby`gc_update_references(objspace=0x000055af60b2b040, heap=0x000055af60b2b068) at gc.c:9481:9
frame #10 : 0x000055af5f336569 ruby`gc_compact_finish(objspace=0x000055af60b2b040, heap=0x000055af60b2b068) at gc.c:4840:5
frame #11 : 0x000055af5f335efb ruby`gc_page_sweep(objspace=0x000055af60b2b040, heap=0x000055af60b2b068, sweep_page=0x000055af63a1eb30) at gc.c:5046:13
frame #12 : 0x000055af5f3355c5 ruby`gc_sweep_step(objspace=0x000055af60b2b040, heap=0x000055af60b2b068) at gc.c:5214:19
frame #13 : 0x000055af5f33daf6 ruby`gc_sweep_rest(objspace=0x000055af60b2b040) at gc.c:5271:2
frame #14 : 0x000055af5f33cacd ruby`gc_sweep(objspace=0x000055af60b2b040) at gc.c:5389:2
frame #15 : 0x000055af5f33c21d ruby`gc_marks_rest(objspace=0x000055af60b2b040) at gc.c:7555:5
frame #16 : 0x000055af5f324d41 ruby`gc_rest(objspace=0x000055af60b2b040) at gc.c:8457:13
frame #17 : 0x000055af5f3297d8 ruby`garbage_collect(objspace=0x000055af60b2b040, reason=45568) at gc.c:8318:9
frame #18 : 0x000055af5f344ece ruby`garbage_collect_with_gvl(objspace=0x000055af60b2b040, reason=45568) at gc.c:8632:9
frame #19 : 0x000055af5f344e61 ruby`objspace_malloc_gc_stress(objspace=0x000055af60b2b040) at gc.c:10592:9
frame #20 : 0x000055af5f32ced1 ruby`objspace_xmalloc0(objspace=0x000055af60b2b040, size=64) at gc.c:10767:5
frame #21 : 0x000055af5f32ce11 ruby`ruby_xmalloc0(size=64) at gc.c:10988:12
frame #22 : 0x000055af5f32cdac ruby`ruby_xmalloc_body(size=64) at gc.c:10997:12
frame #23 : 0x000055af5f329415 ruby`ruby_xmalloc(size=64) at gc.c:12942:12
frame #24 : 0x00007f7d611c4fe5 objspace.so`newobj_i(tpval=0x00007f7d5b553770, data=0x000055af639031a0) at object_tracing.c:101:35
frame #25 : 0x000055af5f5b283f ruby`tp_call_trace(tpval=0x00007f7d5b553770, trace_arg=0x00007fff1016d398) at vm_trace.c:1115:2
frame #26 : 0x000055af5f5b50ec ruby`exec_hooks_body(ec=0x000055af60b2b700, list=0x000055af60b2b920, trace_arg=0x00007fff1016d398) at vm_trace.c:304:3
frame #27 : 0x000055af5f5b0f24 ruby`exec_hooks_unprotected(ec=0x000055af60b2b700, list=0x000055af60b2b920, trace_arg=0x00007fff1016d398) at vm_trace.c:333:5
frame #28 : 0x000055af5f5b0da8 ruby`rb_exec_event_hooks(trace_arg=0x00007fff1016d398, hooks=0x000055af60b2b920, pop_p=0) at vm_trace.c:378:13
frame #29 : 0x000055af5f33f8e2 ruby`rb_exec_event_hook_orig(ec=0x000055af60b2b700, hooks=0x000055af60b2b920, flag=1048576, self=0x00007f7d5b5c08c0, id=0, called_id=0, klass=0x0000000000000000, data=0x00007f7d5b513fd0, pop_p=0) at vm_core.h:1989:5
frame #30 : 0x000055af5f334975 ruby`gc_event_hook_body(ec=0x000055af60b2b700, objspace=0x000055af60b2b040, event=1048576, data=0x00007f7d5b513fd0) at gc.c:2083:5
* frame #31 : 0x000055af5f3342df ruby`newobj_slowpath_wb_protected [inlined] newobj_slowpath(klass=0x00007f7d5b9d19c8, flags=0x000000000000001a, objspace=0x000055af60b2b040, cr=0x000055af60b2b910, wb_protected=1) at gc.c:2284:9
frame #32 : 0x000055af5f33410f ruby`newobj_slowpath_wb_protected(klass=0x00007f7d5b9d19c8, flags=0x000000000000001a, objspace=0x000055af60b2b040, cr=0x000055af60b2b910) at gc.c:2299
frame #33 : 0x000055af5f333de9 ruby`newobj_of0(klass=0x00007f7d5b9d19c8, flags=0x000000000000001a, wb_protected=1, cr=0x000055af60b2b910) at gc.c:2338:11
frame #34 : 0x000055af5f3227ae ruby`newobj_of(klass=0x00007f7d5b9d19c8, flags=0x000000000000001a, v1=0x000055af657d88a0, v2=0x000055af657d8890, v3=0x0000000000000000, wb_protected=1) at gc.c:2348:17
frame #35 : 0x000055af5f322c5b ruby`rb_imemo_new(type=imemo_env, v1=0x000055af657d88a0, v2=0x000055af657d8890, v3=0x0000000000000000, v0=0x00007f7d5b9d19c8) at gc.c:2434:12
frame #36 : 0x000055af5f5a3925 ruby`vm_env_new(env_ep=0x000055af657d88a0, env_body=0x000055af657d8890, env_size=4, iseq=0x00007f7d5b9d19c8) at vm_core.h:1363:33
frame #37 : 0x000055af5f5a3808 ruby`vm_make_env_each(ec=0x000055af60b2b700, cfp=0x00007f7d6482fc90) at vm.c:801:11
frame #38 : 0x000055af5f5a368d ruby`vm_make_env_each(ec=0x000055af60b2b700, cfp=0x00007f7d6482fc20) at vm.c:752:13
frame #39 : 0x000055af5f5a368d ruby`vm_make_env_each(ec=0x000055af60b2b700, cfp=0x00007f7d6482fbb0) at vm.c:752:13
(lldb) f 31
frame #31 : 0x000055af5f3342df ruby`newobj_slowpath_wb_protected [inlined] newobj_slowpath(klass=0x00007f7d5b9d19c8, flags=0x000000000000001a, objspace=0x000055af60b2b040, cr=0x000055af60b2b910, wb_protected=1) at gc.c:2284:9
2281 }
2282 GC_ASSERT(obj != 0);
2283 newobj_init(klass, flags, wb_protected, objspace, obj);
-> 2284 gc_event_hook_prep(objspace, RUBY_INTERNAL_EVENT_NEWOBJ, obj, newobj_fill(obj, 0, 0, 0));
2285 }
2286 RB_VM_LOCK_LEAVE_CR_LEV(cr, &lev);
2287
(lldb) p obj
(VALUE) $3 = 0x00007f7d5b513fd0
(lldb) f 6
frame #6 : 0x000055af5f339b0a ruby`gc_ref_update_imemo(objspace=0x000055af60b2b040, obj=0x00007f7d5b513fd0) at gc.c:9046:13
9043 {
9044 rb_env_t *env = (rb_env_t *)obj;
9045 TYPED_UPDATE_IF_MOVED(objspace, rb_iseq_t *, env->iseq);
-> 9046 UPDATE_IF_MOVED(objspace, env->ep[VM_ENV_DATA_INDEX_ENV]);
9047 gc_update_values(objspace, (long)env->env_size, (VALUE *)env->env);
9048 }
9049 break;
(lldb) p obj
(VALUE) $4 = 0x00007f7d5b513fd0
(lldb)
```
2021-04-20 09:54:09 -07:00
Peter Zhu
f1f08f5b69
Remove useless attribute set in init_mark_stack
...
init_mark_stack already clears the mark stack so we do not need to
set the attribute cache_size to zero.
2021-04-15 10:10:23 -04:00
Peter Zhu
4eefb05725
Add RSymbol struct back into RVALUE
...
Commit 0ca714fa1a
removed RSymbol from
RVALUE. This commit adds RSymbol back into RVALUE.
2021-04-13 09:37:50 -04:00
Nobuyoshi Nakada
9513fcd5bc
Suppress a warning
...
Loop variables of `list_for_each` need to be initialized.
2021-04-01 22:54:42 +09:00
Koichi Sasada
1fac99afda
skip marking for uninitialized imemo_env.
...
RUBY_INTERNAL_EVENT_NEWOBJ can expose uninitialized imemo_env
objects and marking it will cause critical error. This patch
skips marking on uninitialized imemo_env.
See: 20210329
T183003Z.fail.html.gz
Shortest repro-code is provided by mame-san.
2021-03-31 19:18:32 +09:00
Peter Zhu
b25361f731
Change heap walking to be safe for object allocation
2021-03-24 14:31:10 -04:00
Aaron Patterson
417c648f08
Free iv index table
...
IV index tables weren't being freed. This program would leak memory:
```ruby
loop do
k = Class.new do
def initialize
@a = 1
@b = 1
@c = 1
@d = 1
@e = 1
@f = 1
@g = 1
end
end
k.new
end
```
This commit fixes the leak.
2021-03-23 13:10:25 -07:00
S.H
71ba09632b
Remove unneeded declarations
2021-03-20 21:00:29 +09:00
Yusuke Endoh
c576e63ee7
gc.c: Use dedicated APIs for conservative GC in Emscripten
...
Emscripten provides "emscripten_scan_stack" to get the beginning and end
pointers of the stack for conservative GC.
Also, "emscripten_scan_registers" allows the GC to mark local variables
in WASM.
2021-03-19 12:35:48 +09:00
Nobuyoshi Nakada
90c12defb3
Constified variables for getenv
2021-03-12 17:13:53 +09:00
Peter Zhu
0bd1bc559f
Don't use mmap on platforms that have large OS page sizes
2021-03-02 10:04:49 -08:00
Peter Zhu
6d834371c0
Fix typo
2021-03-02 10:04:49 -08:00
Peter Zhu
1c0e79e87b
Disable auto compaction on platforms that do not support it
2021-02-25 11:01:50 -08:00
Peter Zhu
1e13548953
Use mmap for allocating heap pages
2021-02-25 11:01:50 -08:00
Aaron Patterson
08d5db4064
Reverting PR #4221
...
It seems this breaks tests on Solaris, so I'm reverting it until we
figure out the right fix.
20210224
T210007Z.fail.html.gz
2021-02-24 13:44:10 -08:00
Peter Zhu
a80366c922
Disable auto compaction on platforms that do not support it
2021-02-24 12:25:30 -08:00
Peter Zhu
785f5eb8f0
Use mmap for allocating heap pages
2021-02-24 12:25:30 -08:00
Koichi Sasada
d260cbe295
show more information about imemo_ment
...
rb_obj_info(obj) (rp(obj)) doesn't show enough information for
non-iseq methods, so this patch shows more.
2021-02-19 16:54:31 +09:00
Koichi Sasada
07ab172ebe
sync check_rvalue_consistency_force()
...
check_rvalue_consistency_force() uses is_pointer_to_heap() and
it should be synchronized with other ractors.
[Bug #17636 ]
2021-02-18 17:04:59 +09:00
Koichi Sasada
100e464bee
clear RVALUE on NEWOBJ event.
...
NEWOBJ event is called without clearing RVALUE values (v1, v2, v3).
This patch clear them before NEWOBJ tracepoint internal hook.
[Bug #17599 ]
2021-02-18 17:04:23 +09:00
Koichi Sasada
969b824a0c
sync GC rest if needed
...
marking requires a barrier (stop all Ractors) and gc_enter() does it.
However, it doesn't check rest event which can start marking.
[Bug #17599 ]
2021-02-18 16:40:59 +09:00
Nobuyoshi Nakada
42a16e5974
Removed no-longer used variable
2021-02-17 20:15:05 +09:00
Peter Zhu
33b8bd97a8
Remove unreachable if statement in gc_page_sweep
...
This if statement is not reachable because `was_compacting` cannot be true when `heap->compact_cursor` is NULL.
2021-02-16 15:07:59 -08:00
Aaron Patterson
75b96c3a05
Don't register non-heap allocated objects
...
`rb_define_const` can add objects as "mark objects". This is to make
code like this work:
33d6e92e0c/ext/etc/etc.c (L1201)
```
rb_define_const(rb_cStruct, "Passwd", sPasswd); /* deprecated name */
```
sPasswd is a heap allocated object that is also a C global, so we can't
move it (it needs to be pinned). However, we have many calls to
`rb_define_const` that just pass in an integer like this:
```
rb_define_const(rb_cDBM, "WRITER", INT2FIX(O_RDWR|RUBY_DBM_RW_BIT));
```
Non heap allocated objects like integers will never move, so there is no
reason to waste time in the GC marking / pinning them.
2021-02-04 09:49:00 -08:00
Matt Valentine-House
e3ef21c307
Use RCLASS_EXT macro instead of directly accessing ptr
2021-02-01 08:42:54 -08:00
Matt Valentine-House
e0f999a2ed
Add RCLASS_SUBCLASSES Macro
2021-02-01 08:42:54 -08:00
Nobuyoshi Nakada
e44870c225
Removed static assertion about size of RVALUE
...
It is unable where unaligned word access is disallowed and
`double` is wider than pointers.
2021-01-31 17:45:35 +09:00
Nobuyoshi Nakada
ae0a179c4b
Narrowed down the condition to pack RValue
...
Because of `double` in `RFloat`, `RValue` would be packed by
`sizeof(double)` by default, on platforms where `double` is wider
than `VALUE`. Size of `RValue` is multiple of 5 now.
2021-01-31 13:20:15 +09:00
Peter Zhu
d2ffd269a7
[ Fixes #17538 ] Fix assertion failure when rincgc is turned off
...
Co-Authored-By: Matt Valentine-House <31869+eightbitraptor@users.noreply.github.com>
2021-01-27 16:17:46 -08:00
Matt Valentine-House
8a3f816675
Re-enable RGENGC_DEBUG for platforms with HAVE_VA_ARGS_MACRO
...
after this commit turned it off globally.
888cf28a7e
Co-authored-by: peterzhu2118 <peter@peterzhu.ca>
2021-01-26 08:18:44 -08:00
Matt Valentine-House
479e4d13cb
Fix RGENGC CHECK MODE >= 4
...
[A previous commit](b59077eecf912a16efefc0256f6e94a000ce3888) removes some macro definitions that are used when RGENGC_CHECK_MODE >=4 because they were using data stored against objspace, which is not ractor safe
This commit reinstates those macro definitions, using the current ractor
Co-authored-by: peterzhu2118 <peter@peterzhu.ca>
2021-01-26 08:17:58 -08:00
Yusuke Endoh
47d6c55755
gc.c: stop overflow check on emscripten build
2021-01-23 10:11:50 +09:00
Koichi Sasada
e586345b77
check is_incremental_marking() again
...
is_incremental_marking() can be changed after checking the
flag without locking, especially on `GC.stress = true`.
2021-01-22 18:15:57 +09:00
Aaron Patterson
32b7dcfb56
Fix more assumptions about the read barrier
...
This is a continuation of 0130e17a41
. We
need to always use the read barrier
2021-01-21 11:19:44 -08:00
Aaron Patterson
0130e17a41
Always enabled read barrier even on GC.compact
...
Some objects can survive the GC before compaction, but get collected in
the second compaction. This means we could have objects reference
T_MOVED during "free" in the second, compacting GC. If that is the
case, we need to invalidate those "moved" addresses. Invalidation is
done via read barrier, so we need to make sure the read barrier is
active even during `GC.compact`.
This also means we don't actually need to do one GC before compaction,
we can just do the compaction and GC in one step.
2021-01-21 09:55:18 -08:00
Aaron Patterson
589a8026f0
fix ASAN errors
2021-01-13 14:53:45 -08:00
David CARLIER
161a20df28
gc fix typo for the timer instruction for ARM64.
2021-01-09 22:37:27 +09:00
Koichi Sasada
442bd0e92c
show more info about imemo_callcache
2021-01-06 14:57:48 +09:00
Marcus Stollsteimer
3108ad7bf3
[DOC] Fix grammar: "is same as" -> "is the same as"
2021-01-05 15:13:53 +01:00
Koichi Sasada
e7fc353f04
enable constant cache on ractors
...
constant cache `IC` is accessed by non-atomic manner and there are
thread-safety issues, so Ruby 3.0 disables to use const cache on
non-main ractors.
This patch enables it by introducing `imemo_constcache` and allocates
it by every re-fill of const cache like `imemo_callcache`.
[Bug #17510 ]
Now `IC` only has one entry `IC::entry` and it points to
`iseq_inline_constant_cache_entry`, managed by T_IMEMO object.
`IC` is atomic data structure so `rb_mjit_before_vm_ic_update()` and
`rb_mjit_after_vm_ic_update()` is not needed.
2021-01-05 02:27:58 +09:00
Takashi Kokubun
ac2df89113
Stop managing valid class serials
...
`mjit_valid_class_serial_p` has no longer been used since b9007b6c54
.
2020-12-29 23:01:11 -08:00
Nobuyoshi Nakada
09aca50fc4
Adjusted styles [ci skip]
2020-12-28 19:52:14 +09:00
Nobuyoshi Nakada
292230cbf9
Fixed leaked global symbols
2020-12-26 09:39:53 +09:00