* 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
This commit is contained in:
akr 2010-02-13 03:20:52 +00:00
Родитель 3f9bc1fd88
Коммит d6fb854ecb
2 изменённых файлов: 32 добавлений и 21 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Sat Feb 13 12:17:52 2010 Tanaka Akira <akr@fsij.org>
* 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 <nobu@ruby-lang.org>
* vm.c (thread_free): fixed typo.

Просмотреть файл

@ -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.