diff options
author | Koichi Sasada <[email protected]> | 2024-11-05 04:54:06 +0900 |
---|---|---|
committer | Koichi Sasada <[email protected]> | 2024-11-08 18:02:46 +0900 |
commit | aa63699d10e489bc6d9c13406fc47f581001568b (patch) | |
tree | c01cefb86da657d39e3a8f50771cb84827d5b003 /variable.c | |
parent | 075a102c937969c62a6798b32b3c3188df91a075 (diff) |
support `require` in non-main Ractors
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
Notes:
Merged: https://github.com/ruby/ruby/pull/11142
Diffstat (limited to 'variable.c')
-rw-r--r-- | variable.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/variable.c b/variable.c index bcdf2fb070..5e178ef06b 100644 --- a/variable.c +++ b/variable.c @@ -2994,7 +2994,7 @@ rb_autoload_load(VALUE module, ID name) // At this point, we assume there might be autoloading, so fail if it's ractor: if (UNLIKELY(!rb_ractor_main_p())) { - rb_raise(rb_eRactorUnsafeError, "require by autoload on non-main Ractor is not supported (%s)", rb_id2name(name)); + return rb_ractor_autoload_load(module, name); } // This state is stored on the stack and is used during the autoload process. |