mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Fix handling of timeout accessing scheduler outside of non-blocking context.
This commit is contained in:
parent
af1c587546
commit
92449e0e99
Notes:
git
2021-03-30 14:39:03 +09:00
4 changed files with 34 additions and 1 deletions
15
cont.c
15
cont.c
|
@ -1995,6 +1995,20 @@ rb_fiber_s_scheduler(VALUE klass)
|
||||||
return rb_fiber_scheduler_get();
|
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:
|
* call-seq:
|
||||||
* Fiber.set_scheduler(scheduler) -> scheduler
|
* Fiber.set_scheduler(scheduler) -> scheduler
|
||||||
|
@ -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, "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, "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, "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);
|
rb_define_singleton_method(rb_cFiber, "schedule", rb_fiber_s_schedule, -1);
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ module Timeout
|
||||||
|
|
||||||
message ||= "execution expired".freeze
|
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)
|
return scheduler.timeout_after(sec, klass || Error, message, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -73,4 +73,20 @@ class TestFiberScheduler < Test::Unit::TestCase
|
||||||
|
|
||||||
thread.join
|
thread.join
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -37,6 +37,8 @@ class TestFiberTimeout < Test::Unit::TestCase
|
||||||
scheduler = Scheduler.new
|
scheduler = Scheduler.new
|
||||||
Fiber.set_scheduler scheduler
|
Fiber.set_scheduler scheduler
|
||||||
|
|
||||||
|
assert_nil Fiber.current_scheduler
|
||||||
|
|
||||||
Timeout.timeout(1) do
|
Timeout.timeout(1) do
|
||||||
message = MESSAGE
|
message = MESSAGE
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue