path: root/ractor.c
AgeCommit message (Collapse)Author
2022-07-22Add "rb_" prefixes to toplevel enum definitionsYusuke Endoh
... as per ko1's request. Notes: Merged:
2022-07-21Expand tabs [ci skip]Takashi Kokubun
[Misc #18891] Notes: Merged:
2022-04-22rename thread internal namingKoichi Sasada
Now GVL is not process *Global* so this patch try to use another words. * `rb_global_vm_lock_t` -> `struct rb_thread_sched` * `gvl->owner` -> `sched->running` * `gvl->waitq` -> `sched->readyq` * `rb_gvl_init` -> `rb_thread_sched_init` * `gvl_destroy` -> `rb_thread_sched_destroy` * `gvl_acquire` -> `thread_sched_to_running` # waiting -> ready -> running * `gvl_release` -> `thread_sched_to_waiting` # running -> waiting * `gvl_yield` -> `thread_sched_yield` * `GVL_UNLOCK_BEGIN` -> `THREAD_BLOCKING_BEGIN` * `GVL_UNLOCK_END` -> `THREAD_BLOCKING_END` * removed * `rb_ractor_gvl` * `rb_vm_gvl_destroy` (not used) There are GVL functions such as `rb_thread_call_without_gvl()` yet but I don't have good name to replace them. Maybe GVL stands for "Greate Valuable Lock" or something like that. Notes: Merged:
2022-04-07Get rid of type-punning pointer castsNobuyoshi Nakada
2022-03-30ractor.c: Add a helper function to ensure the context is a main ractorYusuke Endoh
Notes: Merged:
2022-03-30Prefix ccan headers (#4568)Nobuyoshi Nakada
* Prefixed ccan headers * Remove unprefixed names in ccan/build_assert * Remove unprefixed names in ccan/check_type * Remove unprefixed names in ccan/container_of * Remove unprefixed names in ccan/list Co-authored-by: Samuel Williams <> Notes: Merged-By: ioquatix <>
2022-03-28Fix Ractor.receive_if + rb_vm_barrier() deadlockAlan Wu
I have this scripts that deadlocks after about 5 minutes if I repeatedly run it with a shell loop: ```ruby $VERBOSE = nil lamb = ->(main, gc) do gc.verify_internal_consistency gc.verify_internal_consistency main << 1 gc.verify_internal_consistency gc.verify_internal_consistency main << 2 gc.verify_internal_consistency gc.verify_internal_consistency main << 3 gc.verify_internal_consistency gc.verify_internal_consistency end lamb[[], GC] lamb[[], GC] r = Ractor.current, GC, &lamb a = [] a << Ractor.receive_if{|msg| msg == 2} a << Ractor.receive_if{|msg| msg == 3} a << Ractor.receive_if{|msg| msg == 1} ``` Shell loop: ```shell while ./miniruby deadlock.rb; do date; done ``` Once it locks up, CTRL-C doesn't interrupt the process which led me to infer `receive_if` is looping in `ractor_receive_if()` without checking for interrupts. This can be confirmed by attaching a debugger to the deadlocked miniruby. The deadlock has one thread looping in `receive_if` and another waiting in `rb_vm_barrier()`. The barrier relies on interrupt checking to finish. Theoretically speaking the `rb_vm_barrier()` could come from one thread naturally starting GC. We found this while developing YJIT but it dead locks running with YJIT disabled. YJIT currently relies on `rb_vm_barrier()` to synchronize before changing memory protection. This diff adds an interrupt check in the loop in `Ractor#receive_if` which seems to fix the deadlock. In addition, this commit allows interrupting the following single ractor script with CTRL-C. ```shell ruby -e 'Ractor.current.send(3); Ractor.receive_if { false }' ``` Notes: Merged: Merged-By: XrXr
2021-12-29`USE_RUBY_DEBUG_LOG` doesn't check `RUBY_DEVEL`Koichi Sasada
`USE_RUBY_DEBUG_LOG` was only defined when `RUBY_DEVEL` is defined. This patch removes this dependency (`USE_RUBY_DEBUG_LOG` is defined independently from `RUBY_DEVEL`). Do not commit a patch which enables `USE_RUBY_DEBUG_LOG`. Notes: Merged:
2021-12-25Suppress undef warnings for USE_RUBY_DEBUG_LOGNobuyoshi Nakada
Notes: Merged:
2021-10-20Yet Another Ruby JIT!Jose Narvaez
Renaming uJIT to YJIT. AKA s/ujit/yjit/g.
2021-10-20uJIT: Implement opt_getinlinecacheAlan Wu
* ujit: implement opt_getinlinecache Aggressively bet that writes to constants don't happen and invalidate all opt_getinlinecache blocks on any and all constant writes. Use alignment padding on block_t to track this assumption. No change to sizeof(block_t). * Fix compile warnings when not RUBY_DEBUG * Fix reversed condition * Switch to st_table to keep track of assumptions Co-authored-by: Aaron Patterson <> Co-authored-by: Maxime Chevalier-Boisvert <>
2021-10-20Use `RUBY_FUNCTION_NAME_STRING` for old Visual C++Nobuyoshi Nakada
Probably `__func__` is supported since Visual C++ 2015 (= 14.0, `_MSC_VER` = 1900).
2021-10-20Cast to void pointer for `%p` in commented out code [ci skip]Nobuyoshi Nakada
2021-10-20Supress `warning: data argument not used by format string [-Wformat-extra-args]`Kazuhiro NISHIYAMA
Notes: Merged:
2021-10-03Cast to void pointer to suppress -Wformat-pedantic in RUBY_DEBUG_LOGNobuyoshi Nakada
2021-08-24[Bug #18117] Fix Ractor race condition with GCPeter Zhu
rb_objspace_reachable_objects_from requires that the GC not be active. Since the Ractor barrier is not executed for incremental sweeping, Ractor may call rb_objspace_reachable_objects_from after sweeping has started to share objects. This causes a crash that looks like the following: ``` <internal:ractor>:627: [BUG] rb_objspace_reachable_objects_from() is not supported while during_gc == true ``` Co-authored-by: Vinicius Stock <> Notes: Merged:
2021-07-15[Bug #18014] Fix memory leak in GC when using RactorsPeter Zhu
When a Ractor is removed, the freelist in the Ractor cache is not returned to the GC, leaving the freelist permanently lost. This commit recycles the freelist when the Ractor is destroyed, preventing a memory leak from occurring. Notes: Merged:
2021-06-23Evacuate transient heap when enabling ractorseileencodes
If the GC has been disabled we need to re-enable it so we can evacuate the transient heap. Fixes [Bug #17985] [ruby-core:104260] Co-authored-by: Aaron Patterson <> Notes: Merged:
2021-06-01Enable VM_ASSERT in --jit CIs (#4543)Takashi Kokubun
Notes: Merged-By: k0kubun <>
2021-04-26Fix some typos by spell checkerRyuta Kamizono
Notes: Merged:
2021-03-13Moved locking VM to an atomic operationNobuyoshi Nakada
2021-03-07Make Ractor stdio belonging to the Ractor [Bug #17672]Nobuyoshi Nakada
Defer making ractor stdio until ractor started. Before ractor started, created objects belong to the caller ractor instead of the created ractor. Notes: Merged: Merged-By: nobu <>
2021-02-18Ractor.allocate should not be allowedKoichi Sasada
Ractor.allocate and Ractor#dup should not be allowed like Thread. [Bug #17642] Notes: Merged:
2021-01-22fix Ractor.yield(obj, move: true)Koichi Sasada
Ractor.yield(obj, move: true) and, yield_value: obj, move: true) tried to yield a value with move semantices, but if the trial is faild, the obj should not become a moved object. To keep this rule, `wait_moving` wait status is introduced. New yield/take process: (1) If a ractor tried to yield (move:true), make taking racotr's wait status `wait_moving` and make a moved object by `ractor_move(obj)` and wakeup taking ractor. (2) If a ractor tried to take a message from a ractor waiting fo yielding (move:true), wakeup the ractor and wait for (1). Notes: Merged:
2021-01-22alen should be actions number on ractor_select()Koichi Sasada
alen was number of rs, but it should be actions number (taking ractors + receiving + yielding). Notes: Merged:
2021-01-22use ractor_wakeup()Koichi Sasada
Use ractor_wakeup() for same code.
2021-01-06expose some C-APIs for ractorKoichi Sasada
expose some C-APIs to try to make ractor utilities on external gems. * add * rb_ractor_local_storage_value_lookup() to check availability * expose * rb_ractor_make_shareable() * rb_ractor_make_shareable_copy() * rb_proc_isolate() (not public) * rb_proc_isolate_bang() (not public) * rb_proc_ractor_make_shareable() (not public)
2020-12-24introduce rb_ractor_atfork()Koichi Sasada
to reset main ractor at fork().
2020-12-24fix ractor-locking around rb_ractor_thread_list()Koichi Sasada
With locking a ractor, rb_ary_push() can call RB_VM_LOCK_ENTER() and it violates an assertion: should not acquire ractor-lock.
2020-12-23Update rb_ractor_ensure_shareableNobuyoshi Nakada
* Fixed use of rb_ractor_shareable_p * Raise Ractor::IsolationError Notes: Merged:
2020-12-23Changed shareable literal semantics [Feature #17397]Nobuyoshi Nakada
When `literal`, check if the literal about to be assigned to a constant is ractor-shareable, otherwise raise `Ractor::Error` at runtime instead of `SyntaxError`. Notes: Merged:
2020-12-23ruby_single_main_ractor should be clear before warnKoichi Sasada
rb_warn can produce T_HASA object and it should not use transient heap.
2020-12-21Remove debugging codeMarc-Andre Lafortune
2020-12-22fix ractor's doc. [ci skip]Koichi Sasada
Notes: Merged:
2020-12-22add Ractor#[]/#[]= for ractor local storageKoichi Sasada
This API is similar to plain old Thread#[]/Fiber#[] interface with symbol key. Notes: Merged:
2020-12-22separate rb_ractor_pub from rb_ractor_tKoichi Sasada
separate some fields from rb_ractor_t to rb_ractor_pub and put it at the beggining of rb_ractor_t and declare it in vm_core.h so vm_core.h can access rb_ractor_pub fields. Now rb_ec_ractor_hooks() is a complete inline function and no MJIT related issue. Notes: Merged: should be ractor-localKoichi Sasada
TracePoint should be ractor-local because the Proc can violate the Ractor-safe. Notes: Merged:
2020-12-21Introduce Ractor::IsolationErrorKoichi Sasada
Ractor has several restrictions to keep each ractor being isolated and some operation such as `CONST="foo"` in non-main ractor raises an exception. This kind of operation raises an error but there is confusion (some code raises RuntimeError and some code raises NameError). To make clear we introduce Ractor::IsolationError which is raised when the isolation between ractors is violated. Notes: Merged:
2020-12-21[DOC] Remove about FrozenError from Ractor::MovedObject [ci skip]Kazuhiro NISHIYAMA
Because unfreeze Ractor::MovedObject at
2020-12-21should use owned_p instead of locked_pKoichi Sasada
It should raise an error if the same thread tris to call receive/receive_if. Notes: Merged:
2020-12-21rename to rb_ractor_make_shareable_copy()Koichi Sasada
from rb_ractor_make_copy_shareable().
2020-12-21fix Ractor.make_shareable() with Class/ModuleKoichi Sasada
To check shareable-ness, rb_ractor_shareable_p() is needed for Class/Module objects isntead of checking flags.
2020-12-19Tweak Ractor doc [doc] [ci skip]Marc-Andre Lafortune
2020-12-19Add documentation for Ractor (#3895)Victor Shepelev
Notes: Merged-By: marcandre <>
2020-12-19unfreeze Ractor::MovedObjectKoichi Sasada
Matz prefers to unfreeze the class. [Feature #17401]
2020-12-19add "copy: true" option for Ractor.make_shareableKoichi Sasada
Ractor.make_shareable(obj) tries to make obj a shareable object by changing the attribute of obj and traversable objects from obj (mainly freeze them). "copy: true" option is more conservative approach by make deep copied object and make it sharable. It doesn't affect any existing objects.
2020-12-18Use category: :experimental in warnings that are related to experimental ↵Jeremy Evans
features This adds rb_category_compile_warn in order to emit compiler warnings with categories. Note that Ripper currently ignores the category for these warnings, but by default it ignores the warnings completely, so this shouldn't matter. Notes: Merged:
2020-12-17fix timing bugKoichi Sasada
ractor_sleep() can remain wait.status by interrupt, so that this patch handles more correctly. This patch fixed this kind of assertion failures: Assertion Failed: ../src/ractor.c:1332:ractor_yield_atexit:cr->sync.wait.status == wait_none
2020-12-16Ractor#receive_if to receive only matched messagesKoichi Sasada
Instead of Ractor.receive, Ractor.receive_if can provide a pattern by a block and you can choose the receiving message. [Feature #17378] Notes: Merged:
2020-12-13Fixed a suspicious comparisonNobuyoshi Nakada