なかだです。

At Sat, 15 Sep 2001 23:32:26 +0900,
matz / ruby-lang.org (Yukihiro Matsumoto) wrote:
> |> 解放するのがスタックだけなら大丈夫みたいですよ。
> |
> | うーん、でもscope,dyna_vars,wrapperなんかはstruct BLOCKから、
> |crefもframeから参照されてるし、frameもstruct BLOCKにコピーされ
> |てるしと思うのですが、やっぱりダメでしょうか。
> 
> ごめん、上の表現の「やっぱりダメでしょうか」の部分の意味が良
> く分かりませんでした。

 スレッドが終了したところで上の四つも放棄した場合に、問題が発
生するのだろうかということです。make testとrubiconで試した限り
では大丈夫そうなんですが。

> | というか、[ruby-list:31417]には[ruby-dev:14764]が一部混ざっ
> |てました。それと[ruby-dev:14764]も案の定バグってました。Procと
> |かBindingを考えてませんでした。
> 
> では、とりあえず取り込まないことにします。

 この変更自体は取り込むつもりがあるということでしょうか。一応
作り直したパッチをつけときます。一つ目がスレッド終了時にスタッ
クを解放するパッチ、二つ目が上記四つも解放できるようにするパッ
チです。

# ruby-devにいった方がいいかな?


Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.203 diff -u -2 -p -r1.203 eval.c --- eval.c 2001/09/08 14:17:09 1.203 +++ eval.c 2001/09/14 06:49:01 @@ -7420,4 +7420,13 @@ rb_thread_ready(th) } +status void +rb_thread_die(th) + rb_thread_t th; +{ + th->status = THREAD_KILLED; + if (th->stk_ptr) free(th->stk_ptr); + th->stk_ptr = 0; +} + static void rb_thread_remove(th) @@ -7427,5 +7436,5 @@ rb_thread_remove(th) rb_thread_ready(th); - th->status = THREAD_KILLED; + rb_thread_die(th); th->prev->next = th->next; th->next->prev = th->prev; @@ -8798,5 +8806,5 @@ rb_thread_atfork() FOREACH_THREAD(th) { if (th != curr_thread) { - th->status = THREAD_KILLED; + rb_thread_die(th); } }
Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.203 diff -u -2 -p -r1.203 eval.c --- eval.c 2001/09/08 14:17:09 1.203 +++ eval.c 2001/09/14 06:49:01 @@ -7160,7 +7160,11 @@ thread_mark(th) rb_gc_mark(th->result); rb_gc_mark(th->thread); + rb_gc_mark(th->klass); + rb_gc_mark(th->errinfo); + rb_mark_tbl(th->locals); + if (th->status == THREAD_KILLED) return; + if (th->join) rb_gc_mark(th->join->thread); - rb_gc_mark(th->klass); rb_gc_mark(th->wrapper); rb_gc_mark((VALUE)th->cref); @@ -7168,12 +7172,9 @@ thread_mark(th) rb_gc_mark((VALUE)th->scope); rb_gc_mark((VALUE)th->dyna_vars); - rb_gc_mark(th->errinfo); rb_gc_mark(th->last_line); rb_gc_mark(th->last_match); - rb_mark_tbl(th->locals); /* mark data in copied stack */ if (th == curr_thread) return; - if (th->status == THREAD_KILLED) return; if (th->stk_len == 0) return; /* stack not active, no need to mark. */ if (th->stk_ptr) {
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦