なかだです。
rb_thread_tのthgroupがmarkされていません。
$ ruby -v -e '
def foo(n, t)
if n > 0
foo(n-1, t)
else
ThreadGroup.new.add(t)
p t.group
t
end
end
t = foo(100, Thread.new{Thread.stop})
100000.times{Object.new}
p t.group'
ruby 1.9.0 (2004-12-01) [i686-linux]
#<ThreadGroup:0x401d7ef4>
#<Object:0x401d7ef4>
また、ThreadだけでなくContinuationもaddできてしまいますが、list
には出てきません。
$ ruby -v -e 'c = nil; callcc{|c|}; g = ThreadGroup.new; p g.add(c); p g.list'
ruby 1.9.0 (2004-11-30) [i686-linux]
#<ThreadGroup:0x403325e8>
[]
Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.738
diff -u -2 -p -r1.738 eval.c
--- eval.c 30 Nov 2004 17:28:16 -0000 1.738
+++ eval.c 1 Dec 2004 15:31:45 -0000
@@ -9787,4 +9787,5 @@ thread_mark(th)
rb_gc_mark(th->last_match);
rb_mark_tbl(th->locals);
+ rb_gc_mark(th->thgroup);
/* mark data in copied stack */
@@ -12481,4 +12482,8 @@ thgroup_add(group, thread)
rb_secure(4);
th = rb_thread_check(thread);
+ if (!rb_obj_is_kind_of(thread, rb_cThread)) {
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)",
+ rb_obj_classname(thread));
+ }
if (OBJ_FROZEN(group)) {
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦