logo       
Google Custom Search
    AddThis Social Bookmark Button

[ruby-dev:27339] Re: File#readにゴミがつく: msg#00405

Subject: [ruby-dev:27339] Re: File#readにゴミがつく
山本です。

>肝心かもしれないことを書き忘れていました。
>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 ...
<Prev in Thread] Current Thread [Next in Thread>