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 /load.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 'load.c')
-rw-r--r-- | load.c | 23 |
1 files changed, 16 insertions, 7 deletions
@@ -18,6 +18,7 @@ #include "darray.h" #include "ruby/encoding.h" #include "ruby/util.h" +#include "ractor_core.h" static VALUE ruby_dln_libmap; @@ -1383,17 +1384,25 @@ static VALUE rb_require_string_internal(VALUE fname, bool resurrect) { rb_execution_context_t *ec = GET_EC(); - int result = require_internal(ec, fname, 1, RTEST(ruby_verbose)); - if (result > TAG_RETURN) { - EC_JUMP_TAG(ec, result); - } - if (result < 0) { + // main ractor check + if (!rb_ractor_main_p()) { if (resurrect) fname = rb_str_resurrect(fname); - load_failed(fname); + return rb_ractor_require(fname); } + else { + int result = require_internal(ec, fname, 1, RTEST(ruby_verbose)); + + if (result > TAG_RETURN) { + EC_JUMP_TAG(ec, result); + } + if (result < 0) { + if (resurrect) fname = rb_str_resurrect(fname); + load_failed(fname); + } - return RBOOL(result); + return RBOOL(result); + } } VALUE |