about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2010-06-30 09:15:20 +0000
committerEric Wong <normalperson@yhbt.net>2010-06-30 09:18:02 +0000
commit7e3de7a12629423e911dae8955e7cc2035d6c401 (patch)
tree32184dbd0e9a7983adc812abac8292aeefe8e3ec
parent280c6816ac4ebbfae8298871e125376d30ef5679 (diff)
downloadrainbows-7e3de7a12629423e911dae8955e7cc2035d6c401.tar.gz
This should improve performance for static file responses.
-rw-r--r--lib/rainbows/rev/client.rb17
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/rainbows/rev/client.rb b/lib/rainbows/rev/client.rb
index 7929e32..888f8a9 100644
--- a/lib/rainbows/rev/client.rb
+++ b/lib/rainbows/rev/client.rb
@@ -80,12 +80,27 @@ module Rainbows
         end while true
       end
 
+      if IO.method_defined?(:sendfile_nonblock)
+        def sendfile(body)
+          body.pos += @_io.sendfile_nonblock(body, body.pos, 0x10000)
+          rescue Errno::EAGAIN
+          ensure
+            enable_write_watcher
+        end
+      else
+        def sendfile(body)
+          write(body.sysread(CHUNK_SIZE))
+        end
+      end
+
       def on_write_complete
         if body = @deferred_bodies[0]
+          # no socket or pipes, body must be a regular file to continue here
           return if DeferredResponse === body
+
           begin
             begin
-              write(body.sysread(CHUNK_SIZE))
+              sendfile(body)
             rescue EOFError # expected at file EOF
               @deferred_bodies.shift
               body.close