Project

General

Profile

Actions

Feature #6082

closed

io_binwrite()内でwritev()を使う

Added by Glass_saga (Masaki Matsushita) about 12 years ago. Updated almost 12 years ago.

Status:
Rejected
Target version:
-
[ruby-dev:45285]

Description

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による問題ではないものと思われます。


Files

patch.diff (4.32 KB) patch.diff Glass_saga (Masaki Matsushita), 02/25/2012 01:33 PM
patch2.diff (5.28 KB) patch2.diff Glass_saga (Masaki Matsushita), 02/26/2012 11:30 AM
shift_fflush.diff (6.26 KB) shift_fflush.diff #ifndef HAVE_WRITEVな場合にmemmove()とfflushを担当するio_shift_fflush()という関数を新設して#ifdefを小さくしたpatch Glass_saga (Masaki Matsushita), 04/02/2012 10:17 PM
binwrite.diff (6.49 KB) binwrite.diff io_binwrite_string()にwbufのwriteと引数ptrのwriteの両方を担当させる事で#ifdefを小さくしたpatch Glass_saga (Masaki Matsushita), 04/02/2012 10:17 PM
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0