[[ followup in ruby-core ]]

 Well, the old problem

>>>>> "t" == ts  <decoux / moulon.inra.fr> writes:
t> Not really sure, but seems to be a bug in gcc : someone can test it with
t> another compiler ?

t>  An example to see the problem (ruby-1.8.0, gcc 3.2 Redhat 8)

[...]

t> svg% cat b.rb
t> #!/usr/bin/ruby
t> thread_block= Proc.new do
t>    1.upto(20000) do
t>       a = {1=>12}
t>    end
t>   Thread.new &thread_block
t> end

t> 1.upto(120) do |i|
t>    Thread.new &thread_block
t> end
t> p "END"
t> Thread.stop
t> svg% 

 in eval.c (thread_mark) there is

    frame = th->frame;
    while (frame && frame != top_frame) {
	frame = ADJ(frame);
	rb_gc_mark_frame(frame);
	if (frame->tmp) {
	    struct FRAME *tmp = frame->tmp;

	    while (tmp && tmp != top_frame) {
		tmp = ADJ(tmp);
		rb_gc_mark_frame(tmp);
		tmp = tmp->prev;
	    }
	}
	frame = frame->prev;
    }

 If I've well understood ADJ(frame) is used to adjust the value of frame if
 it's in the copied stack, no ?

 Now rb_gc_mark_frame(frame) will mark frame->argv, but if frame->argv is
 also in the copied stack, ruby must mark ADJ(frame->argv) rather than
 frame->argv, no ?


Guy Decoux