summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-06-06 00:13:47 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-06-06 00:13:47 +0000
commit59fb92971fa8e461430c35307a6b9eb0572ed4c5 (patch)
treea638f6239efcd1a57a50a934d861852735834680 /thread.c
parentcb85a5316f1edb5b0bd7d49eb3ad4e2115b52ce8 (diff)
IO#close: do not enqueue redundant interrupts
Enqueuing multiple errors for one event causes spurious errors down the line, as reported by Nikolay Vashchenko in https://bugs.ruby-lang.org/issues/13632 * thread.c (rb_notify_fd_close): do not enqueue multiple interrupts [ruby-core:81581] [Bug #13632] * test/ruby/test_io.rb (test_single_exception_on_close): new test based on script from Nikolay git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59020 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/thread.c b/thread.c
index da834974bd..42159b3c19 100644
--- a/thread.c
+++ b/thread.c
@@ -2213,6 +2213,8 @@ rb_notify_fd_close(int fd)
if (wfd->fd == fd) {
rb_thread_t *th = wfd->th;
VALUE err = th->vm->special_exceptions[ruby_error_stream_closed];
+
+ wfd->fd = -1; /* ensure we only enqueue once */
rb_threadptr_pending_interrupt_enque(th, err);
rb_threadptr_interrupt(th);
busy = 1;