あ伊藤です.拡張モジュールについて悩んでいることがあるので,
どなたかご協力をお願いします.

私が以前書いた pty モジュールについてなのですが,不可解なバグ
でここしばらく悩んでいました.現象は,ptyを使ったプログラムを
ずっと動かしていると

  「だんだんプロセスが大きくなる」

というものです.いろいろ調査した結果,

  r_file, w_file = PTY.spawn(cmd)
  処理
  PTY.reset_signal

という処理だとプロセス巨大化が起きないのに,

  PTY.spawn(cmd) do |r_file, w_file|
    処理
  end

だとプロセス巨大化が起こることが判明しました.pty.c で
PTY.spawn がイテレータとして使われるかどうかの部分は,
こんな感じになっています.

  res = ary_new2(3);  /* 確保した IO を格納する配列 */
  ary_store(res,0,(VALUE)rport);
  ary_store(res,1,(VALUE)wport);
  ary_store(res,2,INT2FIX(info.child_pid));

  if (iterator_p()) {  /* iterator の場合は,それをブロックパラメータとして渡す */
    rb_yield((VALUE)res);
    reset_signal_action();
    return Qnil;
  }
  else
    return (VALUE)res;   /* そうでなければ返値とする */


どちらもIOオブジェクトの配列を渡しているだけのように
見えるのですが(というか,そのつもりで書いた),イテレータ
の場合だけメモリを消費しつづけるのは何故なのでしょうか.
C レベルから rb_yield を呼ぶ場合には何か前処理が必要
なのでしょうか?何か示唆があったらお願いします.

--
aito