ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [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).