Feature #7148

Improved Tempfile w/o DelegateClass

Added by Masaki Matsushita over 1 year ago. Updated over 1 year ago.

[ruby-core:47930]
Status:Assigned
Priority:Low
Assignee:Yukihiro Matsumoto
Category:lib
Target version:next minor

Description

I propose improved Tempfile without DelegateClass().
Present Tempfile has following problems.

1) confusing inspect

t = Tempfile.new("foo") #=> #File:/tmp/foo20121012-6762-12w11to
t.is_a? File #=> false

2) #dup doesn't duplicate IO

t = Tempfile.new("foo")
t.dup.close
t.read #=> IOError: closed stream

3) finalizer performs unlink even when it has been duplicated

t = Tempfile.new("foo")
path = t.path #=> "/tmp/foo20121012-7533-1q537gq"
File.exist? path #=> true
tt = t.dup
t = nil
GC.start
File.exist? path #=> false

I think these problems caused by using DelegateClass().
Therefore, I made a patch to resolve the problems.
The patched Tempfile class is a subclass of File.

patch.diff Magnifier (3.52 KB) Masaki Matsushita, 10/12/2012 02:04 PM

History

#1 Updated by Anonymous over 1 year ago

Hi,

In message "Re: [ruby-trunk - Feature #7148][Open] Improved Tempfile w/o DelegateClass"
on Fri, 12 Oct 2012 14:04:08 +0900, "Glass_saga (Masaki Matsushita)" glass.saga@gmail.com writes:

|I propose improved Tempfile without DelegateClass().
|Present Tempfile has following problems.
|
|1) confusing inspect
|2) #dup doesn't duplicate IO
|3) finalizer performs unlink even when it has been duplicated

I have no objection about (1), but what we expect when we call
Tempfile#dup might differ, for example, I'd expect it to copy the
underlying temporary file. So making Tempfile a subclass of File
may not be the ideal solution.

                        matz.

#2 Updated by Masaki Matsushita over 1 year ago

Hello,

Yukihiro Matsumoto wrote:

I'd expect it to copy the underlying temporary file.

Is the behavior of #dup you expect like the following?

def dup
dupe = self.class.new(@basename)
IO.copy_stream(self, dupe, 0)
dupe
end

I think the reason why Tempfile uses DelegateClass is that to implement Tempfile#open without it used to be difficult.
To implement it as subclass of File, self must be reopened with full configuration, mode and opts.
IO#reopen used not to accept them, but now it accepts after r37071.

#3 Updated by Charles Nutter over 1 year ago

JRuby has been running with Tempfile < File for a couple years now, and have received only minor bug reports about it. It works very well, and has no delegation cost.

#4 Updated by Masaki Matsushita over 1 year ago

Are there some reasons not to make Tempfile a subclass of File?
I think it's a better solution, even if it's not an ideal solution.

#5 Updated by Yusuke Endoh over 1 year ago

  • Status changed from Open to Assigned
  • Assignee set to Yukihiro Matsumoto
  • Priority changed from Normal to Low
  • Target version set to next minor

Also available in: Atom PDF