From: Yusuke ENDOH Date: 2007-07-02T00:31:09+09:00 Subject: [ruby-dev:31103] Re: segv when reentering into Fiber with callcc 遠藤です。 [ruby-dev:30926] がコミットされないのは忘れられているのでしょうか。 とりあえずこのパッチで segv が起きなくなることは確認しています。 07/06/08 に Nobuyoshi Nakada さんは書きました: > なかだです。 > > At Thu, 7 Jun 2007 19:44:26 +0900, > Yusuke ENDOH wrote in [ruby-dev:30923]: > > 前の例で落ちなくなることを確認しましたが、 > > また callcc と Fiber がらみで別の例を見つけてしまいました。 > > > > $ ./ruby -e ' > > c = callcc {|c| c } > > Fiber.new { c.call }.yield > > ' > > -e:3:in `
': unhandled exception > > SEGV recieved in SEGV handler > > スタックの保存用領域の二重解放のようですね。 > > > 同じ問題かどうかはわかりませんが、 > > 以下は Ctrl-C で止めた後に segv を受けます。 > > あと、エラーの行番号もなんか変です。 > > 行番号は手元のではちゃんと出てるんですが、どこの修正だったかな…。 > > > Index: cont.c > =================================================================== > --- cont.c (revision 12471) > +++ cont.c (working copy) > @@ -70,5 +70,9 @@ cont_free(void *ptr) > if (ptr) { > rb_context_t *cont = ptr; > - FREE_UNLESS_NULL(cont->saved_thread.stack); > + rb_thread_t *th = DATA_PTR(cont->saved_thread.self); > + > + if (cont->saved_thread.stack != th->stack) { > + FREE_UNLESS_NULL(cont->saved_thread.stack); > + } > FREE_UNLESS_NULL(cont->machine_stack); > FREE_UNLESS_NULL(cont->vm_stack); > > > -- > --- 僕の前にBugはない。 > --- 僕の後ろにBugはできる。 > 中田 伸悦 > > -- Yusuke ENDOH