[#45085] [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC — Narihiro Nakamura <authorNari@...>

11 messages 2012/01/04

[ruby-dev:45113] [ruby-trunk - Bug #5850] Failure test/ruby/test_io.rb

From: Tomoyuki Chikanaga <nagachika00@...>
Date: 2012-01-08 13:17:47 UTC
List: ruby-dev #45113
Issue #5850 has been updated by Tomoyuki Chikanaga.


GC の変更で test_autoclose はうまく IO オブジェクトが回収されるようになったみたいですね。こちらでも再現しなくなってしまいました。

test_copy_stream の Error は以前とは別もので、Tempfile#_close で File#close が例外(Errno::EBADF)を発生させた時に finalizer に渡すオブジェクト(@data[1])を nil でクリアするのが飛ばされてしまうからのようです。 @data に残っていると Tempfile の finalizer で再度 close しようとしてしまうのでそこで例外が発生します。あと unlink にも typo らしいのをみつけたので以下のように修正しようと思います。

ただ finalizer で例外が発生した時にそれが実行中の処理にまで波及するのは正しいのでしょうか? 少し実験してみたのですが finalizer の中で例外を発生させても無視されるようなのでこれはこれでまた別の問題があるのかもしれません。

diff --git a/lib/tempfile.rb b/lib/tempfile.rb
index 3321116..b7c2f91 100644
--- a/lib/tempfile.rb
+++ b/lib/tempfile.rb
@@ -162,9 +162,9 @@ class Tempfile < DelegateClass(File)
   end
 
   def _close    # :nodoc:
+    @data[1] = nil if @data
     @tmpfile.close if @tmpfile
     @tmpfile = nil
-    @data[1] = nil if @data
   end
   protected :_close
 
@@ -231,7 +231,7 @@ class Tempfile < DelegateClass(File)
         File.unlink(@tmpname)
       end
       # remove tmpname from remover
-      @data[0] = @data[2] = nil
+      @data[0] = @data[1] = nil
       @tmpname = nil
     rescue Errno::EACCES
       # may not be able to unlink on Windows; just ignore

----------------------------------------
Bug #5850: Failure test/ruby/test_io.rb
https://bugs.ruby-lang.org/issues/5850

Author: Ayumu AIZAWA
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-01-06 trunk 34219) [x86_64-darwin10.8.0] 


=begin
r34219で test/ruby/test_io.rb が1件失敗、1件エラーになります。
エラーの方は-j で実行すると最初は失敗してそのあと成功します。

 0:ruby ➔  make test-all TESTS=test/ruby/test_io.rb
 ./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems "./test/runner.rb" --ruby="./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems" test/ruby/test_io.rb
 Run options: "--ruby=./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems"
 
 # Running tests:
 
 .F.............E..................................................................................................
 
 Finished tests in 4.242426s, 26.8714 tests/s, 134.3571 assertions/s.
 
 1) Failure:
 test_autoclose(TestIO) [/Users/ayumin/github/ruby/test/ruby/test_io.rb:1444]:
 Errno::EBADF expected but nothing was raised.
 
 2) Error:
 test_copy_stream(TestIO):
 Errno::EBADF: Bad file descriptor
 /Users/ayumin/github/ruby/test/ruby/test_io.rb:32:in `close'
 /Users/ayumin/github/ruby/test/ruby/test_io.rb:32:in `rescue in block in pipe'
 /Users/ayumin/github/ruby/test/ruby/test_io.rb:29:in `block in pipe'
 
 114 tests, 570 assertions, 1 failures, 1 errors, 0 skips
 
 ruby -v: ruby 2.0.0dev (2012-01-06 trunk 34219) [x86_64-darwin10.8.0]
 make: *** [yes-test-all] Error 2
 0:ruby ➔  make test-all TESTS='-j 2 test/ruby/test_io.rb'
 ./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems "./test/runner.rb" --ruby="./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems" -j 2 test/ruby/test_io.rb
 Run options: "--ruby=./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems" -j 2
 
 # Running tests:
 
 .F.............E..................................................................................................
 Retrying...
 
 .F................................................................................................................
 
 
 
 Finished tests in 10.072929s, 11.3175 tests/s, 56.5873 assertions/s.
 
 1) Failure:
 test_autoclose(TestIO) [/Users/ayumin/github/ruby/test/ruby/test_io.rb:1444]:
 Errno::EBADF expected but nothing was raised.
 
 114 tests, 570 assertions, 1 failures, 0 errors, 0 skips
 
 ruby -v: ruby 2.0.0dev (2012-01-06 trunk 34219) [x86_64-darwin10.8.0]
 make: *** [yes-test-all] Error 1
 
=end



-- 
http://bugs.ruby-lang.org/

In This Thread