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

ruby-changes:18106

From: yugui <ko1@a...>
Date: Wed, 8 Dec 2010 17:14:58 +0900 (JST)
Subject: [ruby-changes:18106] Ruby:r30127 (ruby_1_9_2): merges r29541,r29607,r29608 and r29611 from trunk into ruby_1_9_2.

yugui	2010-12-08 17:08:55 +0900 (Wed, 08 Dec 2010)

  New Revision: 30127

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30127

  Log:
    merges r29541,r29607,r29608 and r29611 from trunk into ruby_1_9_2.
    --
    * test/ruby/test_io.rb (TestIO#pipe): get rid of deadlock on pipe.
      a patch from Tomoyuki Chikanaga at [ruby-dev:42435].  #3970
    
    * test/ruby/test_io_m17n.rb (TestIO_M17N#pipe): ditto.
    --
    * test/ruby/test_io.rb (TestIO#pipe): need to propagate exceptions
      in read/write thread. fix r29541.
    
    * test/ruby/test_io_m17n.rb (TestIO_M17N#pipe): ditto.
    --
    * ruby/test_io_m17n.rb (TestIO_M17N#pipe): fixed the mistake of previous
      commit.
    --
    * test/ruby/test_io.rb (TestIO#pipe): should close write end of pipe
      before closing read end, to get rid of timing problem.
    
    * test/ruby/test_io_m17n.rb (TestIO_M17N#pipe): ditto.

  Modified files:
    branches/ruby_1_9_2/ChangeLog
    branches/ruby_1_9_2/test/ruby/test_io.rb
    branches/ruby_1_9_2/test/ruby/test_io_m17n.rb
    branches/ruby_1_9_2/version.h

Index: ruby_1_9_2/ChangeLog
===================================================================
--- ruby_1_9_2/ChangeLog	(revision 30126)
+++ ruby_1_9_2/ChangeLog	(revision 30127)
@@ -1,3 +1,24 @@
+Wed Oct 27 18:27:17 2010  NAKAMURA Usaku  <usa@r...>
+
+	* test/ruby/test_io.rb (TestIO#pipe): should close write end of pipe
+	  before closing read end, to get rid of timing problem.
+
+	* test/ruby/test_io_m17n.rb (TestIO_M17N#pipe): ditto.
+
+Wed Oct 27 13:51:25 2010  NAKAMURA Usaku  <usa@r...>
+
+	* test/ruby/test_io.rb (TestIO#pipe): need to propagate exceptions
+	  in read/write thread. fix r29541.
+
+	* test/ruby/test_io_m17n.rb (TestIO_M17N#pipe): ditto.
+
+Thu Oct 21 00:05:45 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* test/ruby/test_io.rb (TestIO#pipe): get rid of deadlock on pipe.
+	  a patch from Tomoyuki Chikanaga at [ruby-dev:42435].  #3970
+
+	* test/ruby/test_io_m17n.rb (TestIO_M17N#pipe): ditto.
+
 Mon Oct 18 10:19:00 2010  NARUSE, Yui  <naruse@r...>
 
 	* lib/net/http.rb (transport_request): @socket may be nil.
Index: ruby_1_9_2/version.h
===================================================================
--- ruby_1_9_2/version.h	(revision 30126)
+++ ruby_1_9_2/version.h	(revision 30127)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.2"
-#define RUBY_PATCHLEVEL 81
+#define RUBY_PATCHLEVEL 82
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 9
 #define RUBY_VERSION_TEENY 1
Index: ruby_1_9_2/test/ruby/test_io_m17n.rb
===================================================================
--- ruby_1_9_2/test/ruby/test_io_m17n.rb	(revision 30126)
+++ ruby_1_9_2/test/ruby/test_io_m17n.rb	(revision 30127)
@@ -19,6 +19,35 @@
     }
   end
 
+  def pipe(*args, wp, rp)
+    re, we = nil, nil
+    r, w = IO.pipe(*args)
+    rt = Thread.new do
+      begin
+        rp.call(r)
+      rescue Exception
+        r.close
+        re = $!
+      end
+    end
+    wt = Thread.new do
+      begin
+        wp.call(w)
+      rescue Exception
+        w.close
+        we = $!
+      end
+    end
+    flunk("timeout") unless wt.join(10) && rt.join(10)
+  ensure
+    w.close unless !w || w.closed?
+    r.close unless !r || r.closed?
+    (wt.kill; wt.join) if wt
+    (rt.kill; rt.join) if rt
+    raise we if we
+    raise re if re
+  end
+
   def with_pipe(*args)
     r, w = IO.pipe(*args)
     begin
@@ -220,54 +249,68 @@
   end
 
   def test_s_pipe_invalid
-    with_pipe("utf-8", "euc-jp", :invalid=>:replace) {|r, w|
-      w << "\x80"
-      w.close
-      assert_equal("?", r.read)
-    }
+    pipe("utf-8", "euc-jp", { :invalid=>:replace },
+        proc do |w|
+          w << "\x80"
+          w.close
+        end,
+        proc do |r|
+          assert_equal("?", r.read)
+        end)
   end
 
   def test_s_pipe_undef
-    with_pipe("utf-8:euc-jp", :undef=>:replace) {|r, w|
-      w << "\ufffd"
-      w.close
-      assert_equal("?", r.read)
-    }
+    pipe("utf-8:euc-jp", { :undef=>:replace },
+         proc do |w|
+           w << "\ufffd"
+           w.close
+         end,
+         proc do |r|
+           assert_equal("?", r.read)
+         end)
   end
 
   def test_s_pipe_undef_replace_string
-    with_pipe("utf-8:euc-jp", :undef=>:replace, :replace=>"X") {|r, w|
-      w << "\ufffd"
-      w.close
-      assert_equal("X", r.read)
-    }
+    pipe("utf-8:euc-jp", { :undef=>:replace, :replace=>"X" },
+         proc do |w|
+           w << "\ufffd"
+           w.close
+         end,
+         proc do |r|
+           assert_equal("X", r.read)
+         end)
   end
 
   def test_dup
-    with_pipe("utf-8:euc-jp") {|r, w|
-      w << "\u3042"
-      w.close
-      r2 = r.dup
-      begin
-        assert_equal("\xA4\xA2".force_encoding("euc-jp"), r2.read)
-      ensure
-        r2.close
-      end
-
-    }
+    pipe("utf-8:euc-jp",
+         proc do |w|
+           w << "\u3042"
+           w.close
+         end,
+         proc do |r|
+           r2 = r.dup
+           begin
+             assert_equal("\xA4\xA2".force_encoding("euc-jp"), r2.read)
+           ensure
+             r2.close
+           end
+         end)
   end
 
   def test_dup_undef
-    with_pipe("utf-8:euc-jp", :undef=>:replace) {|r, w|
-      w << "\uFFFD"
-      w.close
-      r2 = r.dup
-      begin
-        assert_equal("?", r2.read)
-      ensure
-        r2.close
-      end
-    }
+    pipe("utf-8:euc-jp", { :undef=>:replace },
+         proc do |w|
+           w << "\uFFFD"
+           w.close
+         end,
+         proc do |r|
+           r2 = r.dup
+           begin
+             assert_equal("?", r2.read)
+           ensure
+             r2.close
+           end
+         end)
   end
 
   def test_stdin
@@ -331,47 +374,53 @@
   end
 
   def test_pipe_terminator_conversion
-    with_pipe("euc-jp:utf-8") {|r, w|
-      w.write "before \xa2\xa2 after"
-      rs = "\xA2\xA2".encode("utf-8", "euc-jp")
-      w.close
-      timeout(1) {
-        assert_equal("before \xa2\xa2".encode("utf-8", "euc-jp"),
-                     r.gets(rs))
-      }
-    }
+    rs = "\xA2\xA2".encode("utf-8", "euc-jp")
+    pipe("euc-jp:utf-8",
+         proc do |w|
+           w.write "before \xa2\xa2 after"
+           w.close
+         end,
+         proc do |r|
+           timeout(1) {
+             assert_equal("before \xa2\xa2".encode("utf-8", "euc-jp"),
+                          r.gets(rs))
+           }
+         end)
   end
 
   def test_pipe_conversion
-    with_pipe("euc-jp:utf-8") {|r, w|
-      w.write "\xa1\xa1"
-      assert_equal("\xa1\xa1".encode("utf-8", "euc-jp"), r.getc)
-    }
+    pipe("euc-jp:utf-8",
+         proc do |w|
+           w.write "\xa1\xa1"
+         end,
+         proc do |r|
+           assert_equal("\xa1\xa1".encode("utf-8", "euc-jp"), r.getc)
+         end)
   end
 
   def test_pipe_convert_partial_read
-    with_pipe("euc-jp:utf-8") {|r, w|
-      begin
-        t = Thread.new {
-          w.write "\xa1"
-          sleep 0.1
-          w.write "\xa1"
-        }
-        assert_equal("\xa1\xa1".encode("utf-8", "euc-jp"), r.getc)
-      ensure
-        t.join if t
-      end
-    }
+    pipe("euc-jp:utf-8",
+         proc do |w|
+           w.write "\xa1"
+           sleep 0.1
+           w.write "\xa1"
+         end,
+         proc do |r|
+           assert_equal("\xa1\xa1".encode("utf-8", "euc-jp"), r.getc)
+         end)
   end
 
   def test_getc_invalid
-    with_pipe("euc-jp:utf-8") {|r, w|
-      w << "\xa1xyz"
-      w.close
-      err = assert_raise(Encoding::InvalidByteSequenceError) { r.getc }
-      assert_equal("\xA1".force_encoding("ascii-8bit"), err.error_bytes)
-      assert_equal("xyz", r.read(10))
-    }
+    pipe("euc-jp:utf-8",
+         proc do |w|
+           w << "\xa1xyz"
+           w.close
+         end,
+         proc do |r|
+           err = assert_raise(Encoding::InvalidByteSequenceError) { r.getc }
+           assert_equal("\xA1".force_encoding("ascii-8bit"), err.error_bytes)
+           assert_equal("xyz", r.read(10))
+         end)
   end
 
   def test_getc_stateful_conversion
@@ -597,37 +646,47 @@
     utf8 = "\u6666"
     eucjp = "\xb3\xa2".force_encoding("EUC-JP")
 
-    with_pipe {|r,w|
+    pipe(proc do |w|
+      w << utf8
+      w.close
+    end, proc do |r|
       assert_equal(Encoding.default_external, r.external_encoding)
       assert_equal(nil, r.internal_encoding)
-      w << utf8
-      w.close
       s = r.read
       assert_equal(Encoding.default_external, s.encoding)
       assert_str_equal(utf8.dup.force_encoding(Encoding.default_external), s)
-    }
+    end)
 
-    with_pipe("EUC-JP") {|r,w|
-      assert_equal(Encoding::EUC_JP, r.external_encoding)
-      assert_equal(nil, r.internal_encoding)
-      w << eucjp
-      w.close
-      assert_equal(eucjp, r.read)
-    }
+    pipe("EUC-JP",
+         proc do |w|
+           w << eucjp
+           w.close
+         end,
+         proc do |r|
+           assert_equal(Encoding::EUC_JP, r.external_encoding)
+           assert_equal(nil, r.internal_encoding)
+           assert_equal(eucjp, r.read)
+         end)
 
-    with_pipe("UTF-8") {|r,w|
-      w << "a" * 1023 + "\u3042" + "a" * 1022
-      w.close
-      assert_equal(true, r.read.valid_encoding?)
-    }
+    pipe("UTF-8",
+         proc do |w|
+           w << "a" * 1023 + "\u3042" + "a" * 1022
+           w.close
+         end,
+         proc do |r|
+           assert_equal(true, r.read.valid_encoding?)
+         end)
 
-    with_pipe("UTF-8:EUC-JP") {|r,w|
-      assert_equal(Encoding::UTF_8, r.external_encoding)
-      assert_equal(Encoding::EUC_JP, r.internal_encoding)
-      w << utf8
-      w.close
-      assert_equal(eucjp, r.read)
-    }
+    pipe("UTF-8:EUC-JP",
+         proc do |w|
+           w << utf8
+           w.close
+         end,
+         proc do |r|
+           assert_equal(Encoding::UTF_8, r.external_encoding)
+           assert_equal(Encoding::EUC_JP, r.internal_encoding)
+           assert_equal(eucjp, r.read)
+         end)
 
     e = assert_raise(ArgumentError) {with_pipe("UTF-8", "UTF-8".encode("UTF-32BE")) {}}
     assert_match(/invalid name encoding/, e.message)
@@ -635,147 +694,174 @@
     assert_match(/invalid name encoding/, e.message)
 
     ENCS.each {|enc|
-      with_pipe(enc) {|r, w|
-        w << "\xc2\xa1"
-        w.close
-        s = r.getc
-        assert_equal(enc, s.encoding)
-      }
+      pipe(enc,
+           proc do |w|
+             w << "\xc2\xa1"
+             w.close
+           end,
+           proc do |r|
+             s = r.getc
+             assert_equal(enc, s.encoding)
+           end)
     }
 
     ENCS.each {|enc|
       next if enc == Encoding::ASCII_8BIT
       next if enc == Encoding::UTF_8
-      with_pipe("#{enc}:UTF-8") {|r, w|
-        w << "\xc2\xa1"
-        w.close
-        s = r.read
-        assert_equal(Encoding::UTF_8, s.encoding)
-        assert_equal(s.encode("UTF-8"), s)
-      }
+      pipe("#{enc}:UTF-8",
+           proc do |w|
+             w << "\xc2\xa1"
+             w.close
+           end,
+           proc do |r|
+             s = r.read
+             assert_equal(Encoding::UTF_8, s.encoding)
+             assert_equal(s.encode("UTF-8"), s)
+           end)
     }
 
   end
 
   def test_marshal
-    with_pipe("EUC-JP") {|r, w|
-      data = 56225
-      Marshal.dump(data, w)
-      w.close
-      result = nil
-      assert_nothing_raised("[ruby-dev:33264]") { result = Marshal.load(r) }
-      assert_equal(data, result)
-    }
+    data = 56225
+    pipe("EUC-JP",
+         proc do |w|
+           Marshal.dump(data, w)
+           w.close
+         end,
+         proc do |r|
+           result = nil
+           assert_nothing_raised("[ruby-dev:33264]") { result = Marshal.load(r) }
+           assert_equal(data, result)
+         end)
   end
 
   def test_gets_nil
-    with_pipe("UTF-8:EUC-JP") {|r, w|
-      w << "\u{3042}"
-      w.close
-      result = r.gets(nil)
-      assert_equal("\u{3042}".encode("euc-jp"), result)
-    }
+    pipe("UTF-8:EUC-JP",
+         proc do |w|
+           w << "\u{3042}"
+           w.close
+         end,
+         proc do |r|
+           result = r.gets(nil)
+           assert_equal("\u{3042}".encode("euc-jp"), result)
+         end)
   end
 
   def test_gets_limit
-    with_pipe("euc-jp") {|r, w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close
-      assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.gets(1))
-    }
-    with_pipe("euc-jp") {|r, w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close
-      assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.gets(2))
-    }
-    with_pipe("euc-jp") {|r, w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close
-      assert_equal("\xa4\xa2\xa4\xa4".force_encoding("euc-jp"), r.gets(3))
-    }
-    with_pipe("euc-jp") {|r, w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close
-      assert_equal("\xa4\xa2\xa4\xa4".force_encoding("euc-jp"), r.gets(4))
-    }
-    with_pipe("euc-jp") {|r, w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close
-      assert_equal("\xa4\xa2\xa4\xa4\xa4\xa6".force_encoding("euc-jp"), r.gets(5))
-    }
-    with_pipe("euc-jp") {|r, w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close
-      assert_equal("\xa4\xa2\xa4\xa4\xa4\xa6".force_encoding("euc-jp"), r.gets(6))
-    }
-    with_pipe("euc-jp") {|r, w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close
-      assert_equal("\xa4\xa2\xa4\xa4\xa4\xa6\n".force_encoding("euc-jp"), r.gets(7))
-    }
-    with_pipe("euc-jp") {|r, w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close
-      assert_equal("\xa4\xa2\xa4\xa4\xa4\xa6\n".force_encoding("euc-jp"), r.gets(8))
-    }
-    with_pipe("euc-jp") {|r, w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close
-      assert_equal("\xa4\xa2\xa4\xa4\xa4\xa6\n".force_encoding("euc-jp"), r.gets(9))
-    }
+    pipe("euc-jp",
+         proc {|w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close },
+         proc {|r| assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.gets(1)) })
+    pipe("euc-jp",
+         proc {|w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close },
+         proc {|r| assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.gets(2)) })
+    pipe("euc-jp",
+         proc {|w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close },
+         proc {|r| assert_equal("\xa4\xa2\xa4\xa4".force_encoding("euc-jp"), r.gets(3)) })
+    pipe("euc-jp",
+         proc {|w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close },
+         proc {|r| assert_equal("\xa4\xa2\xa4\xa4".force_encoding("euc-jp"), r.gets(4)) })
+    pipe("euc-jp",
+         proc {|w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close },
+         proc {|r| assert_equal("\xa4\xa2\xa4\xa4\xa4\xa6".force_encoding("euc-jp"), r.gets(5)) })
+    pipe("euc-jp",
+         proc {|w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close },
+         proc {|r| assert_equal("\xa4\xa2\xa4\xa4\xa4\xa6".force_encoding("euc-jp"), r.gets(6)) })
+    pipe("euc-jp",
+         proc {|w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close },
+         proc {|r| assert_equal("\xa4\xa2\xa4\xa4\xa4\xa6\n".force_encoding("euc-jp"), r.gets(7)) })
+    pipe("euc-jp",
+         proc {|w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close },
+         proc {|r| assert_equal("\xa4\xa2\xa4\xa4\xa4\xa6\n".force_encoding("euc-jp"), r.gets(8)) })
+    pipe("euc-jp",
+         proc {|w| w << "\xa4\xa2\xa4\xa4\xa4\xa6\n\xa4\xa8\xa4\xaa"; w.close },
+         proc {|r| assert_equal("\xa4\xa2\xa4\xa4\xa4\xa6\n".force_encoding("euc-jp"), r.gets(9)) })
   end
 
   def test_gets_invalid
-    with_pipe("utf-8:euc-jp") {|r, w|
-      before = "\u{3042}\u{3044}"
-      invalid = "\x80".force_encoding("utf-8")
-      after = "\u{3046}\u{3048}"
-      w << before + invalid + after
-      w.close
-      err = assert_raise(Encoding::InvalidByteSequenceError) { r.gets }
-      assert_equal(invalid.force_encoding("ascii-8bit"), err.error_bytes)
-      assert_equal(after.encode("euc-jp"), r.gets)
-    }
+    before = "\u{3042}\u{3044}"
+    invalid = "\x80".force_encoding("utf-8")
+    after = "\u{3046}\u{3048}"
+    pipe("utf-8:euc-jp",
+         proc do |w|
+           w << before + invalid + after
+           w.close
+         end,
+         proc do |r|
+           err = assert_raise(Encoding::InvalidByteSequenceError) { r.gets }
+           assert_equal(invalid.force_encoding("ascii-8bit"), err.error_bytes)
+           assert_equal(after.encode("euc-jp"), r.gets)
+         end)
   end
 
   def test_getc_invalid2
-    with_pipe("utf-8:euc-jp") {|r, w|
-      before1 = "\u{3042}"
-      before2 = "\u{3044}"
-      invalid = "\x80".force_encoding("utf-8")
-      after1 = "\u{3046}"
-      after2 = "\u{3048}"
-      w << before1 + before2 + invalid + after1 + after2
-      w.close
-      assert_equal(before1.encode("euc-jp"), r.getc)
-      assert_equal(before2.encode("euc-jp"), r.getc)
-      err = assert_raise(Encoding::InvalidByteSequenceError) { r.getc }
-      assert_equal(invalid.force_encoding("ascii-8bit"), err.error_bytes)
-      assert_equal(after1.encode("euc-jp"), r.getc)
-      assert_equal(after2.encode("euc-jp"), r.getc)
-    }
+    before1 = "\u{3042}"
+    before2 = "\u{3044}"
+    invalid = "\x80".force_encoding("utf-8")
+    after1 = "\u{3046}"
+    after2 = "\u{3048}"
+    pipe("utf-8:euc-jp",
+         proc do |w|
+           w << before1 + before2 + invalid + after1 + after2
+           w.close
+         end,
+         proc do |r|
+           assert_equal(before1.encode("euc-jp"), r.getc)
+           assert_equal(before2.encode("euc-jp"), r.getc)
+           err = assert_raise(Encoding::InvalidByteSequenceError) { r.getc }
+           assert_equal(invalid.force_encoding("ascii-8bit"), err.error_bytes)
+           assert_equal(after1.encode("euc-jp"), r.getc)
+           assert_equal(after2.encode("euc-jp"), r.getc)
+         end)
   end
 
   def test_getc_invalid3
-    with_pipe("utf-16le:euc-jp", binmode: true) {|r, w|
-      before1 = "\x42\x30".force_encoding("utf-16le")
-      before2 = "\x44\x30".force_encoding("utf-16le")
-      invalid = "\x00\xd8".force_encoding("utf-16le")
-      after1 = "\x46\x30".force_encoding("utf-16le")
-      after2 = "\x48\x30".force_encoding("utf-16le")
-      w << before1 + before2 + invalid + after1 + after2
-      w.close
-      assert_equal(before1.encode("euc-jp"), r.getc)
-      assert_equal(before2.encode("euc-jp"), r.getc)
-      err = assert_raise(Encoding::InvalidByteSequenceError) { r.getc }
-      assert_equal(invalid.force_encoding("ascii-8bit"), err.error_bytes)
-      assert_equal(after1.encode("euc-jp"), r.getc)
-      assert_equal(after2.encode("euc-jp"), r.getc)
-    }
+    before1 = "\x42\x30".force_encoding("utf-16le")
+    before2 = "\x44\x30".force_encoding("utf-16le")
+    invalid = "\x00\xd8".force_encoding("utf-16le")
+    after1 = "\x46\x30".force_encoding("utf-16le")
+    after2 = "\x48\x30".force_encoding("utf-16le")
+    pipe("utf-16le:euc-jp", { :binmode => true },
+         proc do |w|
+           w << before1 + before2 + invalid + after1 + after2
+           w.close
+         end,
+         proc do |r|
+           assert_equal(before1.encode("euc-jp"), r.getc)
+           assert_equal(before2.encode("euc-jp"), r.getc)
+           err = assert_raise(Encoding::InvalidByteSequenceError) { r.getc }
+           assert_equal(invalid.force_encoding("ascii-8bit"), err.error_bytes)
+           assert_equal(after1.encode("euc-jp"), r.getc)
+           assert_equal(after2.encode("euc-jp"), r.getc)
+         end)
   end
 
   def test_read_all
-    with_pipe("utf-8:euc-jp") {|r, w|
-      str = "\u3042\u3044"
-      w << str
-      w.close
-      assert_equal(str.encode("euc-jp"), r.read)
-    }
+    str = "\u3042\u3044"
+    pipe("utf-8:euc-jp",
+         proc do |w|
+           w << str
+           w.close
+         end,
+         proc do |r|
+           assert_equal(str.encode("euc-jp"), r.read)
+         end)
   end
 
   def test_read_all_invalid
-    with_pipe("utf-8:euc-jp") {|r, w|
-      before = "\u{3042}\u{3044}"
-      invalid = "\x80".force_encoding("utf-8")
-      after = "\u{3046}\u{3048}"
-      w << before + invalid + after
-      w.close
-      err = assert_raise(Encoding::InvalidByteSequenceError) { r.read }
-      assert_equal(invalid.force_encoding("ascii-8bit"), err.error_bytes)
-      assert_equal(after.encode("euc-jp"), r.read)
-    }
+    before = "\u{3042}\u{3044}"
+    invalid = "\x80".force_encoding("utf-8")
+    after = "\u{3046}\u{3048}"
+    pipe("utf-8:euc-jp",
+      proc do |w|
+        w << before + invalid + after
+        w.close
+      end,
+      proc do |r|
+        err = assert_raise(Encoding::InvalidByteSequenceError) { r.read }
+        assert_equal(invalid.force_encoding("ascii-8bit"), err.error_bytes)
+        assert_equal(after.encode("euc-jp"), r.read)
+      end)
   end
 
   def test_file_foreach
@@ -788,84 +874,104 @@
   end
 
   def test_set_encoding
-    with_pipe("utf-8:euc-jp") {|r, w|
-      s = "\u3042".force_encoding("ascii-8bit")
-      s << "\x82\xa0".force_encoding("ascii-8bit")
-      w << s
-      w.close
-      assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
-      r.set_encoding("shift_jis:euc-jp")
-      assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
-    }
+    pipe("utf-8:euc-jp",
+         proc do |w|
+           s = "\u3042".force_encoding("ascii-8bit")
+           s << "\x82\xa0".force_encoding("ascii-8bit")
+           w << s
+           w.close
+         end,
+         proc do |r|
+           assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
+           r.set_encoding("shift_jis:euc-jp")
+           assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
+         end)
   end
 
   def test_set_encoding2
-    with_pipe("utf-8:euc-jp") {|r, w|
-      s = "\u3042".force_encoding("ascii-8bit")
-      s << "\x82\xa0".force_encoding("ascii-8bit")
-      w << s
-      w.close
-      assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
-      r.set_encoding("shift_jis", "euc-jp")
-      assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
-    }
+    pipe("utf-8:euc-jp",
+         proc do |w|
+           s = "\u3042".force_encoding("ascii-8bit")
+           s << "\x82\xa0".force_encoding("ascii-8bit")
+           w << s
+           w.close
+         end,
+         proc do |r|
+           assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
+           r.set_encoding("shift_jis", "euc-jp")
+           assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
+         end)
   end
 
   def test_set_encoding_nil
-    with_pipe("utf-8:euc-jp") {|r, w|
-      s = "\u3042".force_encoding("ascii-8bit")
-      s << "\x82\xa0".force_encoding("ascii-8bit")
-      w << s
-      w.close
-      assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
-      r.set_encoding(nil)
-      assert_equal("\x82\xa0".force_encoding(Encoding.default_external), r.read)
-    }
+    pipe("utf-8:euc-jp",
+         proc do |w|
+           s = "\u3042".force_encoding("ascii-8bit")
+           s << "\x82\xa0".force_encoding("ascii-8bit")
+           w << s
+           w.close
+         end,
+         proc do |r|
+           assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
+           r.set_encoding(nil)
+           assert_equal("\x82\xa0".force_encoding(Encoding.default_external), r.read)
+         end)
   end
 
   def test_set_encoding_enc
-    with_pipe("utf-8:euc-jp") {|r, w|
-      s = "\u3042".force_encoding("ascii-8bit")
-      s << "\x82\xa0".force_encoding("ascii-8bit")
-      w << s
-      w.close
-      assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
-      r.set_encoding(Encoding::Shift_JIS)
-      assert_equal("\x82\xa0".force_encoding(Encoding::Shift_JIS), r.getc)
-    }
+    pipe("utf-8:euc-jp",
+         proc do |w|
+           s = "\u3042".force_encoding("ascii-8bit")
+           s << "\x82\xa0".force_encoding("ascii-8bit")
+           w << s
+           w.close
+         end,
+         proc do |r|
+           assert_equal("\xa4\xa2".force_encoding("euc-jp"), r.getc)
+           r.set_encoding(Encoding::Shift_JIS)
+           assert_equal("\x82\xa0".force_encoding(Encoding::Shift_JIS), r.getc)
+         end)
   end
 
   def test_set_encoding_invalid
-    with_pipe {|r, w|
-      w << "\x80"
-      w.close
-      r.set_encoding("utf-8:euc-jp", :invalid=>:replace)
-      assert_equal("?", r.read)
-    }
+    pipe(proc do |w|
+           w << "\x80"
+           w.close
+         end,
+         proc do |r|
+           r.set_encoding("utf-8:euc-jp", :invalid=>:replace)
+           assert_equal("?", r.read)
+         end)
   end
 
   def test_set_encoding_undef
-    with_pipe {|r, w|
-      w << "\ufffd"
-      w.close
-      r.set_encoding("utf-8", "euc-jp", :undef=>:replace)
-      assert_equal("?", r.read)
-    }
+    pipe(proc do |w|
+           w << "\ufffd"
+           w.close
+         end,
+         proc do |r|
+           r.set_encoding("utf-8", "euc-jp", :undef=>:replace)
+           assert_equal("?", r.read)
+         end)
   end
 
   def test_set_encoding_undef_replace
-    with_pipe {|r, w|
-      w << "\ufffd"
-      w.close
-      r.set_encoding("utf-8", "euc-jp", :undef=>:replace, :replace=>"ZZZ")
-      assert_equal("ZZZ", r.read)
-    }
-    with_pipe {|r, w|
-      w << "\ufffd"
-      w.close
-      r.set_encoding("utf-8:euc-jp", :undef=>:replace, :replace=>"ZZZ")
-      assert_equal("ZZZ", r.read)
-    }
+    pipe(proc do |w|
+           w << "\ufffd"
+           w.close
+         end,
+         proc do |r|
+           r.set_encoding("utf-8", "euc-jp", :undef=>:replace, :replace=>"ZZZ")
+           assert_equal("ZZZ", r.read)
+         end)
+    pipe(proc do |w|
+           w << "\ufffd"
+           w.close
+         end,
+         proc do |r|
+           r.set_encoding("utf-8:euc-jp", :undef=>:replace, :replace=>"ZZZ")
+           assert_equal("ZZZ", r.read)
+         end)
   end
 
   def test_set_encoding_binmode
@@ -899,56 +1005,67 @@
   end
 
   def test_write_conversion_fixenc
-    with_pipe {|r, w|
-      w.set_encoding("iso-2022-jp:utf-8")
-      t = Thread.new { r.read.force_encoding("ascii-8bit") }
-      w << "\u3042"
-      w << "\u3044"
-      w.close
-      assert_equal("\e$B$\"$$\e(B".force_encoding("ascii-8bit"), t.value)
-    }
+    pipe(proc do |w|
+           w.set_encoding("iso-2022-jp:utf-8")
+             w << "\u3042"
+             w << "\u3044"
+             w.close
+         end,
+         proc do |r|
+           assert_equal("\e$B$\"$$\e(B".force_encoding("ascii-8bit"),
+                        r.read.force_encoding("ascii-8bit"))
+         end)
   end
 
   def test_write_conversion_anyenc_stateful
-    with_pipe {|r, w|
-      w.set_encoding("iso-2022-jp")
-      t = Thread.new { r.read.force_encoding("ascii-8bit") }
-      w << "\u3042"
-      w << "\x82\xa2".force_encoding("sjis")
-      w.close
-      assert_equal("\e$B$\"$$\e(B".force_encoding("ascii-8bit"), t.value)
-    }
+    pipe(proc do |w|
+           w.set_encoding("iso-2022-jp")
+           w << "\u3042"
+           w << "\x82\xa2".force_encoding("sjis")
+           w.close
+         end,
+         proc do |r|
+           assert_equal("\e$B$\"$$\e(B".force_encoding("ascii-8bit"),
+                        r.read.force_encoding("ascii-8bit"))
+         end)
   end
 
   def test_write_conversion_anyenc_stateless
-    with_pipe {|r, w|
-      w.set_encoding("euc-jp")
-      t = Thread.new { r.read.force_encoding("ascii-8bit") }
-      w << "\u3042"
-      w << "\x82\xa2".force_encoding("sjis")
-      w.close
-      assert_equal("\xa4\xa2\xa4\xa4".force_encoding("ascii-8bit"), t.value)
-    }
+    pipe(proc do |w|
+           w.set_encoding("euc-jp")
+           w << "\u3042"
+           w << "\x82\xa2".force_encoding("sjis")
+           w.close
+         end,
+         proc do |r|
+           assert_equal("\xa4\xa2\xa4\xa4".force_encoding("ascii-8bit"),
+                        r.read.force_encoding("ascii-8bit"))
+         end)
   end
 
   def test_write_conversion_anyenc_stateful_nosync
-    with_pipe {|r, w|
-      w.sync = false
-      w.set_encoding("iso-2022-jp")
-      t = Thread.new { r.read.force_encoding("ascii-8bit") }
-      w << "\u3042"
-      w << "\x82\xa2".force_encoding("sjis")
-      w.close
-      assert_equal("\e$B$\"$$\e(B".force_encoding("ascii-8bit"), t.value)
-    }
+    pipe(proc do |w|
+           w.sync = false
+           w.set_encoding("iso-2022-jp")
+           w << "\u3042"
+           w << "\x82\xa2".force_encoding("sjis")
+           w.close
+         end,
+         proc do |r|
+           assert_equal("\e$B$\"$$\e(B".force_encoding("ascii-8bit"),
+                        r.read.force_encoding("ascii-8bit"))
+         end)
   end
 
   def test_read_stateful
-    with_pipe("euc-jp:iso-2022-jp") {|r, w|
-      w << "\xA4\xA2"
-      w.close
-      assert_equal("\e$B$\"\e(B".force_encoding("iso-2022-jp"), r.read)
-    }
+    pipe("euc-jp:iso-2022-jp",
+         proc do |w|
+           w << "\xA4\xA2"
+           w.close
+         end,
+         proc do |r|
+           assert_equal("\e$B$\"\e(B".force_encoding("iso-2022-jp"), r.read)
+         end)
   end
 
   def test_stdin_external_encoding_with_reopen
@@ -1804,30 +1921,39 @@
   end
 
   def test_cbuf_select
-    with_pipe("US-ASCII:UTF-8", :universal_newline => true) do |r, w|
-      w << "\r\n"
-      r.ungetc(r.getc)
-      assert_equal([[r],[],[]], IO.select([r], nil, nil, 1))
-    end
+    pipe("US-ASCII:UTF-8", { :universal_newline => true },
+         proc do |w|
+           w << "\r\n"
+         end,
+         proc do |r|
+           r.ungetc(r.getc)
+           assert_equal([[r],[],[]], IO.select([r], nil, nil, 1))
+         end)
   end
 
   def test_textmode_paragraphmode
-    with_pipe("US-ASCII:UTF-8", :universal_newline => true) do |r, w|
-      w << "a\n\n\nc".gsub(/\n/, "\r\n")
-      w.close
-      assert_equal("a\n\n", r.gets(""))
-      assert_equal("c", r.gets(""), "[ruby-core:23723] (18)")
-    end
+    pipe("US-ASCII:UTF-8", { :universal_newline => true },
+         proc do |w|
+           w << "a\n\n\nc".gsub(/\n/, "\r\n")
+           w.close
+         end,
+         proc do |r|
+           assert_equal("a\n\n", r.gets(""))
+           assert_equal("c", r.gets(""), "[ruby-core:23723] (18)")
+         end)
   end
 
   def test_textmode_paragraph_binaryread
-    with_pipe("US-ASCII:UTF-8", :universal_newline => true) do |r, w|
-      w << "a\n\n\ncdefgh".gsub(/\n/, "\r\n")
-      w.close
-      assert_equal("a\n\n", r.gets(""))
-      assert_equal("c", r.getc)
-      assert_equal("defgh", r.readpartial(10))
-    end
+    pipe("US-ASCII:UTF-8", { :universal_newline => true },
+         proc do |w|
+           w << "a\n\n\ncdefgh".gsub(/\n/, "\r\n")
+           w.close
+         end,
+         proc do |r|
+           assert_equal("a\n\n", r.gets(""))
+           assert_equal("c", r.getc)
+           assert_equal("defgh", r.readpartial(10))
+         end)
   end
 
   def test_textmode_paragraph_nonasciicompat
@@ -1837,9 +1963,10 @@
      Encoding::UTF_16BE, Encoding::UTF_16LE,
      Encoding::UTF_8].each do |e|
       r.set_encoding(Encoding::US_ASCII, e)
-      w.print(bug3534[0], "\n\n\n\n", bug3534[1], "\n")
+      wthr = Thread.new{ w.print(bug3534[0], "\n\n\n\n", bug3534[1], "\n") }
       assert_equal((bug3534[0]+"\n\n").encode(e), r.gets(""), bug3534[0])
       assert_equal((bug3534[1]+"\n").encode(e), r.gets(), bug3534[1])
+      wthr.join
     end
   end
 
@@ -1852,28 +1979,33 @@
      Encoding::UTF_16BE, Encoding::UTF_16LE,
      Encoding::UTF_8].each do |e|
       r.set_encoding(Encoding::US_ASCII, e)
-      w.print(bug3534[0], "\n\n\n\n", bug3534[1], "\n")
+      wthr = Thread.new{ w.print(bug3534[0], "\n\n\n\n", bug3534[1], "\n") }
       assert_equal((bug3534[0]+"\n\n").encode(e), r.gets(""), bug3534[0])
       assert_equal((bug3534[1]+"\n").encode(e), r.gets(), bug3534[1])
+      wthr.join
     end
   end
 
   def test_puts_widechar
     bug = '[ruby-dev:42212]'
-    r, w = IO.pipe(Encoding::ASCII_8BIT)
-    r.binmode
-    w.binmode
-    w.puts(0x010a.chr(Encoding::UTF_32BE))
-    w.puts(0x010a.chr(Encoding::UTF_16BE))
-    w.puts(0x0a010000.chr(Encoding::UTF_32LE))
-    w.puts(0x0a01.chr(Encoding::UTF_16LE))
-    w.close
-    assert_equal("\x00\x00\x01\x0a\n", r.read(5), bug)
-    assert_equal("\x01\x0a\n", r.read(3), bug)
-    assert_equal("\x00\x00\x01\x0a\n", r.read(5), bug)
-    assert_equal("\x01\x0a\n", r.read(3), bug)
-    assert_equal("", r.read, bug)
-    r.close
+    pipe(Encoding::ASCII_8BIT,
+         proc do |w|
+           w.binmode
+           w.puts(0x010a.chr(Encoding::UTF_32BE))
+           w.puts(0x010a.chr(Encoding::UTF_16BE))
+           w.puts(0x0a010000.chr(Encoding::UTF_32LE))
+           w.puts(0x0a01.chr(Encoding::UTF_16LE))
+           w.close
+         end,
+         proc do |r|
+           r.binmode
+           assert_equal("\x00\x00\x01\x0a\n", r.read(5), bug)
+           assert_equal("\x01\x0a\n", r.read(3), bug)
+           assert_equal("\x00\x00\x01\x0a\n", r.read(5), bug)
+           assert_equal("\x01\x0a\n", r.read(3), bug)
+           assert_equal("", r.read, bug)
+           r.close
+         end)
   end
 end
 
Index: ruby_1_9_2/test/ruby/test_io.rb
===================================================================
--- ruby_1_9_2/test/ruby/test_io.rb	(revision 30126)
+++ ruby_1_9_2/test/ruby/test_io.rb	(revision 30127)
@@ -22,14 +22,76 @@
     IO.method_defined?("nonblock=")
   end
 
+  def pipe(wp, rp)
+    re, we = nil, nil
+    r, w = IO.pipe
+    rt = Thread.new do
+      begin
+        rp.call(r)
+      rescue Exception
+        r.close
+        re = $!
+      end
+    end
+    wt = Thread.new do
+      begin
+        wp.call(w)
+      rescue Exception
+        w.close
+        we = $!
+      end
+    end
+    flunk("timeout") unless wt.join(10) && rt.join(10)
+  ensure
+    w.close unless !w || w.closed?
+    r.close unless !r || r.closed?
+    (wt.kill; wt.join) if wt
+    (rt.kill; rt.join) if rt
+    raise we if we
+    raise re if re
+  end
+
+  def with_pipe
+    r, w = IO.pipe
+    begin
+      yield r, w
+    ensure
+      r.close unless r.closed?
+      w.close unless w.closed?
+    end
+  end
+
+  def with_read_pipe(content)
+    pipe(proc do |w|
+      w << content
+      w.close
+    end, proc do |r|
+      yield r
+    end)
+  end
+
+  def mkcdtmpdir
+    Dir.mktmpdir {|d|
+      Dir.chdir(d) {
+        yield
+      }
+    }
+  end
+
   def test_pipe
     r, w = IO.pipe
     assert_instance_of(IO, r)
     assert_instance_of(IO, w)
-    w.print "abc"
-    w.close
-    assert_equal("abc", r.read)
-    r.close
+    [
+      Thread.start{
+        w.print "abc"
+        w.close
+      },
+      Thread.start{
+        assert_equal("abc", r.read)
+        r.close
+      }
+    ].each{|thr| thr.join}
   end
 
   def test_pipe_block
@@ -38,9 +100,15 @@
       x = [r,w]
       assert_instance_of(IO, r)
       assert_instance_of(IO, w)
-      w.print "abc"
-      w.close
-      assert_equal("abc", r.read)
+      [
+        Thread.start do
+          w.print "abc"
+          w.close
+        end,
+        Thread.start do
+          assert_equal("abc", r.read)
+        end
+      ].each{|thr| thr.join}
       assert(!r.closed?)
       assert(w.closed?)
       :foooo
@@ -65,58 +133,66 @@
 
   def test_gets_rs
     # default_rs
-    r, w = IO.pipe
-    w.print "aaa\nbbb\n"
-    w.close
-    assert_equal "aaa\n", r.gets
-    assert_equal "bbb\n", r.gets
-    assert_nil r.gets
-    r.close
+    pipe(proc do |w|
+      w.print "aaa\nbbb\n"
+      w.close
+    end, proc do |r|
+      assert_equal "aaa\n", r.gets
+      assert_equal "bbb\n", r.gets
+      assert_nil r.gets
+      r.close
+    end)
 
     # nil
-    r, w = IO.pipe
-    w.print "a\n\nb\n\n"
-    w.close
-    assert_equal "a\n\nb\n\n", r.gets(nil)
-    assert_nil r.gets("")
-    r.close
+    pipe(proc do |w|
+      w.print "a\n\nb\n\n"
+      w.close
+    end, proc do |r|
+      assert_equal "a\n\nb\n\n", r.gets(nil)
+      assert_nil r.gets("")
+      r.close
+    end)
 
     # "\377"
-    r, w = IO.pipe('ascii-8bit')
-    w.print "\377xyz"
-    w.close
-    r.binmode
-    assert_equal("\377", r.gets("\377"), "[ruby-dev:24460]")
-    r.close
+    pipe(proc do |w|
+      w.print "\377xyz"
+      w.close
+    end, proc do |r|
+      r.binmode
+      assert_equal("\377", r.gets("\377"), "[ruby-dev:24460]")
+      r.close
+    end)
 
     # ""
-    r, w = IO.pipe
-    w.print "a\n\nb\n\n"
-    w.close
-    assert_equal "a\n\n", r.gets(""), "[ruby-core:03771]"
-    assert_equal "b\n\n", r.gets("")
-    assert_nil r.gets("")
-    r.close
+    pipe(proc do |w|
+      w.print "a\n\nb\n\n"
+      w.close
+    end, proc do |r|
+      assert_equal "a\n\n", r.gets(""), "[ruby-core:03771]"
+      assert_equal "b\n\n", r.gets("")
+      assert_nil r.gets("")
+      r.close
+    end)
   end
 
   def test_gets_limit_extra_arg
-    with_pipe {|r, w|
-      r, w = IO.pipe
+    pipe(proc do |w|
       w << "0123456789\n0123456789"
       w.close
+    end, proc do |r|
       assert_equal("0123456789\n0", r.gets(nil, 12))
       assert_raise(TypeError) { r.gets(3,nil) }
-    }
+    end)
   end
 
   # This test cause SEGV.
   def test_ungetc
-    r, w = IO.pipe
-    w.close
-    s = "a" * 1000
-    assert_raise(IOError, "[ruby-dev:31650]") { 200.times { r.ungetc s } }
-  ensure
-    r.close
+    pipe(proc do |w|
+      w.close
+    end, proc do |r|
+      s = "a" * 1000
+      assert_raise(IOError, "[ruby-dev:31650]") { 200.times { r.ungetc s } }
+    end)
   end
 
   def test_ungetbyte
@@ -142,13 +218,13 @@
   end
 
   def test_each_byte
-    r, w = IO.pipe
-    w << "abc def"
-    w.close
-    r.each_byte {|byte| break if byte == 32 }
-    assert_equal("def", r.read, "[ruby-dev:31659]")
-  ensure
-    r.close
+    pipe(proc do |w|
+      w << "abc def"
+      w.close
+    end, proc do |r|
+      r.each_byte {|byte| break if byte == 32 }
+      assert_equal("def", r.read, "[ruby-dev:31659]")
+    end)
   end
 
   def test_each_codepoint
@@ -170,35 +246,6 @@
     end
   end
 
-  def with_pipe
-    r, w = IO.pipe
-    begin
-      yield r, w
-    ensure
-      r.close unless r.closed?
-      w.close unless w.closed?
-    end
-  end
-
-  def with_read_pipe(content)
-    r, w = IO.pipe
-    w << content
-    w.close
-    begin
-      yield r
-    ensure
-      r.close
-    end
-  end
-
-  def mkcdtmpdir
-    Dir.mktmpdir {|d|
-      Dir.chdir(d) {
-        yield
-      }
-    }
-  end
-
   def test_copy_stream
     mkcdtmpdir {
 
@@ -235,12 +282,13 @@
         IO.copy_stream("src", "nodir/bar")
       }
 
-      with_pipe {|r, w|
+      pipe(proc do |w|
         ret = IO.copy_stream("src", w)
         assert_equal(content.bytesize, ret)
         w.close
+      end, proc do |r|
         assert_equal(content, r.read)
-      }
+      end)
 
       with_pipe {|r, w|
         w.close
@@ -256,77 +304,85 @@
 
       with_read_pipe("abc") {|r1|
         assert_equal("a", r1.getc)
-        with_pipe {|r2, w2|
+        pipe(proc do |w2|
           w2.sync = false
           w2 << "def"
           ret = IO.copy_stream(r1, w2)
           assert_equal(2, ret)
           w2.close
+        end, proc do |r2|
           assert_equal("defbc", r2.read)
-        }
+        end)
       }
 
       with_read_pipe("abc") {|r1|
         assert_equal("a", r1.getc)
-        with_pipe {|r2, w2|
+        pipe(proc do |w2|
           w2.sync = false
           w2 << "def"
           ret = IO.copy_stream(r1, w2, 1)
           assert_equal(1, ret)
           w2.close
+        end, proc do |r2|
           assert_equal("defb", r2.read)
-        }
+        end)
       }
 
       with_read_pipe("abc") {|r1|
         assert_equal("a", r1.getc)
-        with_pipe {|r2, w2|
+        pipe(proc do |w2|
           ret = IO.copy_stream(r1, w2)
           assert_equal(2, ret)
           w2.close
+        end, proc do |r2|
           assert_equal("bc", r2.read)
-        }
+        end)
       }
 
       with_read_pipe("abc") {|r1|
         assert_equal("a", r1.getc)
-        with_pipe {|r2, w2|
+        pipe(proc do |w2|
           ret = IO.copy_stream(r1, w2, 1)
           assert_equal(1, ret)
           w2.close
+        end, proc do |r2|
           assert_equal("b", r2.read)
-        }
+        end)
       }
 
       with_read_pipe("abc") {|r1|
         assert_equal("a", r1.getc)
-        with_pipe {|r2, w2|
+        pipe(proc do |w2|
           ret = IO.copy_stream(r1, w2, 0)
           assert_equal(0, ret)
           w2.close
+        end, proc do |r2|
           assert_equal("", r2.read)
-        }
+        end)
       }
 
-      with_pipe {|r1, w1|
+      pipe(proc do |w1|
         w1 << "abc"
+        w1 << "def"
+        w1.close
+      end, proc do |r1|
         assert_equal("a", r1.getc)
-        with_pipe {|r2, w2|
-          w1 << "def"
-          w1.close
+        pipe(proc do |w2|
           ret = IO.copy_stream(r1, w2)
           assert_equal(5, ret)
           w2.close
+        end, proc do |r2|
           assert_equal("bcdef", r2.read)
-        }
-      }
+        end)
+      end)
 
-      with_pipe {|r, w|
+      pipe(proc do |w|
         ret = IO.copy_stream("src", w, 1, 1)
         assert_equal(1, ret)
         w.close
+      end, proc do |r|
         assert_equal(content[1,1], r.read)
-      }
+      end)
 
       if have_nonblock?
         with_read_pipe("abc") {|r1|
@@ -433,15 +489,16 @@
   def test_copy_stream_rbuf
     mkcdtmpdir {
       begin
-        with_pipe {|r, w|
+        pipe(proc do |w|
           File.open("foo", "w") {|f| f << "abcd" }
           File.open("foo") {|f|
             f.read(1)
             assert_equal(3, IO.copy_stream(f, w, 10, 1))
           }
           w.close
+        end, proc do |r|
           assert_equal("bcd", r.read)
-        }
+        end)
       rescue NotImplementedError
         skip "pread(2) is not implemtented."
       end
@@ -695,19 +752,20 @@
   end
 
   def test_copy_stream_strio_rbuf
-    with_pipe {|r, w|
+    pipe(proc do |w|
       w << "abcd"
       w.close
+    end, proc do |r|
       assert_equal("a", r.read(1))
       sio = StringIO.new
       IO.copy_stream(r, sio)
       assert_equal("bcd", sio.string)
-    }
+    end)
   end
 
   def test_copy_stream_src_wbuf
     mkcdtmpdir {
-      with_pipe {|r, w|
+      pipe(proc do |w|
         File.open("foe", "w+") {|f|
           f.write "abcd\n"
           f.rewind
@@ -716,17 +774,19 @@
         }
         assert_equal("xycd\n", File.read("foe"))
         w.close
+      end, proc do |r|
         assert_equal("cd\n", r.read)
         r.close
-      }
+      end)
     }
   end
 
   def test_copy_stream_dst_rbuf
     mkcdtmpdir {
-      with_pipe {|r, w|
+      pipe(proc do |w|
         w << "xyz"
         w.close
+      end, proc do |r|
         File.open("fom", "w+b") {|f|
           f.write "abcd\n"
           f.rewind
@@ -735,7 +795,7 @@
           IO.copy_stream(r, f)
         }
         assert_equal("abxyz", File.read("fom"))
-      }
+      end)
     }
   end
 
@@ -750,18 +810,6 @@
     end
   end
 
-  def pipe(wp, rp)
-    r, w = IO.pipe
-    rt = Thread.new { rp.call(r) }
-    wt = Thread.new { wp.call(w) }
-    flunk("timeout") unless rt.join(10) && wt.join(10)
-  ensure
-    r.close unless !r || r.closed?
-    w.close unless !w || w.closed?
-    (rt.kill; rt.join) if rt
-    (wt.kill; wt.join) if wt
-  end
-
   def ruby(*args)
     args = ['-e', '$>.write($<.read)'] if args.empty?
     ruby = EnvUtil.rubybin

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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