From: "ko1 (Koichi Sasada) via ruby-core" <ruby-core@ml.ruby-lang.org>
To: ruby-core@ml.ruby-lang.org
Cc: "ko1 (Koichi Sasada)" <noreply@ruby-lang.org>
Subject: [ruby-core:118542] [Ruby master Bug#20627] `require` on Ractor should run on the main Ractor
Date: Thu, 11 Jul 2024 03:14:02 +0000 (UTC) [thread overview]
Message-ID: <redmine.issue-20627.20240711031402.17@ruby-lang.org> (raw)
In-Reply-To: <redmine.issue-20627.20240711031402.17@ruby-lang.org>
Issue #20627 has been reported by ko1 (Koichi Sasada).
----------------------------------------
Bug #20627: `require` on Ractor should run on the main Ractor
https://bugs.ruby-lang.org/issues/20627
* Author: ko1 (Koichi Sasada)
* Status: Open
* Assignee: ko1 (Koichi Sasada)
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
Now `require` on main Ractor is not allowed (raising error) but it is hard, especially for `autoload`.
So let's allow `require` by running it on the main Ractor.
## Background
On many libraries it is needed to run loading on the main Ractors because:
1. Setup constants with unshareable objects (such as `C = []`) are not allowed on non main Ractors.
2. Setup global variables and class variables are not allowed. `$LOADED_FEATURES` is also untouchable.
3. (maybe more reasons)
So the `require` on non main Ractors is not allowed.
However it is hard to program especially on `autoload`.
Also dynamic `require` (`require` in methods) are not allowed too (`pp` method, for example).
## Proposal
Allow `require` on non main Ractors by running `require` process on the main Ractor.

(quoted on my talk at RubyKaigi 2024)
### `rb_ractor_interrupt_exec(target_ractor, func)` C-API
Make a thread on `target_ractor` and run `func` (C function) on it.
I think it is safe to expose on Ruby API because running `func` on a *newly created* thread (do not disturb running target threads). But now it is proposed as only (hidden) C-API.
### New Ractor methods
- `Rcator.main?` returns Ractors
- `Ractor.require(feature)` do `require` on the main Ractor
These new methods are useful for users who override `require` method like [RubyGems](https://github.com/ruby/ruby/blob/master/lib/rubygems/core_ext/kernel_require.rb#L36).
```ruby
alias orig_require require
def require feature
return Rator.require(feature) unless Ractor.main?
# overriding require code
end
```
Or we can prepend a module like:
```
Module.new do
def require(feature)
return Rator.require(feature) unless Ractor.main?
super(feature)
end
Kernel.prepend self
end
```
will support ractors for all overgrinding methods. But not sure it is acceptable to add additional one modules in ancestors by `prepend`.
Also this technique doesn't support require overriding by prepending.
## Implementation
https://github.com/ruby/ruby/pull/11142 (not matured yet)
---Files--------------------------------
clipboard-202407111201-kaiem.png (70.8 KB)
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/
next parent reply other threads:[~2024-07-11 3:14 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-11 3:14 ko1 (Koichi Sasada) via ruby-core [this message]
2024-07-12 19:45 ` [ruby-core:118584] " luke-gru (Luke Gruber) via ruby-core
2024-09-05 2:48 ` [ruby-core:119051] [Ruby master Feature#20627] " ko1 (Koichi Sasada) via ruby-core
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=redmine.issue-20627.20240711031402.17@ruby-lang.org \
--to=ruby-core@ml.ruby-lang.org \
--cc=noreply@ruby-lang.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).