summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/-test-/thread_fd_close/depend16
-rw-r--r--ext/-test-/thread_fd_close/extconf.rb2
-rw-r--r--ext/-test-/thread_fd_close/thread_fd_close.c14
-rw-r--r--test/-ext-/thread_fd_close/test_thread_fd_close.rb23
-rw-r--r--thread.c2
5 files changed, 56 insertions, 1 deletions
diff --git a/ext/-test-/thread_fd_close/depend b/ext/-test-/thread_fd_close/depend
new file mode 100644
index 0000000..7bc04c3
--- /dev/null
+++ b/ext/-test-/thread_fd_close/depend
@@ -0,0 +1,16 @@
+# 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
diff --git a/ext/-test-/thread_fd_close/extconf.rb b/ext/-test-/thread_fd_close/extconf.rb
new file mode 100644
index 0000000..0d96945
--- /dev/null
+++ b/ext/-test-/thread_fd_close/extconf.rb
@@ -0,0 +1,2 @@
+# frozen_string_literal: true
+create_makefile('-test-/thread_fd_close')
diff --git a/ext/-test-/thread_fd_close/thread_fd_close.c b/ext/-test-/thread_fd_close/thread_fd_close.c
new file mode 100644
index 0000000..4fd967c
--- /dev/null
+++ b/ext/-test-/thread_fd_close/thread_fd_close.c
@@ -0,0 +1,14 @@
+#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);
+}
diff --git a/test/-ext-/thread_fd_close/test_thread_fd_close.rb b/test/-ext-/thread_fd_close/test_thread_fd_close.rb
new file mode 100644
index 0000000..c83b06d
--- /dev/null
+++ b/test/-ext-/thread_fd_close/test_thread_fd_close.rb
@@ -0,0 +1,23 @@
+# 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
diff --git a/thread.c b/thread.c
index cc6e553..74cdf4f 100644
--- a/thread.c
+++ b/thread.c
@@ -2230,7 +2230,7 @@ rb_notify_fd_close(int fd)
void
rb_thread_fd_close(int fd)
{
- while (rb_notify_fd_close(fd));
+ while (rb_notify_fd_close(fd)) rb_thread_schedule();
}
/*