[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]