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

ruby-changes:46915

From: normal <ko1@a...>
Date: Wed, 7 Jun 2017 09:32:08 +0900 (JST)
Subject: [ruby-changes:46915] normal:r59030 (trunk): thread.c: avoid busy looping on rb_thread_fd_close

normal	2017-06-07 09:32:02 +0900 (Wed, 07 Jun 2017)

  New Revision: 59030

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=59030

  Log:
    thread.c: avoid busy looping on rb_thread_fd_close
    
    We no longer use it this function, but extensions do, and
    we need to ensure it continues to work for them.
    
    * thread.c (rb_thread_fd_close): schedule other threads in loop
    * ext/-test-/thread_fd_close/thread_fd_close.c: new file
    * ext/-test-/thread_fd_close/depend: ditto
    * ext/-test-/thread_fd_close/extconf.rb: ditto
    * test/-ext-/thread_fd_close/test_thread_fd_close.rb: new test

  Added directories:
    trunk/ext/-test-/thread_fd_close/
    trunk/test/-ext-/thread_fd_close/
  Added files:
    trunk/ext/-test-/thread_fd_close/depend
    trunk/ext/-test-/thread_fd_close/extconf.rb
    trunk/ext/-test-/thread_fd_close/thread_fd_close.c
    trunk/test/-ext-/thread_fd_close/test_thread_fd_close.rb
  Modified files:
    trunk/thread.c
Index: ext/-test-/thread_fd_close/thread_fd_close.c
===================================================================
--- ext/-test-/thread_fd_close/thread_fd_close.c	(nonexistent)
+++ ext/-test-/thread_fd_close/thread_fd_close.c	(revision 59030)
@@ -0,0 +1,14 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/thread_fd_close/thread_fd_close.c#L1
+#include "ruby/ruby.h"
+
+static VALUE
+thread_fd_close(VALUE ign, VALUE fd)
+{
+    rb_thread_fd_close(NUM2INT(fd));
+    return Qnil;
+}
+
+void
+Init_thread_fd_close(void)
+{
+    rb_define_singleton_method(rb_cIO, "thread_fd_close", thread_fd_close, 1);
+}
Index: ext/-test-/thread_fd_close/extconf.rb
===================================================================
--- ext/-test-/thread_fd_close/extconf.rb	(nonexistent)
+++ ext/-test-/thread_fd_close/extconf.rb	(revision 59030)
@@ -0,0 +1,2 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/thread_fd_close/extconf.rb#L1
+# frozen_string_literal: true
+create_makefile('-test-/thread_fd_close')
Index: ext/-test-/thread_fd_close/depend
===================================================================
--- ext/-test-/thread_fd_close/depend	(nonexistent)
+++ ext/-test-/thread_fd_close/depend	(revision 59030)
@@ -0,0 +1,16 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/thread_fd_close/depend#L1
+# AUTOGENERATED DEPENDENCIES START
+thread_fd_close.o: $(RUBY_EXTCONF_H)
+thread_fd_close.o: $(arch_hdrdir)/ruby/config.h
+thread_fd_close.o: $(hdrdir)/ruby/backward.h
+thread_fd_close.o: $(hdrdir)/ruby/defines.h
+thread_fd_close.o: $(hdrdir)/ruby/encoding.h
+thread_fd_close.o: $(hdrdir)/ruby/intern.h
+thread_fd_close.o: $(hdrdir)/ruby/io.h
+thread_fd_close.o: $(hdrdir)/ruby/missing.h
+thread_fd_close.o: $(hdrdir)/ruby/onigmo.h
+thread_fd_close.o: $(hdrdir)/ruby/oniguruma.h
+thread_fd_close.o: $(hdrdir)/ruby/ruby.h
+thread_fd_close.o: $(hdrdir)/ruby/st.h
+thread_fd_close.o: $(hdrdir)/ruby/subst.h
+thread_fd_close.o: thread_fd_close.c
+# AUTOGENERATED DEPENDENCIES END
Index: test/-ext-/thread_fd_close/test_thread_fd_close.rb
===================================================================
--- test/-ext-/thread_fd_close/test_thread_fd_close.rb	(nonexistent)
+++ test/-ext-/thread_fd_close/test_thread_fd_close.rb	(revision 59030)
@@ -0,0 +1,23 @@ https://github.com/ruby/ruby/blob/trunk/test/-ext-/thread_fd_close/test_thread_fd_close.rb#L1
+# frozen_string_literal: true
+require 'test/unit'
+require '-test-/thread_fd_close'
+require 'io/wait'
+
+class TestThreadFdClose < Test::Unit::TestCase
+
+  def test_thread_fd_close
+    IO.pipe do |r, w|
+      th = Thread.new do
+        begin
+          r.read(4)
+        ensure
+          w.syswrite('done')
+        end
+      end
+      Thread.pass until th.stop?
+      IO.thread_fd_close(r.fileno)
+      assert_equal 'done', r.read(4)
+      assert_raise(IOError) { th.join }
+    end
+  end
+end
Index: thread.c
===================================================================
--- thread.c	(revision 59029)
+++ thread.c	(revision 59030)
@@ -2230,7 +2230,7 @@ rb_notify_fd_close(int fd) https://github.com/ruby/ruby/blob/trunk/thread.c#L2230
 void
 rb_thread_fd_close(int fd)
 {
-    while (rb_notify_fd_close(fd));
+    while (rb_notify_fd_close(fd)) rb_thread_schedule();
 }
 
 /*

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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