about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2014-11-20 03:53:49 +0000
committerEric Wong <e@80x24.org>2014-11-20 20:36:07 +0000
commitcc30e1172ed4784dc2d3fdc649fcfbe5f54ab6f3 (patch)
tree09e14bd6e2bba0dee7d76ffec13cefc29af76441 /lib
parentec3db439b001c3413e0d755d9ce6bd707caf88db (diff)
downloadyahns-cc30e1172ed4784dc2d3fdc649fcfbe5f54ab6f3.tar.gz
We only need to open files with O_APPEND to allow appending to the
temporary buffer while leaving the read offset unchanged.
Diffstat (limited to 'lib')
-rw-r--r--lib/yahns/sendfile_compat.rb12
-rw-r--r--lib/yahns/tmpio.rb2
2 files changed, 6 insertions, 8 deletions
diff --git a/lib/yahns/sendfile_compat.rb b/lib/yahns/sendfile_compat.rb
index e3f53d1..f324075 100644
--- a/lib/yahns/sendfile_compat.rb
+++ b/lib/yahns/sendfile_compat.rb
@@ -1,25 +1,23 @@
 # -*- encoding: binary -*-
 # Copyright (C) 2009-2014, Eric Wong <normalperson@yhbt.net> et. al.
 # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
-require 'io/extra' # gem install io-extra
 
 module Yahns::SendfileCompat
   def trysendfile(io, offset, count)
     return 0 if count == 0
     count = 0x4000 if count > 0x4000
-    str = IO.pread(io.fileno, count, offset)
-    if count > str.bytesize
-      raise EOFError, "end of file reached"
-    end
+    buf = Thread.current[:yahns_sfbuf] ||= ''
+    io.pos = offset
+    str = io.read(count, buf) or return # nil for EOF
     n = 0
     case rv = kgio_trywrite(str)
     when String # partial write, keep trying
-      n += (str.bytesize - rv.bytesize)
+      n += (str.size - rv.size)
       str = rv
     when :wait_writable, :wait_readable
       return n > 0 ? n : rv
     when nil
-      return n + str.bytesize # yay!
+      return n + str.size # yay!
     end while true
   end
 end
diff --git a/lib/yahns/tmpio.rb b/lib/yahns/tmpio.rb
index 19da658..f0ddd2f 100644
--- a/lib/yahns/tmpio.rb
+++ b/lib/yahns/tmpio.rb
@@ -14,7 +14,7 @@ class Yahns::TmpIO < File # :nodoc:
   def self.new(tmpdir = Dir.tmpdir)
     retried = false
     begin
-      fp = super("#{tmpdir}/#{rand}", RDWR|CREAT|EXCL, 0600)
+      fp = super("#{tmpdir}/#{rand}", RDWR|CREAT|EXCL|APPEND, 0600)
     rescue Errno::EEXIST
       retry
     rescue Errno::EMFILE, Errno::ENFILE