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 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 725141F5F1 for ; Fri, 3 Apr 2015 01:53:29 +0000 (UTC) From: Eric Wong To: yahns-public@yhbt.net Subject: [PATCH] allow vector args to wbuf_write Date: Fri, 3 Apr 2015 01:53:29 +0000 Message-Id: <1428026009-23379-1-git-send-email-e@80x24.org> List-Id: This allows us to write chunked response bodies without extra copying to clients which support streaming. --- lib/yahns/wbuf.rb | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/yahns/wbuf.rb b/lib/yahns/wbuf.rb index ba7ea0f..fa39b9b 100644 --- a/lib/yahns/wbuf.rb +++ b/lib/yahns/wbuf.rb @@ -40,10 +40,11 @@ def initialize(body, persist, tmpdir, busy) @busy = busy # may be false end - def wbuf_write(client, buf) - # try to bypass the VFS layer if we're all caught up - case rv = client.kgio_trywrite(buf) - when String + def wbuf_write(c, buf) + # try to bypass the VFS layer and write directly to the socket + # if we're all caught up + case rv = String === buf ? c.kgio_trywrite(buf) : c.kgio_trywritev(buf) + when String, Array buf = rv # retry in loop when nil return # yay! hopefully we don't have to buffer again @@ -52,8 +53,11 @@ def wbuf_write(client, buf) end until @busy @tmpio ||= Yahns::TmpIO.new(@tmpdir) - @sf_count += @tmpio.write(buf) - case rv = client.trysendfile(@tmpio, @sf_offset, @sf_count) + @sf_count += String === buf ? @tmpio.write(buf) : @tmpio.kgio_writev(buf) + + # we spent some time copying to the FS, try to write to + # the socket again in case some space opened up... + case rv = c.trysendfile(@tmpio, @sf_offset, @sf_count) when Integer @sf_count -= rv @sf_offset += rv -- EW