From: "luke-gru (Luke Gruber) via ruby-core" Date: 2023-12-22T19:37:02+00:00 Subject: [ruby-core:115873] [Ruby master Bug#20078] StringIO cannot be moved between Ractors Issue #20078 has been updated by luke-gru (Luke Gruber). I think this is due to not currently being able to move any T_DATA objects. StringIO is defined in a C extension and is a T_DATA object internally. See https://github.com/ruby/ruby/blob/master/ractor.c#L3417C1-L3417C13. The problem with T_DATA objects like StringIO is you would have to move their references too (like the actual String that it holds) but it's currently not possible to know that this reference exists because there's no callback function for extensions called strio_moved(), which would move the references. That's why you have to pass strio_mark callbacks when defining a new data type for T_DATA objects, to mark the references manually. Note that you can't just add a new callback function and make it optional, all C extensions with T_DATA objects would have to be changed to add this callback to make moving T_DATA objects work properly. It's not really feasible unless something changes with how T_DATA objects are defined or how their references are kept. The documentation should mention this, without going into too much detail. Something like: Currently, most types that are implemented in C extensions cannot be moved. ---------------------------------------- Bug #20078: StringIO cannot be moved between Ractors https://bugs.ruby-lang.org/issues/20078#change-105830 * Author: forthoney (Seong-Heon Jung) * Status: Open * Priority: Normal * ruby -v: 3.2 * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The following code will raise an unusual Ractor error. ``` ruby require 'stringio' r = Ractor.new { loop { Ractor.receive } } Ractor.shareable?(StringIO.new) #=> false r.send(StringIO.new) # passing it via copy works r.send(StringIO.new, move: true) # :587:in `send': can not move StringIO object. (Ractor::Error) ``` I'm not 100% sure but I believe that this probably not the intended behavior considering * The error raised is a generic `Ractor::Error` rather than something specific like Ractor::MovedError or Ractor::IsolationError * It can be copied * [No documentation](https://docs.ruby-lang.org/en/master/ractor_md.html) exists for this error * I have yet to seen this happen on any other class instance * Typo (can not -> cannot) -- 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/postorius/lists/ruby-core.ml.ruby-lang.org/