diff options
author | Eric Wong <e@80x24.org> | 2014-11-20 03:53:49 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2014-11-20 20:36:07 +0000 |
commit | cc30e1172ed4784dc2d3fdc649fcfbe5f54ab6f3 (patch) | |
tree | 09e14bd6e2bba0dee7d76ffec13cefc29af76441 | |
parent | ec3db439b001c3413e0d755d9ce6bd707caf88db (diff) | |
download | yahns-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.
-rw-r--r-- | INSTALL | 4 | ||||
-rw-r--r-- | lib/yahns/sendfile_compat.rb | 12 | ||||
-rw-r--r-- | lib/yahns/tmpio.rb | 2 |
3 files changed, 7 insertions, 11 deletions
@@ -10,6 +10,4 @@ more details. Debian GNU/kFreeBSD: For now, you will need to define SENDFILE_BROKEN=1 in the env before -running yahns, and also install the "io-extra" RubyGem (tested on 1.2.7) - - gem install -v 1.2.7 io-extra +running yahns. 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 |