* [ruby-core:120617] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable
@ 2025-01-11 23:24 tenderlovemaking (Aaron Patterson) via ruby-core
2025-01-13 18:46 ` [ruby-core:120638] " tenderlovemaking (Aaron Patterson) via ruby-core
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: tenderlovemaking (Aaron Patterson) via ruby-core @ 2025-01-11 23:24 UTC (permalink / raw)
To: ruby-core; +Cc: tenderlovemaking (Aaron Patterson)
Issue #21028 has been reported by tenderlovemaking (Aaron Patterson).
----------------------------------------
Feature #21028: Method for finding why an object isn't Ractor shareable
https://bugs.ruby-lang.org/issues/21028
* Author: tenderlovemaking (Aaron Patterson)
* Status: Open
----------------------------------------
`Ractor.shareable?` is easy to use, but if it returns false I would like to be able to figure out what object is causing the data structure to _not_ be Ractor shareable.
The context is that I'm trying to make some complex data structures in Rails deeply frozen. If they are deeply frozen they _should_ be Ractor shareable, but `Ractor.shareable?` is returning `false` and it's hard for me to figure out _why_.
I would like a method that would either return all unshareable references, or a method that takes a block and unshareable references are yielded to the block.
A method like `Ractor.unshareable_references?` or maybe `Ractor.shareable?(obj) { |not_shareable_obj| }` would be very helpful for discovering why an object is not shareable.
Thanks!
--
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/
^ permalink raw reply [flat|nested] 7+ messages in thread
* [ruby-core:120638] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable
2025-01-11 23:24 [ruby-core:120617] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable tenderlovemaking (Aaron Patterson) via ruby-core
@ 2025-01-13 18:46 ` tenderlovemaking (Aaron Patterson) via ruby-core
2025-01-13 22:47 ` [ruby-core:120642] " luke-gru (Luke Gruber) via ruby-core
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: tenderlovemaking (Aaron Patterson) via ruby-core @ 2025-01-13 18:46 UTC (permalink / raw)
To: ruby-core; +Cc: tenderlovemaking (Aaron Patterson)
Issue #21028 has been updated by tenderlovemaking (Aaron Patterson).
Assignee set to tenderlovemaking (Aaron Patterson)
----------------------------------------
Feature #21028: Method for finding why an object isn't Ractor shareable
https://bugs.ruby-lang.org/issues/21028#change-111467
* Author: tenderlovemaking (Aaron Patterson)
* Status: Open
* Assignee: tenderlovemaking (Aaron Patterson)
----------------------------------------
`Ractor.shareable?` is easy to use, but if it returns false I would like to be able to figure out what object is causing the data structure to _not_ be Ractor shareable.
The context is that I'm trying to make some complex data structures in Rails deeply frozen. If they are deeply frozen they _should_ be Ractor shareable, but `Ractor.shareable?` is returning `false` and it's hard for me to figure out _why_.
I would like a method that would either return all unshareable references, or a method that takes a block and unshareable references are yielded to the block.
A method like `Ractor.unshareable_references?` or maybe `Ractor.shareable?(obj) { |not_shareable_obj| }` would be very helpful for discovering why an object is not shareable.
Thanks!
--
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/
^ permalink raw reply [flat|nested] 7+ messages in thread
* [ruby-core:120642] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable
2025-01-11 23:24 [ruby-core:120617] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable tenderlovemaking (Aaron Patterson) via ruby-core
2025-01-13 18:46 ` [ruby-core:120638] " tenderlovemaking (Aaron Patterson) via ruby-core
@ 2025-01-13 22:47 ` luke-gru (Luke Gruber) via ruby-core
2025-02-01 16:33 ` [ruby-core:120854] " osyoyu (Daisuke Aritomo) via ruby-core
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: luke-gru (Luke Gruber) via ruby-core @ 2025-01-13 22:47 UTC (permalink / raw)
To: ruby-core; +Cc: luke-gru (Luke Gruber)
Issue #21028 has been updated by luke-gru (Luke Gruber).
I suspect it's probably a `Proc` object. The feature sounds good to me, and wouldn't be hard to implement I think.
----------------------------------------
Feature #21028: Method for finding why an object isn't Ractor shareable
https://bugs.ruby-lang.org/issues/21028#change-111471
* Author: tenderlovemaking (Aaron Patterson)
* Status: Open
* Assignee: tenderlovemaking (Aaron Patterson)
----------------------------------------
`Ractor.shareable?` is easy to use, but if it returns false I would like to be able to figure out what object is causing the data structure to _not_ be Ractor shareable.
The context is that I'm trying to make some complex data structures in Rails deeply frozen. If they are deeply frozen they _should_ be Ractor shareable, but `Ractor.shareable?` is returning `false` and it's hard for me to figure out _why_.
I would like a method that would either return all unshareable references, or a method that takes a block and unshareable references are yielded to the block.
A method like `Ractor.unshareable_references?` or maybe `Ractor.shareable?(obj) { |not_shareable_obj| }` would be very helpful for discovering why an object is not shareable.
Thanks!
--
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/
^ permalink raw reply [flat|nested] 7+ messages in thread
* [ruby-core:120854] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable
2025-01-11 23:24 [ruby-core:120617] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable tenderlovemaking (Aaron Patterson) via ruby-core
2025-01-13 18:46 ` [ruby-core:120638] " tenderlovemaking (Aaron Patterson) via ruby-core
2025-01-13 22:47 ` [ruby-core:120642] " luke-gru (Luke Gruber) via ruby-core
@ 2025-02-01 16:33 ` osyoyu (Daisuke Aritomo) via ruby-core
2025-02-13 9:21 ` [ruby-core:120973] " mame (Yusuke Endoh) via ruby-core
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: osyoyu (Daisuke Aritomo) via ruby-core @ 2025-02-01 16:33 UTC (permalink / raw)
To: ruby-core; +Cc: osyoyu (Daisuke Aritomo)
Issue #21028 has been updated by osyoyu (Daisuke Aritomo).
+1 for this feature. It is quite hard to find out that a rb_data_type_t in the deep is lacking the `RUBY_TYPED_FROZEN_SHAREABLE` flag.
----------------------------------------
Feature #21028: Method for finding why an object isn't Ractor shareable
https://bugs.ruby-lang.org/issues/21028#change-111731
* Author: tenderlovemaking (Aaron Patterson)
* Status: Open
* Assignee: tenderlovemaking (Aaron Patterson)
----------------------------------------
`Ractor.shareable?` is easy to use, but if it returns false I would like to be able to figure out what object is causing the data structure to _not_ be Ractor shareable.
The context is that I'm trying to make some complex data structures in Rails deeply frozen. If they are deeply frozen they _should_ be Ractor shareable, but `Ractor.shareable?` is returning `false` and it's hard for me to figure out _why_.
I would like a method that would either return all unshareable references, or a method that takes a block and unshareable references are yielded to the block.
A method like `Ractor.unshareable_references?` or maybe `Ractor.shareable?(obj) { |not_shareable_obj| }` would be very helpful for discovering why an object is not shareable.
Thanks!
--
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/
^ permalink raw reply [flat|nested] 7+ messages in thread
* [ruby-core:120973] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable
2025-01-11 23:24 [ruby-core:120617] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable tenderlovemaking (Aaron Patterson) via ruby-core
` (2 preceding siblings ...)
2025-02-01 16:33 ` [ruby-core:120854] " osyoyu (Daisuke Aritomo) via ruby-core
@ 2025-02-13 9:21 ` mame (Yusuke Endoh) via ruby-core
2025-07-24 16:49 ` [ruby-core:122860] [Ruby " osyoyu (Daisuke Aritomo) via ruby-core
2025-07-26 6:21 ` [ruby-core:122867] " osyoyu (Daisuke Aritomo) via ruby-core
5 siblings, 0 replies; 7+ messages in thread
From: mame (Yusuke Endoh) via ruby-core @ 2025-02-13 9:21 UTC (permalink / raw)
To: ruby-core; +Cc: mame (Yusuke Endoh)
Issue #21028 has been updated by mame (Yusuke Endoh).
Is `ObjectSpace.reachable_objects_from` usable for the use case? It's a bit tedious, but I think it's more flexible not only to get an unshareable object, but also to get the path to the object in question.
```ruby
require "objspace"
def find_path_to_unshareable_object(obj, path = [], visited = {})
path += [obj]
return if visited[obj]
visited[obj] = true
return if Ractor.shareable?(obj)
objs = ObjectSpace.reachable_objects_from(obj)
return path if objs.all? { Ractor.shareable?(it) }
objs.each do |obj2|
res = find_path_to_unshareable_object(obj2, path, visited)
return res if res
end
return nil
end
pp *find_path_to_unshareable_object([1, 2, 3, "str".freeze, { :key => -> {} }])
#=> [1, 2, 3, "str", {key: #<Proc:0x00007f0a38e0ff30 t.rb:20 (lambda)>}]
#=> {key: #<Proc:0x00007f0a38e0ff30 t.rb:20 (lambda)>}
#=> #<Proc:0x00007f0a38e0ff30 t.rb:20 (lambda)>
#=> main
```
----------------------------------------
Feature #21028: Method for finding why an object isn't Ractor shareable
https://bugs.ruby-lang.org/issues/21028#change-111874
* Author: tenderlovemaking (Aaron Patterson)
* Status: Open
* Assignee: tenderlovemaking (Aaron Patterson)
----------------------------------------
`Ractor.shareable?` is easy to use, but if it returns false I would like to be able to figure out what object is causing the data structure to _not_ be Ractor shareable.
The context is that I'm trying to make some complex data structures in Rails deeply frozen. If they are deeply frozen they _should_ be Ractor shareable, but `Ractor.shareable?` is returning `false` and it's hard for me to figure out _why_.
I would like a method that would either return all unshareable references, or a method that takes a block and unshareable references are yielded to the block.
A method like `Ractor.unshareable_references?` or maybe `Ractor.shareable?(obj) { |not_shareable_obj| }` would be very helpful for discovering why an object is not shareable.
Thanks!
--
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/
^ permalink raw reply [flat|nested] 7+ messages in thread
* [ruby-core:122860] [Ruby Feature#21028] Method for finding why an object isn't Ractor shareable
2025-01-11 23:24 [ruby-core:120617] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable tenderlovemaking (Aaron Patterson) via ruby-core
` (3 preceding siblings ...)
2025-02-13 9:21 ` [ruby-core:120973] " mame (Yusuke Endoh) via ruby-core
@ 2025-07-24 16:49 ` osyoyu (Daisuke Aritomo) via ruby-core
2025-07-26 6:21 ` [ruby-core:122867] " osyoyu (Daisuke Aritomo) via ruby-core
5 siblings, 0 replies; 7+ messages in thread
From: osyoyu (Daisuke Aritomo) via ruby-core @ 2025-07-24 16:49 UTC (permalink / raw)
To: ruby-core; +Cc: osyoyu (Daisuke Aritomo)
Issue #21028 has been updated by osyoyu (Daisuke Aritomo).
I have been relying a lot on @mame 's snippet when programming with Ractors. It has been very useful to find why a library function / constant violates the rules of Ractors.
I have opened a pull request to add `ObjectSpace#find_paths_to_unshareable_objects`, a version of this method which returns all unshareable objects which can be traced from `obj`.
https://github.com/ruby/ruby/pull/13963
```ruby
require 'objspace'
def find_paths_to_unshareable_objects(obj)
return to_enum(__method__, obj) if !block_given?
queue = [[obj, []]]
visited = Set.new
while current = queue.shift
current_obj, current_path = current
visited.add(current_obj.object_id)
if !Ractor.shareable?(current_obj)
yield current_path + [current_obj]
ObjectSpace.reachable_objects_from(current_obj).each do |reachable|
if !reachable.is_a?(ObjectSpace::InternalObjectWrapper) && !visited.include?(reachable.object_id)
queue.push([reachable, current_path + [current_obj]])
end
end
end
end
end
# Paths to all unshareable objects are yielded
pp *find_paths_to_unshareable_objects([1, 2, 3, +"str", { :key => -> {} }])
#=> [[1, 2, 3, "str", {key: #<Proc:0x00007f22b7a5e598 rac.rb:25 (lambda)>}]]
#=> [[1, 2, 3, "str", {key: #<Proc:0x00007f22b7a5e598 rac.rb:25 (lambda)>}], "str"]
#=> [[1, 2, 3, "str", {key: #<Proc:0x00007f22b7a5e598 rac.rb:25 (lambda)>}], {key: #<Proc:0x00007f22b7a5e598 rac.rb:25 (lambda)>}]
#=> [[1, 2, 3, "str", {key: #<Proc:0x00007f22b7a5e598 rac.rb:25 (lambda)>}], {key: #<Proc:0x00007f22b7a5e598 rac.rb:25 (lambda)>}, #<Proc:0x00007f22b7a5e598 rac.rb:25 (lambda)>]
#=> [[1, 2, 3, "str", {key: #<Proc:0x00007f22b7a5e598 rac.rb:25 (lambda)>}], {key: #<Proc:0x00007f22b7a5e598 rac.rb:25 (lambda)>}, #<Proc:0x00007f22b7a5e598 rac.rb:25 (lambda)>, main]
```
----------------------------------------
Feature #21028: Method for finding why an object isn't Ractor shareable
https://bugs.ruby-lang.org/issues/21028#change-114151
* Author: tenderlovemaking (Aaron Patterson)
* Status: Feedback
* Assignee: tenderlovemaking (Aaron Patterson)
----------------------------------------
`Ractor.shareable?` is easy to use, but if it returns false I would like to be able to figure out what object is causing the data structure to _not_ be Ractor shareable.
The context is that I'm trying to make some complex data structures in Rails deeply frozen. If they are deeply frozen they _should_ be Ractor shareable, but `Ractor.shareable?` is returning `false` and it's hard for me to figure out _why_.
I would like a method that would either return all unshareable references, or a method that takes a block and unshareable references are yielded to the block.
A method like `Ractor.unshareable_references?` or maybe `Ractor.shareable?(obj) { |not_shareable_obj| }` would be very helpful for discovering why an object is not shareable.
Thanks!
--
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/
^ permalink raw reply [flat|nested] 7+ messages in thread
* [ruby-core:122867] [Ruby Feature#21028] Method for finding why an object isn't Ractor shareable
2025-01-11 23:24 [ruby-core:120617] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable tenderlovemaking (Aaron Patterson) via ruby-core
` (4 preceding siblings ...)
2025-07-24 16:49 ` [ruby-core:122860] [Ruby " osyoyu (Daisuke Aritomo) via ruby-core
@ 2025-07-26 6:21 ` osyoyu (Daisuke Aritomo) via ruby-core
5 siblings, 0 replies; 7+ messages in thread
From: osyoyu (Daisuke Aritomo) via ruby-core @ 2025-07-26 6:21 UTC (permalink / raw)
To: ruby-core; +Cc: osyoyu (Daisuke Aritomo)
Issue #21028 has been updated by osyoyu (Daisuke Aritomo).
A suggestion from @ko1 was to make this a block argument of `Ractor.make_shareable`.
However I'd rather prefer this to be a method of its own, since the "make shareable as much as possible" behavior isn't always desired, especially when the intention is to make libraries Ractor-compatible by default.
----------------------------------------
Feature #21028: Method for finding why an object isn't Ractor shareable
https://bugs.ruby-lang.org/issues/21028#change-114168
* Author: tenderlovemaking (Aaron Patterson)
* Status: Open
* Assignee: tenderlovemaking (Aaron Patterson)
----------------------------------------
`Ractor.shareable?` is easy to use, but if it returns false I would like to be able to figure out what object is causing the data structure to _not_ be Ractor shareable.
The context is that I'm trying to make some complex data structures in Rails deeply frozen. If they are deeply frozen they _should_ be Ractor shareable, but `Ractor.shareable?` is returning `false` and it's hard for me to figure out _why_.
I would like a method that would either return all unshareable references, or a method that takes a block and unshareable references are yielded to the block.
A method like `Ractor.unshareable_references?` or maybe `Ractor.shareable?(obj) { |not_shareable_obj| }` would be very helpful for discovering why an object is not shareable.
Thanks!
--
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/
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-07-26 6:22 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-11 23:24 [ruby-core:120617] [Ruby master Feature#21028] Method for finding why an object isn't Ractor shareable tenderlovemaking (Aaron Patterson) via ruby-core
2025-01-13 18:46 ` [ruby-core:120638] " tenderlovemaking (Aaron Patterson) via ruby-core
2025-01-13 22:47 ` [ruby-core:120642] " luke-gru (Luke Gruber) via ruby-core
2025-02-01 16:33 ` [ruby-core:120854] " osyoyu (Daisuke Aritomo) via ruby-core
2025-02-13 9:21 ` [ruby-core:120973] " mame (Yusuke Endoh) via ruby-core
2025-07-24 16:49 ` [ruby-core:122860] [Ruby " osyoyu (Daisuke Aritomo) via ruby-core
2025-07-26 6:21 ` [ruby-core:122867] " osyoyu (Daisuke Aritomo) via ruby-core
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).