ruby-changes:9450
From: matz <ko1@a...>
Date: Thu, 25 Dec 2008 15:55:54 +0900 (JST)
Subject: [ruby-changes:9450] Ruby:r20988 (trunk): * io.c (io_fflush): flush write buffer without write lock in
matz 2008-12-25 15:55:38 +0900 (Thu, 25 Dec 2008) New Revision: 20988 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=20988 Log: * io.c (io_fflush): flush write buffer without write lock in finalizers. [ruby-dev:37572] * io.c (rb_io_fptr_finalize): clear write lock before finalizing. Modified files: trunk/ChangeLog trunk/io.c Index: ChangeLog =================================================================== --- ChangeLog (revision 20987) +++ ChangeLog (revision 20988) @@ -1,3 +1,10 @@ +Thu Dec 25 15:54:00 2008 Yukihiro Matsumoto <matz@r...> + + * io.c (io_fflush): flush write buffer without write lock in + finalizers. [ruby-dev:37572] + + * io.c (rb_io_fptr_finalize): clear write lock before finalizing. + Thu Dec 25 15:07:22 2008 Tanaka Akira <akr@f...> * io.c (fptr_finalize): close the IO object even if close(2) is failed. Index: io.c =================================================================== --- io.c (revision 20987) +++ io.c (revision 20988) @@ -558,7 +558,13 @@ retry: if (fptr->wbuf_len == 0) return 0; - r = rb_mutex_synchronize(fptr->write_lock, io_flush_buffer, (VALUE)fptr); + if (fptr->write_lock) { + r = rb_mutex_synchronize(fptr->write_lock, io_flush_buffer, (VALUE)fptr); + } + else { + long l = io_writable_length(fptr, fptr->wbuf_len); + r = rb_write_internal(fptr->fd, fptr->wbuf+fptr->wbuf_off, l); + } /* xxx: Other threads may modify wbuf. * A lock is required, definitely. */ rb_io_check_closed(fptr); @@ -3190,6 +3196,7 @@ { if (!fptr) return 0; fptr->pathv = Qnil; + fptr->write_lock = 0; if (0 <= fptr->fd) rb_io_fptr_cleanup(fptr, Qtrue); if (fptr->rbuf) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/