ruby-changes:68051
From: Samuel <ko1@a...>
Date: Mon, 20 Sep 2021 19:08:08 +0900 (JST)
Subject: [ruby-changes:68051] cb8434563d (master): Add alternative optional hook for `scheduler_close` to allow public usage of close.
https://git.ruby-lang.org/ruby.git/commit/?id=cb8434563d From cb8434563d3cc8fc5c3a5aa1e34ad7a9bb542cdb Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuel.williams@o...> Date: Mon, 19 Jul 2021 10:14:51 +1200 Subject: Add alternative optional hook for `scheduler_close` to allow public usage of close. --- scheduler.c | 12 +++++++++--- test/fiber/scheduler.rb | 18 +++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/scheduler.c b/scheduler.c index ca457b0..cd06e55 100644 --- a/scheduler.c +++ b/scheduler.c @@ -13,6 +13,7 @@ https://github.com/ruby/ruby/blob/trunk/scheduler.c#L13 #include "ruby/io.h" static ID id_close; +static ID id_scheduler_close; static ID id_block; static ID id_unblock; @@ -31,6 +32,7 @@ void https://github.com/ruby/ruby/blob/trunk/scheduler.c#L32 Init_Fiber_Scheduler(void) { id_close = rb_intern_const("close"); + id_scheduler_close = rb_intern_const("scheduler_close"); id_block = rb_intern_const("block"); id_unblock = rb_intern_const("unblock"); @@ -122,9 +124,13 @@ VALUE rb_fiber_scheduler_current_for_thread(VALUE thread) https://github.com/ruby/ruby/blob/trunk/scheduler.c#L124 VALUE rb_fiber_scheduler_close(VALUE scheduler) { - if (rb_respond_to(scheduler, id_close)) { - return rb_funcall(scheduler, id_close, 0); - } + VALUE result; + + result = rb_check_funcall(scheduler, id_scheduler_close, 0, NULL); + if (result != Qundef) return result; + + result = rb_check_funcall(scheduler, id_close, 0, NULL); + if (result != Qundef) return result; return Qnil; } diff --git a/test/fiber/scheduler.rb b/test/fiber/scheduler.rb index 740cad0..8c2fdcb 100644 --- a/test/fiber/scheduler.rb +++ b/test/fiber/scheduler.rb @@ -107,10 +107,22 @@ class Scheduler https://github.com/ruby/ruby/blob/trunk/test/fiber/scheduler.rb#L107 end end - def close + def scheduler_close + close(true) + end + + def close(internal = false) # $stderr.puts [__method__, Fiber.current].inspect - raise "Scheduler already closed!" if @closed + unless internal + if Fiber.scheduler == self + return Fiber.set_scheduler(nil) + end + end + + if @closed + raise "Scheduler already closed!" + end self.run ensure @@ -119,7 +131,7 @@ class Scheduler https://github.com/ruby/ruby/blob/trunk/test/fiber/scheduler.rb#L131 @urgent = nil end - @closed = true + @closed ||= true # We freeze to detect any unintended modifications after the scheduler is closed: self.freeze -- cgit v1.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/