From 77934ace593c9bc822f9b106467830ddcc5a7c20 Mon Sep 17 00:00:00 2001 From: Roman Samoilov <2270393+rsamoilov@users.noreply.github.com> Date: Mon, 19 Feb 2024 11:13:29 +0000 Subject: [PATCH] Preload fiber ID It's hard to say what's happening here, but calling `__get_id` to set the variable from the C level and then reading this variable on the Ruby level somehow, sometimes corrupts memory --- lib/rage/fiber.rb | 13 +++++++------ lib/rage/fiber_scheduler.rb | 1 + lib/rage/middleware/fiber_wrapper.rb | 2 +- lib/rage/rspec.rb | 1 + 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/rage/fiber.rb b/lib/rage/fiber.rb index d68f5aa8..d58cf217 100644 --- a/lib/rage/fiber.rb +++ b/lib/rage/fiber.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true class Fiber + # @private AWAIT_ERROR_MESSAGE = "err" # @private @@ -23,14 +24,14 @@ def __get_err @__err end - # @private - def __get_id - @__rage_id ||= object_id.to_s + # @private + def __set_id + @__rage_id = object_id.to_s end - # @private - def __yielded? - !@__rage_id.nil? + # @private + def __get_id + @__rage_id end # @private diff --git a/lib/rage/fiber_scheduler.rb b/lib/rage/fiber_scheduler.rb index 3553e64a..83207218 100644 --- a/lib/rage/fiber_scheduler.rb +++ b/lib/rage/fiber_scheduler.rb @@ -109,6 +109,7 @@ def fiber(&block) fiber = if parent == @root_fiber # the fiber to wrap a request in Fiber.new(blocking: false) do + Fiber.current.__set_id Fiber.current.__set_result(block.call) end else diff --git a/lib/rage/middleware/fiber_wrapper.rb b/lib/rage/middleware/fiber_wrapper.rb index e45ef3e3..2f0c4fed 100644 --- a/lib/rage/middleware/fiber_wrapper.rb +++ b/lib/rage/middleware/fiber_wrapper.rb @@ -17,7 +17,7 @@ def call(env) @app.call(env) ensure # notify Iodine the request can now be resumed - Iodine.publish(Fiber.current.__get_id, "", Iodine::PubSub::PROCESS) if Fiber.current.__yielded? + Iodine.publish(Fiber.current.__get_id, "", Iodine::PubSub::PROCESS) end # the fiber encountered blocking IO and yielded; instruct Iodine to pause the request diff --git a/lib/rage/rspec.rb b/lib/rage/rspec.rb index 8d0656a6..f3acb341 100644 --- a/lib/rage/rspec.rb +++ b/lib/rage/rspec.rb @@ -18,6 +18,7 @@ class Fiber def self.schedule(&block) fiber = Fiber.new(blocking: true) do + Fiber.current.__set_id Fiber.current.__set_result(block.call) end fiber.resume