about summary refs log tree commit homepage
path: root/lib/unicorn/util.rb
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2009-07-19 16:38:16 -0700
committerEric Wong <normalperson@yhbt.net>2009-07-19 16:50:36 -0700
commit97e469fc3afb751618b8b9a7b364cb447aaf90dd (patch)
tree1c3fdba70ccd2f88e6471441a4c66335189eafae /lib/unicorn/util.rb
parent7db0e317dee3514fd80cc0a97a9b78a7a893ec22 (diff)
downloadunicorn-97e469fc3afb751618b8b9a7b364cb447aaf90dd.tar.gz
With the 1.9.2preview1 release (and presumably 1.9.1 p243), the
Ruby core team has decided that bending over backwards to
support crippled operating/file systems was necessary and that
files must be closed before unlinking.

Regardless, this is more efficient than using Tempfile because:

  1) no delegation is necessary, this is a real File object

  2) no mkdir is necessary for locking, we can trust O_EXCL
     to work properly without unnecessary FS activity

  3) no finalizer is needed to unlink the file, we unlink
     it as soon as possible after creation.
Diffstat (limited to 'lib/unicorn/util.rb')
-rw-r--r--lib/unicorn/util.rb17
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/unicorn/util.rb b/lib/unicorn/util.rb
index 2d3f827..d2214b7 100644
--- a/lib/unicorn/util.rb
+++ b/lib/unicorn/util.rb
@@ -1,4 +1,5 @@
 require 'fcntl'
+require 'tmpdir'
 
 module Unicorn
   class Util
@@ -39,6 +40,22 @@ module Unicorn
         nr
       end
 
+      # creates and returns a new File object.  The File is unlinked
+      # immediately, switched to binary mode, and userspace output
+      # buffering is disabled
+      def tmpio
+        fp = begin
+          File.open("#{Dir::tmpdir}/#{rand}",
+                    File::RDWR|File::CREAT|File::EXCL, 0600)
+        rescue Errno::EEXIST
+          retry
+        end
+        File.unlink(fp.path)
+        fp.binmode
+        fp.sync = true
+        fp
+      end
+
     end
 
   end