[ruby] Backport "ruby: register grpc_rb_sStatus as a global variable (#36125)" to 1.62.x #36508
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Ref: https://bugs.ruby-lang.org/issues/20311
C global variable that contain references to Ruby object MUST be declared to the Ruby GC to prevent these objects from being collected or moved.
There are a few exceptions to that, such as classes defined using the C APIs such as
rb_define_class
etc.Up to Ruby 3.4 however, there was a bug that caused classes created from Ruby with the
Struct.new("Name")
API to also be marked as immortal and immovable.GRPC has been relying on this bug, which I fixed in Ruby 3.4, and now GRPC is crashing when
Struct::Status
is moved around by the GC.cc @apolcyn @peterzhu2118 @k0kubun
Closes #36125
COPYBARA_INTEGRATE_REVIEW=#36125 from Shopify:fix-ruby-3.4-compat 7a12759 PiperOrigin-RevId: 616152904