From: nobu.nakada@... Date: 2003-10-09T21:42:33+09:00 Subject: [ruby-dev:21584] Re: core dump in rb_thread_schedule なかだです。 At Thu, 9 Oct 2003 20:57:01 +0900, Tanaka Akira wrote: > うぅむ。20:50 ごろに落ちました。 > 8589 if (!found && th->status <= THREAD_RUNNABLE) { > (gdb) p found > $1 = 0 > (gdb) p th > $2 = 0x746867 > (gdb) p th->status > Cannot access memory at address 0x746963 > (gdb) p *th > Cannot access memory at address 0x746867 main_threadとcurr_threadからnextをたどって見せてもらえますか。 1.552, 1.554, 1.557をback outするパッチです。これで変化はあるで しょうか。 Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.557 diff -u -2 -p -r1.557 eval.c --- eval.c 9 Oct 2003 10:11:48 -0000 1.557 +++ eval.c 9 Oct 2003 12:38:46 -0000 @@ -4163,8 +4163,4 @@ rb_yield_0(val, self, klass, flags, aval if (state) goto pop_state; } - if (!node) { - state = 0; - goto pop_state; - } PUSH_ITER(block->iter); @@ -4172,5 +4168,8 @@ rb_yield_0(val, self, klass, flags, aval if ((state = EXEC_TAG()) == 0) { redo: - if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) { + if (!node) { + result = Qnil; + } + else if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) { if (node->nd_state == YIELD_FUNC_AVALUE) { if (!avalue) { @@ -6456,5 +6455,4 @@ call_end_proc(data) PUSH_FRAME(); ruby_frame->self = ruby_frame->prev->self; - ruby_frame->node = 0; ruby_frame->last_func = 0; ruby_frame->last_class = 0; @@ -7023,5 +7021,4 @@ proc_invoke(proc, args, self, klass) PUSH_ITER(ITER_CUR); ruby_frame->iter = ITER_CUR; - ruby_current_node = data->body; PUSH_TAG((pcall || orphan) ? PROT_PCALL : PROT_CALL); state = EXEC_TAG(); @@ -8178,5 +8175,5 @@ rb_thread_check(data) } -static VALUE rb_thread_raise _((int, VALUE*, rb_thread_t)); +static VALUE rb_thread_raise _((int, VALUE*, volatile rb_thread_t)); static int th_raise_argc; @@ -9380,11 +9377,12 @@ rb_thread_stop_timer() static VALUE -rb_thread_start_0(fn, arg, th) +rb_thread_start_0(fn, arg, th_arg) VALUE (*fn)(); void *arg; - rb_thread_t th; + rb_thread_t th_arg; { - volatile rb_thread_t th_save = th; - struct BLOCK *volatile saved_block = 0, *block; + volatile rb_thread_t th = th_arg; + volatile VALUE thread = th->thread; + volatile struct BLOCK* saved_block = 0; enum thread_status status; int state; @@ -9409,5 +9407,5 @@ rb_thread_start_0(fn, arg, th) if (THREAD_SAVE_CONTEXT(curr_thread)) { - return th_save->thread; + return thread; } @@ -9437,9 +9435,4 @@ rb_thread_start_0(fn, arg, th) th->result = (*fn)(arg, th); } - th = th_save; - } - else if (TAG_DST()) { - th = th_save; - th->result = prot_tag->retval; } POP_TAG(); @@ -9449,10 +9442,10 @@ rb_thread_start_0(fn, arg, th) rb_thread_remove(th); - for (block = saved_block; block;) { - struct BLOCK *tmp = block; + while (saved_block) { + volatile struct BLOCK *tmp = saved_block; if (tmp->frame.argc > 0) free(tmp->frame.argv); - block = tmp->prev; + saved_block = tmp->prev; free((void*)tmp); } @@ -9747,8 +9740,6 @@ rb_thread_raise(argc, argv, th) int argc; VALUE *argv; - rb_thread_t th; + volatile rb_thread_t th; { - volatile rb_thread_t th_save = th; - if (rb_thread_dead(th)) return Qnil; if (curr_thread == th) { @@ -9758,5 +9749,5 @@ rb_thread_raise(argc, argv, th) if (!rb_thread_dead(curr_thread)) { if (THREAD_SAVE_CONTEXT(curr_thread)) { - return th_save->thread; + return th->thread; } } @@ -9921,6 +9912,5 @@ rb_callcc(self) { volatile VALUE cont; - rb_thread_t th; - volatile rb_thread_t th_save; + volatile rb_thread_t th; struct tag *tag; struct RVarmap *vars; @@ -9940,7 +9930,6 @@ rb_callcc(self) } - th_save = th; if (THREAD_SAVE_CONTEXT(th)) { - return th_save->result; + return th->result; } else { -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦