From: Masaki Matsushita Date: 2012-02-26T11:30:04+09:00 Subject: [ruby-dev:45289] [ruby-trunk - Feature #6082] io_binwrite()内でwritev()を使う 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/