diff options
| author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-12-31 15:02:22 +0000 |
|---|---|---|
| committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-12-31 15:02:22 +0000 |
| commit | 4ef881bd15c9c4e2e9b20da2c091e80d4d530119 (patch) | |
| tree | 7b725552a9a4ded93849ca2faab1b257f7761790 /lib/tempfile.rb | |
| parent | 182520b0acc5eea4da52bc8734dc5e3280ce5f94 (diff) | |
| download | ruby-4ef881bd15c9c4e2e9b20da2c091e80d4d530119.tar.gz ruby-4ef881bd15c9c4e2e9b20da2c091e80d4d530119.tar.xz ruby-4ef881bd15c9c4e2e9b20da2c091e80d4d530119.zip | |
* Merge YARV
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@11439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/tempfile.rb')
| -rw-r--r-- | lib/tempfile.rb | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/lib/tempfile.rb b/lib/tempfile.rb index a033a5b29..6a2d560b5 100644 --- a/lib/tempfile.rb +++ b/lib/tempfile.rb @@ -6,12 +6,14 @@ require 'delegate' require 'tmpdir' +require 'thread' # A class for managing temporary files. This library is written to be # thread safe. class Tempfile < DelegateClass(File) MAX_TRY = 10 @@cleanlist = [] + @@lock = Mutex.new # Creates a temporary file of mode 0600 in the temporary directory # whose name is basename.pid.n and opens with mode "w+". A Tempfile @@ -26,27 +28,23 @@ class Tempfile < DelegateClass(File) tmpdir = '/tmp' end - lock = nil + lock = tmpname = nil n = failure = 0 - - begin - Thread.critical = true - + @@lock.synchronize { begin - tmpname = File.join(tmpdir, make_tmpname(basename, n)) - lock = tmpname + '.lock' - n += 1 - end while @@cleanlist.include?(tmpname) or - File.exist?(lock) or File.exist?(tmpname) - - Dir.mkdir(lock) - rescue - failure += 1 - retry if failure < MAX_TRY - raise "cannot generate tempfile `%s'" % tmpname - ensure - Thread.critical = false - end + begin + tmpname = File.join(tmpdir, make_tmpname(basename, n)) + lock = tmpname + '.lock' + n += 1 + end while @@cleanlist.include?(tmpname) or + File.exist?(lock) or File.exist?(tmpname) + Dir.mkdir(lock) + rescue + failure += 1 + retry if failure < MAX_TRY + raise "cannot generate tempfile `%s'" % tmpname + end + } @data = [tmpname] @clean_proc = Tempfile.callback(@data) |
