[ruby-dev:45289] [ruby-trunk - Feature #6082] io_binwrite()内でwritev()を使う

From: Masaki Matsushita <glass.saga@...>
Date: 2012-02-26 02:30:04 UTC
List: ruby-dev #45289
Issue #6082 has been updated by Masaki Matsushita.

File patch2.diff added

Nobuyoshi Nakada wrote:
>sys/uio.hが必要です。

ご指摘とpatchをありがとうございます。
なかださんのpatchを適用して1つにまとめたpatchを添付します。
----------------------------------------
Feature #6082: io_binwrite()内でwritev()を使う
https://bugs.ruby-lang.org/issues/6082

Author: Masaki Matsushita
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: 


io.cのio_binwrite()内で、writev()を用いる事を提案します。

現在のio_binwrite()は、実際にシステムコールを呼ぶ時には渡された文字列がwbufに収まるならばMEMMOVE()で収めてしまってio_fflush()し、
収まらなければfflushした後に再度rb_write_internal()を呼んでいますが、writev()を用いる事でMEMMOVE()の必要がなくなり、
wbufと渡された文字列を結合する事なく一度のシステムコールで書き出す事ができます。
また、wbufと渡された文字列を1度に書き出す事に成功すれば、他のスレッドからのwriteが間に入らないというメリットもあります。

patchを添付します。
test-allを実行したところ、test_keep_alive_EOF(TestNetHTTPKeepAlive)でfailure、test_inspect_nonascii(TestDir_M17N)でerrorとなりますが、
これはtrunkのr34799でも同様なので、このpatchによる問題ではないものと思われます。


-- 
http://bugs.ruby-lang.org/

In This Thread