ruby-changes:19191
From: kosaki <ko1@a...>
Date: Sun, 3 Apr 2011 21:24:05 +0900 (JST)
Subject: [ruby-changes:19191] Ruby:r31230 (trunk): * io.c (io_reopen): IO#close releases GVL if possible.
kosaki 2011-04-03 21:23:59 +0900 (Sun, 03 Apr 2011) New Revision: 31230 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31230 Log: * io.c (io_reopen): IO#close releases GVL if possible. close() may block for certain file types (NFS, SO_LINGER sockets, inotify), so let other threads run. The patch was created by Eric Wong [ruby-core:35555][Bug #4527] * io.c (fptr_finalize): ditto. * io.c (maygvl_fclose): new. * io.c (nogvl_fclose): ditto. * io.c (maygvl_close): ditto. * io.c (nogvl_close): ditto. Modified files: trunk/ChangeLog trunk/io.c Index: ChangeLog =================================================================== --- ChangeLog (revision 31229) +++ ChangeLog (revision 31230) @@ -1,3 +1,17 @@ +Sun Apr 3 21:16:20 2011 KOSAKI Motohiro <kosaki.motohiro@g...> + + * io.c (io_reopen): IO#close releases GVL if possible. + close() may block for certain file types (NFS, SO_LINGER + sockets, inotify), so let other threads run. The patch was + created by Eric Wong [ruby-core:35555][Bug #4527] + + * io.c (fptr_finalize): ditto. + + * io.c (maygvl_fclose): new. + * io.c (nogvl_fclose): ditto. + * io.c (maygvl_close): ditto. + * io.c (nogvl_close): ditto. + Fri Apr 1 22:25:50 2011 Tanaka Akira <akr@f...> * ext/syslog/syslog.c: parenthesize macro arguments. Index: io.c =================================================================== --- io.c (revision 31229) +++ io.c (revision 31230) @@ -3489,6 +3489,45 @@ return finish_writeconv(p->fptr, p->noalloc); } +static VALUE +nogvl_close(void *ptr) +{ + int *fd = ptr; + + return (VALUE)close(*fd); +} + +static int +maygvl_close(int fd, int keepgvl) +{ + if (keepgvl) + return close(fd); + + /* + * close() may block for certain file types (NFS, SO_LINGER sockets, + * inotify), so let other threads run. + */ + return (int)rb_thread_blocking_region(nogvl_close, &fd, RUBY_UBF_IO, 0); +} + +static VALUE +nogvl_fclose(void *ptr) +{ + FILE *file = ptr; + + return (VALUE)fclose(file); +} + +static int +maygvl_fclose(FILE *file, int keepgvl) +{ + if (keepgvl) + return fclose(file); + + return (int)rb_thread_blocking_region(nogvl_fclose, file, RUBY_UBF_IO, 0); +} + + static void fptr_finalize(rb_io_t *fptr, int noraise) { @@ -3520,15 +3559,15 @@ if (fptr->stdio_file) { /* fptr->stdio_file is deallocated anyway * even if fclose failed. */ - if (fclose(fptr->stdio_file) < 0 && NIL_P(err)) + if ((maygvl_fclose(fptr->stdio_file, noraise) < 0) && NIL_P(err)) err = noraise ? Qtrue : INT2NUM(errno); } else if (0 <= fptr->fd) { /* fptr->fd may be closed even if close fails. * POSIX doesn't specify it. * We assumes it is closed. */ - if (close(fptr->fd) < 0 && NIL_P(err)) - err = noraise ? Qtrue : INT2NUM(errno); + if ((maygvl_close(fptr->fd, noraise) < 0) && NIL_P(err)) + err = noraise ? Qtrue : INT2NUM(errno); } skip_fd_close: fptr->fd = -1; @@ -5784,7 +5823,7 @@ rb_sys_fail_path(orig->pathv); } else { - fclose(fptr->stdio_file); + maygvl_fclose(fptr->stdio_file, 0); fptr->stdio_file = 0; fptr->fd = -1; if (dup2(fd2, fd) < 0) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/