なかだです。

At Fri, 14 Sep 2001 11:51:53 +0900,
m_seki / mva.biglobe.ne.jp wrote:
> # スレッドをつかんだままになってるところがあった…

 終了したものもつかんだままということでしょうか。これで気づき
ましたが、スレッドが終了してもスタックとかその他もろもろ開放さ
れないんですね。result,errinfo,thread,klass,localsくらい残して、
他は捨ててしまっていいような気もしますが。


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:31:28 @@ -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,7 @@ 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) { @@ -7428,4 +7427,6 @@ rb_thread_remove(th) rb_thread_ready(th); th->status = THREAD_KILLED; + if (th->stk_ptr) free(th->stk_ptr); + th->stk_ptr = 0; th->prev->next = th->next; th->next->prev = th->prev; @@ -8799,4 +8780,6 @@ rb_thread_atfork() if (th != curr_thread) { th->status = THREAD_KILLED; + if (th->stk_ptr) free(th->stk_ptr); + th->stk_ptr = 0; } }
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦