| Age | Commit message (Collapse) | Author |
|
https://github.com/sampersand/blog/blob/master/the%20-s%20flag.md#the-segfault
|
|
We are inserting directly into the st_table, so we need to issue a write
barrier from the hash.
|
|
It is not enabled by default currently.
Notes:
Merged: https://github.com/ruby/ruby/pull/12461
|
|
After a ractor is started (multi-ractor mode), any calls to
require_internal will hang the process due to deadlock. For example,
loading a new encoding will deadlock after a ractor starts.
Fixes [Bug #19562]
Notes:
Merged: https://github.com/ruby/ruby/pull/7656
|
|
These objects didn't retain their frozen status after the move
Bug [#19408]
Notes:
Merged: https://github.com/ruby/ruby/pull/9996
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/12425
Merged-By: nobu <nobu@ruby-lang.org>
|
|
(forgot to amend...)
Notes:
Merged: https://github.com/ruby/ruby/pull/12331
|
|
to initialize ractor local storage in thread-safety.
[Feature #20875]
Notes:
Merged: https://github.com/ruby/ruby/pull/12321
|
|
So that it doesn't get included in the generated binaries for builds
that don't support loading shared GC modules
Co-Authored-By: Peter Zhu <peter@peterzhu.ca>
Notes:
Merged: https://github.com/ruby/ruby/pull/12149
|
|
to avoid TLS issue with N:M threads.
Notes:
Merged: https://github.com/ruby/ruby/pull/11142
|
|
`Ractor.receive` and `Ractor.yield` should stop when the
incoming/outgoing port is closed.
Notes:
Merged: https://github.com/ruby/ruby/pull/11142
|
|
Many libraries should be loaded on the main ractor because of
setting constants with unshareable objects and so on.
This patch allows to call `requore` on non-main Ractors by
asking the main ractor to call `require` on it. The calling ractor
waits for the result of `require` from the main ractor.
If the `require` call failed with some reasons, an exception
objects will be deliverred from the main ractor to the calling ractor
if it is copy-able.
Same on `require_relative` and `require` by `autoload`.
Now `Ractor.new{pp obj}` works well (the first call of `pp` requires
`pp` library implicitly).
[Feature #20627]
Notes:
Merged: https://github.com/ruby/ruby/pull/11142
|
|
RUBY_DEBUG enables ractor assertions, which sets up some space at the
end of each RVALUE to store the associated ractor ID. We need to make
sure the function that does this is visible to shared GC libraries.
Notes:
Merged: https://github.com/ruby/ruby/pull/11945
|
|
Since we only mark the values, we can use rb_id_table_foreach_values to
avoid the overhead of converting the key to an ID.
Notes:
Merged: https://github.com/ruby/ruby/pull/11918
|
|
STACK OF 1 INSTANCE OF 'ROOT LEAK: <calloc in rb_ractor_main_alloc>':
6 dyld 0x1840e20e0 start + 2360
5 miniruby 0x1006796c8 main + 88 main.c:62
4 miniruby 0x10072f4a4 ruby_init + 16 eval.c:99
3 miniruby 0x10072f328 ruby_setup + 104 eval.c:81
2 miniruby 0x1008d08c0 Init_BareVM + 508 vm.c:4276
1 miniruby 0x1007f8944 rb_ractor_main_alloc + 76 ractor.c:2034
0 libsystem_malloc.dylib 0x1842a4cac _malloc_zone_calloc_instrumented_or_legacy + 128
====
1 (96 bytes) ROOT LEAK: <calloc in rb_ractor_main_alloc 0x1347075d0> [96]
Notes:
Merged: https://github.com/ruby/ruby/pull/11175
|
|
This commit splits gc.c into two files:
- gc.c now only contains code not specific to Ruby GC. This includes
code to mark objects (which the GC implementation may choose not to
use) and wrappers for internal APIs that the implementation may need
to use (e.g. locking the VM).
- gc_impl.c now contains the implementation of Ruby's GC. This includes
marking, sweeping, compaction, and statistics. Most importantly,
gc_impl.c only uses public APIs in Ruby and a limited set of functions
exposed in gc.c. This allows us to build gc_impl.c independently of
Ruby and plug Ruby's GC into itself.
|
|
They were initially made frozen to avoid false positives for cases such
as:
str = str.dup if str.frozen?
But this may cause bugs and is generally confusing for users.
[Feature #20205]
Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
|
|
Fixes [Bug #20168]
|
|
Many places call ruby_mimmalloc then MEMZERO. This can be reduced by
using ruby_mimcalloc instead.
|
|
[Feature #20205]
As a path toward enabling frozen string literals by default in the future,
this commit introduce "chilled strings". From a user perspective chilled
strings pretend to be frozen, but on the first attempt to mutate them,
they lose their frozen status and emit a warning rather than to raise a
`FrozenError`.
Implementation wise, `rb_compile_option_struct.frozen_string_literal` is
no longer a boolean but a tri-state of `enabled/disabled/unset`.
When code is compiled with frozen string literals neither explictly enabled
or disabled, string literals are compiled with a new `putchilledstring`
instruction. This instruction is identical to `putstring` except it marks
the String with the `STR_CHILLED (FL_USER3)` and `FL_FREEZE` flags.
Chilled strings have the `FL_FREEZE` flag as to minimize the need to check
for chilled strings across the codebase, and to improve compatibility with
C extensions.
Notes:
- `String#freeze`: clears the chilled flag.
- `String#-@`: acts as if the string was mutable.
- `String#+@`: acts as if the string was mutable.
- `String#clone`: copies the chilled flag.
Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
|
|
|
|
|
|
Currently, any postponed job triggered from a non-ruby thread gets sent
to the main thread, but if the main thread is sleeping it won't be
checking ints. Instead, we should try and interrupt running_ec if that's
possible, and only fall back to the main thread if it's not.
[Bug #20197]
|
|
Fixes [Bug #19409]
|
|
rb_vm_main_ractor_ec was introduced to allow rb_postponed_job_* to work
when fired on non-Ruby threads, which have no EC set, and that is its
only use.
When RUBY_MN_THREADS=1 is set ractor->threads.running_ec is NULL when
the shared thread is sleeping. This instead grabs the EC directly from
the main thread which seems to always be set.
Fixes [Bug #20016]
Co-authored-by: Dustin Brown <dbrown9@gmail.com>
|
|
fix [Bug #19917]
|
|
`Ractor::Selector` is not approved by Matz so remove it from
Ruby-level.
The implementation is used by `Ractor.select` so most of implementation
was remaind and calling `rb_init_ractor_selector()`, `Ractor::Selector`
will be defined. I will provide `ractor-selector` gem to try it.
|
|
|
|
|
|
On 32-bit systems, we must store the shape ID in the gen_ivtbl to not
lose the shape. If we directly store the ST table into the generic
ivar table, then we lose the shape. This makes it impossible to
determine the shape of the object and whether it is too complex or not.
|
|
This patch introduce M:N thread scheduler for Ractor system.
In general, M:N thread scheduler employs N native threads (OS threads)
to manage M user-level threads (Ruby threads in this case).
On the Ruby interpreter, 1 native thread is provided for 1 Ractor
and all Ruby threads are managed by the native thread.
From Ruby 1.9, the interpreter uses 1:1 thread scheduler which means
1 Ruby thread has 1 native thread. M:N scheduler change this strategy.
Because of compatibility issue (and stableness issue of the implementation)
main Ractor doesn't use M:N scheduler on default. On the other words,
threads on the main Ractor will be managed with 1:1 thread scheduler.
There are additional settings by environment variables:
`RUBY_MN_THREADS=1` enables M:N thread scheduler on the main ractor.
Note that non-main ractors use the M:N scheduler without this
configuration. With this configuration, single ractor applications
run threads on M:1 thread scheduler (green threads, user-level threads).
`RUBY_MAX_CPU=n` specifies maximum number of native threads for
M:N scheduler (default: 8).
This patch will be reverted soon if non-easy issues are found.
[Bug #19842]
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/7942
|
|
function
Notes:
Merged: https://github.com/ruby/ruby/pull/8048
|
|
|
|
SunC warns use of `NULL`, pointer to data as function pointers.
Notes:
Merged: https://github.com/ruby/ruby/pull/7972
Merged-By: nobu <nobu@ruby-lang.org>
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/7742
|
|
to leave the trace.
Notes:
Merged: https://github.com/ruby/ruby/pull/7763
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/7616
|
|
so that no need to lock the ractor.
Notes:
Merged: https://github.com/ruby/ruby/pull/7616
|
|
`rb_current_ractor()` expects it has valid `ec` and `r`.
`rb_current_ractor_raw()` with a parameter `false` allows to return
NULL if `ec` is not available.
Notes:
Merged: https://github.com/ruby/ruby/pull/7617
|
|
st tables will maintain insertion order so we can marshal dump / load
objects with instance variables in the same order they were set on that
particular instance
[ruby-core:112926] [Bug #19535]
Co-Authored-By: Jemma Issroff <jemmaissroff@gmail.com>
Notes:
Merged: https://github.com/ruby/ruby/pull/7560
|
|
A variable modified in `EXEC_TAG` block should be `volatile`.
```
ractor.c: In function 'ractor_try_yield':
ractor.c:1251:97: warning: argument 'obj' might be clobbered by 'longjmp' or 'vfork' [-Wclobbered]
1251 | ractor_try_yield(rb_execution_context_t *ec, rb_ractor_t *cr, struct rb_ractor_queue *ts, VALUE obj, VALUE move, bool exc, bool is_will)
| ~~~~~~^~~
```
Notes:
Merged: https://github.com/ruby/ruby/pull/7568
|
|
`*pcnt++` just dereferences `pcnt` then increments the local variable,
but has no side effect.
Notes:
Merged: https://github.com/ruby/ruby/pull/7496
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/7462
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/7462
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/7459
|
|
passing will and closing notification can conflict and
`Ractor::Selector#empty?` can return wrong answer.
This patch fix it.
```
s = Ractor::Selector.new
s.add Ractor.new{10}
s.add Ractor.new{20}
r, v = s.wait
vs = []
vs << v
r, v = s.wait
vs << v
[*vs.sort, s.empty?]
#=> "[10, 20, false]" (expected "[10, 20, true]")
```
Notes:
Merged: https://github.com/ruby/ruby/pull/7420
|
|
It returns the waiting set is empty or not.
Also add Ractor::Selector's tests.
Notes:
Merged: https://github.com/ruby/ruby/pull/7417
|
|
This patch rewrites Ractor synchronization mechanism, send/receive
and take/yield.
* API
* Ractor::Selector is introduced for lightweight waiting
for many ractors.
* Data structure
* remove `struct rb_ractor_waiting_list` and use
`struct rb_ractor_queue takers_queue` to manage takers.
* remove `rb_ractor_t::yield_atexit` and use
`rb_ractor_t::sync::will_basket::type` to check the will.
* add `rb_ractor_basket::p.take` to represent a taking ractor.
* Synchronization protocol
* For the Ractor local GC, `take` can not make a copy object
directly so ask to generate the copy from the yielding ractor.
* The following steps shows what `r1.take` does on `r0`.
* step1: (r0) register `r0` into `r1`'s takers.
* step2: (r0) check `r1`'s status and wakeup r0 if `r1` is waiting
for yielding a value.
* step3: (r0) sleep until `r1` wakes up `r0`.
* The following steps shows what `Ractor.yield(v)` on `r1`.
* step1: (r1) check first takers of `r1` and if there is (`r0`),
make a copy object of `v` and pass it to `r0` and
wakes up `r0`.
* step2: (r1) if there is no taker ractors, sleep until
another ractor try to take.
Notes:
Merged: https://github.com/ruby/ruby/pull/7371
|
|
`rq` is always `r`'s queue.
Notes:
Merged: https://github.com/ruby/ruby/pull/7306
|