diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-06-06 00:13:47 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-06-06 00:13:47 +0000 |
commit | 5c349b14a3860809506ed65a462955d4f4135d5c (patch) | |
tree | a638f6239efcd1a57a50a934d861852735834680 /thread.c | |
parent | b6d320e56617c603104a177a6b2c9ce09eec64b0 (diff) | |
download | ruby-5c349b14a3860809506ed65a462955d4f4135d5c.tar.gz |
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.c | 2 |
1 files changed, 2 insertions, 0 deletions
@@ -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; |