[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]