Project

General

Profile

« Previous | Next » 

Revision 645f7fbd

Added by Eric Wong over 7 years ago

io.c: do not use rb_notify_fd_close close on recycled FD

It is unsafe to release GVL and call rb_notify_fd_close after
close(2) on any given FD. FDs (file descriptor) may be recycled
in other threads immediately after close() to point to a different
file description. Note the distinction between "file description"
and "file descriptor".

th-1 | th-2
-------------------------------+---------------------------------------
io_close_fptr |
rb_notify_fd_close(fd) |
fptr_finalize_flush |
close(fd) |
rb_thread_schedule |
| fd reused (via pipe/open/socket/etc)
rb_notify_fd_close(fd) |
| sees "stream closed" exception
| for DIFFERENT file description

  • thread.c (rb_thread_io_blocking_region): adjust comment for list_del
  • thread.c (rb_notify_fd_close): give busy list to caller
  • thread.c (rb_thread_fd_close): loop on busy list
  • io.c (io_close_fptr): do not call rb_thread_fd_close on invalid FD
  • io.c (io_reopen): use rb_thread_fd_close

Fixes: r57422 ("io.c: close before wait")

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63216 b2dd03c8-39d4-4d8f-98ff-823fe69b080e