summaryrefslogtreecommitdiff
path: root/ractor.c
AgeCommit message (Collapse)Author
2025-11-06[Backport #21638] Mark ractor-local `$VERBOSE` and `$DEBUG`Nobuyoshi Nakada
https://github.com/sampersand/blog/blob/master/the%20-s%20flag.md#the-segfault
2025-09-05Add write barrier for hash in obj_traverse_iJohn Hawthorn
We are inserting directly into the st_table, so we need to issue a write barrier from the hash.
2024-12-25[DOC] Hide Ractor::SelectorNobuyoshi Nakada
It is not enabled by default currently. Notes: Merged: https://github.com/ruby/ruby/pull/12461
2024-12-24Fix calls to require_internal in multi-ractor modelukeg
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
2024-12-24Fix ractor move of unshareable frozen objectsLuke Gruber
These objects didn't retain their frozen status after the move Bug [#19408] Notes: Merged: https://github.com/ruby/ruby/pull/9996
2024-12-22[DOC] Fix typos in comments in ractor.cYudai Takada
Notes: Merged: https://github.com/ruby/ruby/pull/12425 Merged-By: nobu <nobu@ruby-lang.org>
2024-12-13followup 0bdb38ba6be208064a514c12a9b80328645689f8Koichi Sasada
(forgot to amend...) Notes: Merged: https://github.com/ruby/ruby/pull/12331
2024-12-13`Ractor.set_if_absent(key)`Koichi Sasada
to initialize ractor local storage in thread-safety. [Feature #20875] Notes: Merged: https://github.com/ruby/ruby/pull/12321
2024-11-25Place all non-default GC API behind USE_SHARED_GCMatt Valentine-House
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
2024-11-08introduce `rb_ec_check_ints()`Koichi Sasada
to avoid TLS issue with N:M threads. Notes: Merged: https://github.com/ruby/ruby/pull/11142
2024-11-08check closing flagKoichi Sasada
`Ractor.receive` and `Ractor.yield` should stop when the incoming/outgoing port is closed. Notes: Merged: https://github.com/ruby/ruby/pull/11142
2024-11-08support `require` in non-main RactorsKoichi Sasada
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
2024-10-24Fix shared GC with -DRUBY_DEBUGMatt Valentine-House
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
2024-10-18Use rb_id_table_foreach_values for marking Ractor local storagePeter Zhu
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
2024-07-16Fix memory leak reported in main ractor when RUBY_FREE_AT_EXITPeter Zhu
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
2024-07-03[Feature #20470] Split GC into gc_impl.cPeter Zhu
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.
2024-05-28Stop marking chilled strings as frozenÉtienne Barrié
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>
2024-05-05Fix interrupts during Ractor.selectLuke Gruber
Fixes [Bug #20168]
2024-04-24Add ruby_mimcallocPeter Zhu
Many places call ruby_mimmalloc then MEMZERO. This can be reduced by using ruby_mimcalloc instead.
2024-03-19Implement chilled stringsÉtienne Barrié
[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>
2024-03-17Prefer `enum ruby_tag_type` over `int`Nobuyoshi Nakada
2024-01-30Use `UNDEF_P`Nobuyoshi Nakada
2024-01-25Trigger postponed jobs on running_ec if that is availableKJ Tsanaktsidis
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]
2024-01-02Set Ractor moved object's shape to original object's shapeLuke Gruber
Fixes [Bug #19409]
2023-12-21Use main_thread->ec from rb_vm_main_ractor_ecJohn Hawthorn
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>
2023-12-20moved object should not have a shape IDKoichi Sasada
fix [Bug #19917]
2023-12-16remove `Ractor::Selector` from Ruby levelKoichi Sasada
`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.
2023-11-28Fix Ractor sharing for too complex ObjectsPeter Zhu
2023-11-28Fix Ractor sharing for too complex generic ivarsPeter Zhu
2023-10-31Add ST table to gen_ivtbl for complex shapesPeter Zhu
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.
2023-10-12M:N thread scheduler for RactorsKoichi Sasada
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]
2023-07-13[Feature #19730] Remove transient heapPeter Zhu
Notes: Merged: https://github.com/ruby/ruby/pull/7942
2023-07-10Reuse rb_ractor_make_shareable function for rb_ractor_make_shareable_copy ↵S-H-GAMELINKS
function Notes: Merged: https://github.com/ruby/ruby/pull/8048
2023-06-30Remove duplicate declarationsNobuyoshi Nakada
2023-06-23Prefer `0` over `NULL` as function pointersNobuyoshi Nakada
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>
2023-05-17Implement Hash AR tables on VWAPeter Zhu
Notes: Merged: https://github.com/ruby/ruby/pull/7742
2023-04-26add new debug log line on `rb_ractor_terminate_all`Koichi Sasada
to leave the trace. Notes: Merged: https://github.com/ruby/ruby/pull/7763
2023-03-30show debug log for `ractor_terminal_interrupt_all`Koichi Sasada
Notes: Merged: https://github.com/ruby/ruby/pull/7616
2023-03-30`rb_ractor_thread_list()` only for current ractorKoichi Sasada
so that no need to lock the ractor. Notes: Merged: https://github.com/ruby/ruby/pull/7616
2023-03-30`rb_current_ractor_raw(b)`Koichi Sasada
`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
2023-03-20Use an st table for "too complex" objectsAaron Patterson
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
2023-03-19Fix -Wclobbered warning from gcc 12Nobuyoshi Nakada
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
2023-03-15Fix indirect counter incrementNobuyoshi Nakada
`*pcnt++` just dereferences `pcnt` then increments the local variable, but has no side effect. Notes: Merged: https://github.com/ruby/ruby/pull/7496
2023-03-06s/mjit/rjit/Takashi Kokubun
Notes: Merged: https://github.com/ruby/ruby/pull/7462
2023-03-06s/MJIT/RJIT/Takashi Kokubun
Notes: Merged: https://github.com/ruby/ruby/pull/7462
2023-03-06Stop exporting symbols for MJITTakashi Kokubun
Notes: Merged: https://github.com/ruby/ruby/pull/7459
2023-03-03fix timing bugKoichi Sasada
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
2023-03-03`Ractor::Selector#empty?`Koichi Sasada
It returns the waiting set is empty or not. Also add Ractor::Selector's tests. Notes: Merged: https://github.com/ruby/ruby/pull/7417
2023-03-02Rewrite Ractor synchronization mechanismKoichi Sasada
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
2023-02-15`ractor_queue_enq/deq` doesn't need `rq` paramKoichi Sasada
`rq` is always `r`'s queue. Notes: Merged: https://github.com/ruby/ruby/pull/7306