From 4c10b36467ba7cbb59128dabd437ef3931c7d0e4 Mon Sep 17 00:00:00 2001 From: kosaki Date: Sun, 9 Sep 2012 17:11:03 +0000 Subject: [PATCH] * io.c (rb_io_close): notify fd close before releasing gvl. * io.c (fptr_finalize): modify fptr->mode before releasing gvl. remove unnecessary rb_thread_fd_close(). [Feature #4570] [ruby-core:35711] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36942 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ io.c | 10 ++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 41d4d7371c..a8f2427857 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mon Sep 10 01:36:00 2012 KOSAKI Motohiro + + * io.c (rb_io_close): notify fd close before releasing gvl. + * io.c (fptr_finalize): modify fptr->mode before releasing gvl. + remove unnecessary rb_thread_fd_close(). + [Feature #4570] [ruby-core:35711] + Mon Sep 10 00:16:34 2012 NARUSE, Yui * process.c: exec() requires to be single threaded also on Haiku. diff --git a/io.c b/io.c index cefa0bf7fc..7be2df383d 100644 --- a/io.c +++ b/io.c @@ -3922,8 +3922,8 @@ fptr_finalize(rb_io_t *fptr, int noraise) fptr->fd = -1; fptr->stdio_file = 0; - if (!noraise) - rb_thread_fd_close(fd); + fptr->mode &= ~(FMODE_READABLE|FMODE_WRITABLE); + if (IS_PREP_STDIO(fptr) || fd <= 2) { /* need to keep FILE objects of stdin, stdout and stderr */ } @@ -3940,7 +3940,6 @@ fptr_finalize(rb_io_t *fptr, int noraise) if ((maygvl_close(fd, noraise) < 0) && NIL_P(err)) err = noraise ? Qtrue : INT2NUM(errno); } - fptr->mode &= ~(FMODE_READABLE|FMODE_WRITABLE); if (!NIL_P(err) && !noraise) { switch(TYPE(err)) { @@ -4052,13 +4051,8 @@ rb_io_close(VALUE io) if (fptr->fd < 0) return Qnil; fd = fptr->fd; -#if defined __APPLE__ && (!defined(MAC_OS_X_VERSION_MIN_ALLOWED) || MAC_OS_X_VERSION_MIN_ALLOWED <= 1050) - /* close(2) on a fd which is being read by another thread causes - * deadlock on Mac OS X 10.5 */ rb_thread_fd_close(fd); -#endif rb_io_fptr_cleanup(fptr, FALSE); - rb_thread_fd_close(fd); if (fptr->pid) { rb_last_status_clear();