From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-2.9 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, URIBL_BLOCKED shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: yahns-public@yhbt.net Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 83FAF1F7B4; Thu, 20 Nov 2014 20:45:53 +0000 (UTC) From: Eric Wong To: yahns-public@yhbt.net Cc: e@80x24.org Subject: [PATCH 6/6] sendfile_compat: remove dependency on pread Date: Thu, 20 Nov 2014 20:45:42 +0000 Message-Id: <1416516342-18987-7-git-send-email-e@80x24.org> X-Mailer: git-send-email 2.2.0.rc0.dirty In-Reply-To: <1416516342-18987-1-git-send-email-e@80x24.org> References: <1416516342-18987-1-git-send-email-e@80x24.org> List-Id: We only need to open files with O_APPEND to allow appending to the temporary buffer while leaving the read offset unchanged. --- INSTALL | 4 +--- lib/yahns/sendfile_compat.rb | 12 +++++------- lib/yahns/tmpio.rb | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/INSTALL b/INSTALL index 87acc53..fcc92f2 100644 --- a/INSTALL +++ b/INSTALL @@ -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 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 -- EW