まつもと ゆきひろです

In message "[ruby-ext:00037] ファイルの扱い  & 	同期"
    on 98/12/15, IKARASHI Akira <ikarashi / itlb.te.noda.sut.ac.jp> writes:


|拡張モジュールを作ってみたのですが、ファイルの扱い方に自信がありません。
|GetOpenFile で得た OpenFile* から、FILE *fを取り出して利用している
|のですが、OpenFile には f と f2 の二つの FILE* があります。
|この、違いはなんでしょうか?

f2は双方向入出力が可能なIO(例えばSocket)でのwrite側のFILE*で
す.単方向のIOではf2はNULLになっています.

|また、バッファを共有している関係で、途中で他のスレッドに処理が移って
|欲しくない部分があるのですが、そのような指定はどのようにすれば良いので
|しょうか?

RubyのスレッドはCレベルでは

  * 明示的に切替える
  * Rubyの機能を使ってIOを行う
  * Rubyの機能を使ってsleepを行う

ときにしかコンテキスト切替えが発生しません.ですからCレベル
ではほとんど切替えが起きないと思って構いません.

気になる場合には

  #include <rubysig.h>

した上で,クリティカルな部分を

  DEFER_INTS;
  ALLOW_INTS;

で囲むことができます.この場合,この範囲内で例外が発生しない
ことが望ましいです.発生するとスレッド割込みのタイミングがず
れます.たぶん,そのうち元に戻るでしょうけど.

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