山本です。
>肝心かもしれないことを書き忘れていました。
>64bit Solaris の時のみ現象が発生します。
>32bit バイナリでは発生しません。
うーん、FILE構造体の構成の違いでしょうか。64bit Solaris だと
struct __FILE_TAG {
long __pad[16];
};
なんて構造になっているそうで、io.c の #else 節が実行される
のだと思いますが、32bit Solaris ではもっと標準的な構造になっていて
#else 以外の節が実行されるんじゃないでしょうか。
READ_DATA_PENDIN は、たぶんブロックなしに読み込めるかどうか
調べるマクロだと思うので、こんな感じでしょうか。一応、Windowsでも
(!feof(fp)) だとゴミがついて、このマクロで修正できることを確認しました。
--- ruby-1.8.3.old\io.c Wed Sep 21 10:10:35 2005
+++ ruby-1.8.3.new\io.c Wed Sep 28 04:27:28 2005
@@ -153,7 +153,7 @@
#else
/* requires systems own version of the ReadDataPending() */
extern int ReadDataPending();
-# define READ_DATA_PENDING(fp) (!feof(fp))
+# define READ_DATA_PENDING(fp) 0
# define READ_DATA_BUFFERED(fp) 0
#endif
#ifndef READ_DATA_BUFFERED
[ruby-dev:1992]によれば
>READ_DATA_PENDINGが0だとバッファにデータが入っている(から読
>み出せる)のにselectが返らない,threadが切り替わらないという
>問題が考えられます.まあ,たぶん大した問題にはならないでしょ
>うけど.
ということらしいので、パフォーマンスに不利がありそうですけど、
修正としては正しそうです。
|
Try Searching:
servers, voip, java, networking, microsoft ...
|
|
|
|