From: Tanaka Akira Date: 2004-12-08T14:04:52+09:00 Subject: [ruby-dev:25117] Re: non-stdio buffering In article <20041208.033521.635728872.gotoyuzo@sawara.does.notwork.org>, GOTOU Yuuzou writes: > In message <87fz2icqlf.fsf@serein.a02.aist.go.jp>, > `Tanaka Akira ' wrote: >> * OpenFile 構造体から f を除去する > >> ただし、これを行うと、ext/openssl/ossl_bio.c の BIO_new_fp のように >> 拡張ライブラリで GetOpenFile を使って FILE* を得ている部分で困るかも >> 知れません。まぁ、その部分で fdopen すればいいのではないかという気も >> するのですが、使っているところのメンテナと相談したい所です。 > > はい。ここについてはfdopen()を使うように変更しました。 すばらしい。 というわけで、OpenFile 構造体の f メンバを捨てるのに問題がひとつ減りま した。 In article <87fz2icqlf.fsf@serein.a02.aist.go.jp>, Tanaka Akira writes: > また、これを行うと popen(3) を使うコードを捨てる必要があります。しか > し、じつは最近の Ruby ではそこの部分にバグがあって、コンパイルできな > かったはずです。したがって、捨てても大きな影響はないはずだと考えてい > ます。 > (popen を使うのは HAVE_FORK も _WIN32 も定義されていない時なのですが、 > そこで fpr という変数を使っていたにもかかわらず、その変数は _WIN32 > が定義されているときしか定義されていませんでした) という popen(3) のところはどうしましょう? 調べてみると、[ruby-list:4243] あたりなどから、この popen(3) を使うコー ドはは DJGPP 用なようです。 そして、 http://jarp.jin.gr.jp/diary/200412a.html#200412061 をみると、一応いまでも動くようです。 というわけで、 * f を捨てて Solaris の 256個制限を乗り越え、DJGPP は捨てる * 今のままで DJGPP で動くようにしておき、256個制限はあきらめる * popen を使わずに DJGPP で動くようにコードを書き、DJGPP で動くまま 256個制限を取り除く というあたりの選択肢が考えられるんですが、どれがいいでしょう? また、調べ直してみると、他にもいくつかありました。 まず、__human68k__ 用の、fmode(fptr->f, _IOBIN) というコードがありまし た。 * human68k は捨てる * fmode と等価なことを file descriptor に対して行う方法を調べる (というか、human64k の text mode は stdio と kernel のどっちで行われ ているのだろう?) また、DL の rb_io_to_ptr という関数で、FILE 構造体へのポインタを渡すと いう機能があるようです。 * その機能を捨てる * DL で fdopen する (でも、いつ fclose したらいいだろう?) * lazy に fdopen する機能を IO につける -- [田中 哲][たなか あきら][Tanaka Akira]