From cc30e1172ed4784dc2d3fdc649fcfbe5f54ab6f3 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 20 Nov 2014 03:53:49 +0000 Subject: sendfile_compat: remove dependency on pread We only need to open files with O_APPEND to allow appending to the temporary buffer while leaving the read offset unchanged. --- lib/yahns/sendfile_compat.rb | 12 +++++------- lib/yahns/tmpio.rb | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) (limited to 'lib') 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 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 -- cgit v1.2.3-24-ge0c7