[#7785] rb2c — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

28 messages 1999/09/02

[#7845] [Q] irb and SizedQueue — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

14 messages 1999/09/15

[ruby-dev:7883] Re: socket and buffering

From: matz@... (Yukihiro Matsumoto)
Date: 1999-09-19 17:02:47 UTC
List: ruby-dev #7883
まつもと ゆきひろです

In message "[ruby-dev:7858] Re: socket and buffering"
    on 99/09/17, Masaki Fukushima <fukusima@goto.info.waseda.ac.jp> writes:

|> |以下のような環境で調べたところ、Socket#read (中ではfread(3)が呼ば
|> |れる)を使うと、やはり 1 byte づつの read になってしまいます。

|> どうやって回避するのがベストなんでしょうねえ。
|> O_NDELAY+read(2)しかないのか..

|問題になっているのはunbufferedなIOオブジェクト(主にSocket)か
|らの読み込みが、sysread以外のメソッドで1byteずつのread(2)になって
|しまうことです。

まず、気になっている点は

  1. setbuf(NULL)は必要か
  2. 1byteずつのread(2)は回避できるか

です。まず、1.についてですが、Perlなどのソースを見ながらつら
つらと検討してみると、実際には必要なのはautoflush(sync=true)
であって、バッファリングを止めることではなさそうです。そこで
io.cの関数rb_io_unbufferedに手をいれて(名称も変更して)
FMODE_SYNC の設定だけを行うようにしてみます。

straceの結果を見るとこれで1byte read(2)は解決したようです。

しかし、他のスレッドをブロックしてしまう問題はこれでは解決し
ません。これは fread(3) を止めて、getc(3) を利用して他のスレッ
ドのチェックを行うようにする(io_getsがやっているように)こと
で解決できそうです。

                                まつもと ゆきひろ /:|)

In This Thread