Skip to content

Commit

Permalink
Fix handling of timeout accessing scheduler outside of non-blocking c…
Browse files Browse the repository at this point in the history
…ontext.
  • Loading branch information
ioquatix committed Mar 30, 2021
1 parent af1c587 commit 92449e0
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 1 deletion.
15 changes: 15 additions & 0 deletions cont.c
Original file line number Diff line number Diff line change
Expand Up @@ -1995,6 1995,20 @@ rb_fiber_s_scheduler(VALUE klass)
return rb_fiber_scheduler_get();
}

/*
* call-seq:
* Fiber.current_scheduler -> obj or nil
*
* Returns the Fiber scheduler, that was last set for the current thread with Fiber.set_scheduler
* iff the current fiber is non-blocking.
*
*/
static VALUE
rb_fiber_current_scheduler(VALUE klass)
{
return rb_fiber_scheduler_current();
}

/*
* call-seq:
* Fiber.set_scheduler(scheduler) -> scheduler
Expand Down Expand Up @@ -3084,6 3098,7 @@ Init_Cont(void)
rb_define_singleton_method(rb_cFiber, "blocking?", rb_fiber_s_blocking_p, 0);
rb_define_singleton_method(rb_cFiber, "scheduler", rb_fiber_s_scheduler, 0);
rb_define_singleton_method(rb_cFiber, "set_scheduler", rb_fiber_set_scheduler, 1);
rb_define_singleton_method(rb_cFiber, "current_scheduler", rb_fiber_current_scheduler, 0);

rb_define_singleton_method(rb_cFiber, "schedule", rb_fiber_s_schedule, -1);

Expand Down
2 changes: 1 addition & 1 deletion lib/timeout.rb
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 84,7 @@ def timeout(sec, klass = nil, message = nil, &block) #:yield: sec

message ||= "execution expired".freeze

if (scheduler = Fiber.scheduler)&.respond_to?(:timeout_after)
if (scheduler = Fiber.current_scheduler)&.respond_to?(:timeout_after)
return scheduler.timeout_after(sec, klass || Error, message, &block)
end

Expand Down
16 changes: 16 additions & 0 deletions test/fiber/test_scheduler.rb
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 73,20 @@ def test_optional_close

thread.join
end

def test_current_scheduler
thread = Thread.new do
scheduler = Scheduler.new
Fiber.set_scheduler scheduler

assert Fiber.scheduler
refute Fiber.current_scheduler

Fiber.schedule do
assert Fiber.current_scheduler
end
end

thread.join
end
end
2 changes: 2 additions & 0 deletions test/fiber/test_timeout.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 37,8 @@ def test_timeout_on_main_fiber
scheduler = Scheduler.new
Fiber.set_scheduler scheduler

assert_nil Fiber.current_scheduler

Timeout.timeout(1) do
message = MESSAGE
end
Expand Down

0 comments on commit 92449e0

Please sign in to comment.