From d6fb854ecbf48111a746009f559d642446b8d1c1 Mon Sep 17 00:00:00 2001 From: akr Date: Sat, 13 Feb 2010 03:20:52 +0000 Subject: [PATCH] * lib/tempfile.rb (Tempfile::Remover): new class to replace Tempfile.callback. port r24902 from Ruby 1.8. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26656 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ lib/tempfile.rb | 48 +++++++++++++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 16e605e38d..ff42536ada 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Feb 13 12:17:52 2010 Tanaka Akira + + * lib/tempfile.rb (Tempfile::Remover): new class to replace + Tempfile.callback. port r24902 from Ruby 1.8. + Fri Feb 12 17:55:21 2010 Nobuyoshi Nakada * vm.c (thread_free): fixed typo. diff --git a/lib/tempfile.rb b/lib/tempfile.rb index b327acb62b..e1bccf0a90 100755 --- a/lib/tempfile.rb +++ b/lib/tempfile.rb @@ -128,7 +128,7 @@ class Tempfile < DelegateClass(File) # number of tries, then it will raise an exception. def initialize(basename, *rest) @data = [] - @clean_proc = self.class.callback(@data) + @clean_proc = Remover.new(@data) ObjectSpace.define_finalizer(self, @clean_proc) create(basename, *rest) do |tmpname, n, opts| @@ -230,7 +230,7 @@ class Tempfile < DelegateClass(File) if File.exist?(@tmpname) File.unlink(@tmpname) end - # remove tmpname from callback + # remove tmpname from remover @data[0] = @data[2] = nil @data = @tmpname = nil rescue Errno::EACCES @@ -257,27 +257,33 @@ class Tempfile < DelegateClass(File) end alias length size - class << self - def callback(data) # :nodoc: - pid = $$ - Proc.new { - if pid == $$ - path, tmpfile = *data - - STDERR.print "removing ", path, "..." if $DEBUG - - tmpfile.close if tmpfile - - # keep this order for thread safeness - if path - File.unlink(path) if File.exist?(path) - end - - STDERR.print "done\n" if $DEBUG - end - } + # :stopdoc: + class Remover + def initialize(data) + @pid = $$ + @data = data end + def call(*args) + if @pid == $$ + path, tmpfile = *@data + + STDERR.print "removing ", path, "..." if $DEBUG + + tmpfile.close if tmpfile + + # keep this order for thread safeness + if path + File.unlink(path) if File.exist?(path) + end + + STDERR.print "done\n" if $DEBUG + end + end + end + # :startdoc: + + class << self # Creates a new Tempfile. # # If no block is given, this is a synonym for Tempfile.new.