I've been experimenting with Ractors since upgrading to Ruby 3.0 for https://github.com/ohler55/ox/issues/275 but quickly ran into Ractor::UnsafeError when trying to call Ox::sax_parse in anything except the main Ractor.
Per Ruby's Ractor C extension documentation (link below):
"By default, all C extensions are recognized as Ractor-unsafe. If C extension becomes Ractor-safe, the extension should call rb_ext_ractor_safe(true) at the Init_ function and all defined method marked as Ractor-safe. Ractor-unsafe C-methods only been called from main-ractor. If non-main ractor calls it, then Ractor::UnsafeError is raised."
I don't like to open seemingly-large feature requests like this without making some attempt at it myself first,
and luckily it seems like Ox::sax_parse Just Works™ since I marked it Ractor-safe, even with the class_cache. Confirming this safety, making any remaining changes to Ox::Sax, and expanding this to the non-Sax parts of Ox are all unfortunately out of my depth as a n00b C coder, so I would appreciate if you could take this over if it interests you. I am happy with just Sax support since I have no current need for marshalling, but I imagine other Ox users wouldn't be satisfied if stratified. I have a PR incoming for this change.
Hello again :)
I've been experimenting with
Ractor
s since upgrading to Ruby 3.0 for https://github.com/ohler55/ox/issues/275 but quickly ran intoRactor::UnsafeError
when trying to callOx::sax_parse
in anything except the mainRactor
.Per Ruby's
Ractor
C extension documentation (link below): "By default, all C extensions are recognized asRactor
-unsafe. If C extension becomesRactor
-safe, the extension should callrb_ext_ractor_safe(true)
at theInit_
function and all defined method marked asRactor
-safe.Ractor
-unsafe C-methods only been called from main-ractor. If non-main ractor calls it, thenRactor::UnsafeError
is raised."I don't like to open seemingly-large feature requests like this without making some attempt at it myself first, and luckily it seems like
Ox::sax_parse
Just Works™ since I marked itRactor
-safe, even with theclass_cache
. Confirming this safety, making any remaining changes toOx::Sax
, and expanding this to the non-Sax
parts ofOx
are all unfortunately out of my depth as a n00b C coder, so I would appreciate if you could take this over if it interests you. I am happy with justSax
support since I have no current need for marshalling, but I imagine otherOx
users wouldn't be satisfied if stratified. I have a PR incoming for this change.Official
Ractor
info:Ractor
documentation: https://docs.ruby-lang.org/en/master/doc/ractor_md.htmlRactor
documention coveringrb_ext_ractor_safe
: https://docs.ruby-lang.org/en/master/doc/extension_rdoc.html#label-Appendix+F.+Ractor+supportRactor
C Extension from the creator ofRactor
that might serve as a useful example: https://github.com/ko1/ractor-tvarBlogs: