
Issue #20078 has been updated by forthoney (Seong-Heon Jung). luke-gru (Luke Gruber) wrote in #note-3:
I think this is due to not currently being able to move any T_DATA objects between ractors. 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. This isn't a fundamental limitation (I don't think?), it's just it hasn't been implemented yet. But certain errors could happen, for example if the C extension allows you to move an object to another Ractor, but then uses this same object internally in the original Ractor, maybe it could cause errors.
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.
I agree. The documentation does mention T_DATA, but does not really mention the implications of being unable to move T_DATA, which is that "most types that are implemented in C extensions cannot be moved". Additionally, I am wondering if it makes sense to make a `Ractor.movable?` module function similar to `Ractor.shareable?` This would greatly save developer time since they can check if a object is movable in IRB rather than having to dig through the source code. ---------------------------------------- Bug #20078: StringIO cannot be moved between Ractors https://bugs.ruby-lang.org/issues/20078#change-105831 * 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) # <internal:ractor>: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/