[#43610] Re: [ruby-list:48149] Re: requireが配列を取れたら便利だと思うんだけど.. — Hiroshi Nakamura <nakahiro@...>

cnVieS1saXN0GyRCJCskaTt9JEMkRk1oJF4kNyQ/ISMkRyRiQjMkKyRKJD0kJiEjGyhCCgoyMDEx

12 messages 2011/06/02

[#43643] DateTime.new! and DateTime.jd — Aaron Patterson <aaron.patterson@...>

こんにちは、アーロンです。

25 messages 2011/06/07
[#43647] Re: DateTime.new! and DateTime.jd — Tadayoshi Funaba <tadf@...> 2011/06/07

blocker はお前だろ。

[#43648] Re: DateTime.new! and DateTime.jd — Yukihiro Matsumoto <matz@...> 2011/06/07

まつもと ゆきひろです

[#43651] Re: DateTime.new! and DateTime.jd — Tadayoshi Funaba <tadf@...> 2011/06/07

> うーん、ただでさえ日英のコミュニケーション障壁があるのに、よ

[#43653] Re: DateTime.new! and DateTime.jd — Aaron Patterson <aaron.patterson@...> 2011/06/07

2011/6/7 Tadayoshi Funaba <tadf@dotrb.org>:

[#43657] Re: DateTime.new! and DateTime.jd — Tadayoshi Funaba <tadf@...> 2011/06/07

皆さんってのに俺は入ってないみたいだな。

[#43661] Re: DateTime.new! and DateTime.jd — Yukihiro Matsumoto <matz@...> 2011/06/07

まつもと ゆきひろです

[#43662] Re: DateTime.new! and DateTime.jd — Tadayoshi Funaba <tadf@...> 2011/06/07

> Aaronが言ってる「リリース」は1.9.3のことだと思いますよ。

[#43645] Re: [ruby-core:36778] Re: 1.8.7 release next month — Urabe Shyouhei <shyouhei@...>

Moving to ruby-dev to understand strategies of backporting the Tk

13 messages 2011/06/07

[#43787] [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Kenta Murata <muraken@...>

24 messages 2011/06/13
[#43788] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Yukihiro Matsumoto <matz@...> 2011/06/13

まつもと ゆきひろです

[#43789] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Tadayoshi Funaba <tadf@...> 2011/06/13

もう結論が出てしまったようですが、これは、元々 lib/complex.rb にあった

[#43794] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Kenta Murata <muraken@...> 2011/06/13

=E3=82=80=E3=82=89=E3=81=9F=E3=81=A7=E3=81=99=E3=80=82

[#43795] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Tadayoshi Funaba <tadf@...> 2011/06/13

> complex.rb をロードすると Math が CMath 相当に置き換わりますから、

[#43797] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Kenta Murata <muraken@...> 2011/06/14

=E3=82=80=E3=82=89=E3=81=9F=E3=81=A7=E3=81=99=E3=80=82

[#43799] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Yukihiro Matsumoto <matz@...> 2011/06/14

まつもと ゆきひろです

[#43800] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Kenta Murata <muraken@...> 2011/06/14

=E3=82=80=E3=82=89=E3=81=9F=E3=81=A7=E3=81=99=E3=80=82

[#43803] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Tadayoshi Funaba <tadf@...> 2011/06/14

> これに相当する事をやっているのが complex.rb なので、

[#43806] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Yusuke ENDOH <mame@...> 2011/06/14

遠藤です。

[#43807] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Tadayoshi Funaba <tadf@...> 2011/06/14

> 定義域を増やすだけにしよう、ということですよね。賛成です。

[#43809] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Yusuke ENDOH <mame@...> 2011/06/14

2011年6月14日22:17 Tadayoshi Funaba <tadf@dotrb.org>:

[#43810] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Tadayoshi Funaba <tadf@...> 2011/06/14

> 互換性がないという点では同じ話だと思うのですが……。

[#43811] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Yusuke ENDOH <mame@...> 2011/06/14

2011年6月14日23:02 Tadayoshi Funaba <tadf@dotrb.org>:

[#43812] Re: [Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか — Tadayoshi Funaba <tadf@...> 2011/06/14

> いやあ、5 月末の feature freeze 時点では -2 を返していたはずなんですが、

[#43852] [Ruby 1.9 - Bug #4909][Open] trapハンドラは再入されてはいけないのではないか? — Motohiro KOSAKI <kosaki.motohiro@...>

11 messages 2011/06/20

[ruby-dev:43785] [Ruby 1.9 - Bug #4855][Assigned] rb_context_t::saved_thread::machine_stack_(start|end) should be cleared

From: Tomoyuki Chikanaga <nagachika00@...>
Date: 2011-06-13 14:06:15 UTC
List: ruby-dev #43785
Issue #4855 has been updated by Tomoyuki Chikanaga.

Status changed from Open to Assigned

別途メールで芝さんに確認して頂けました。問題なさそうなのでこれでコミットします。
----------------------------------------
Bug #4855: rb_context_t::saved_thread::machine_stack_(start|end) should be cleared
http://redmine.ruby-lang.org/issues/4855

Author: Tomoyuki Chikanaga
Status: Assigned
Priority: Normal
Assignee: Tomoyuki Chikanaga
Category: core
Target version: 1.9.x
ruby -v: ruby 1.9.3dev (2011-06-08 trunk 31957) [x86_64-darwin10.7.0]


近永と申します。英語で説明するのが難しいのでruby-devで失礼します。

#4827 の調査の途上で再現スクリプトを valgrind つきで実行すると以下のように
不正な領域を machine stack として mark しようとしているようなメッセージが出ました。
(ただし FIBER_USE_NATIVE=0 にした場合です)。

==27771== Invalid read of size 4
==27771==    at 0x809AC1E: mark_locations_array (gc.c:1373)
==27771==    by 0x809ACED: gc_mark_locations (gc.c:1389)
==27771==    by 0x809D018: rb_gc_mark_machine_stack (gc.c:2498)
==27771==    by 0x819684E: rb_thread_mark (vm.c:1700)
==27771==    by 0x819FC05: cont_mark (cont.c:141)
==27771==    by 0x819FE09: fiber_mark (cont.c:268)
==27771==    by 0x809B6FF: gc_mark_children (gc.c:1813)
==27771==    by 0x809B27C: gc_mark (gc.c:1605)
==27771==    by 0x809B2B6: rb_gc_mark (gc.c:1611)
==27771==    by 0x8196790: rb_thread_mark (vm.c:1690)
==27771==    by 0x809B6FF: gc_mark_children (gc.c:1813)
==27771==    by 0x809B27C: gc_mark (gc.c:1605)
==27771==    by 0x809B2B6: rb_gc_mark (gc.c:1611)
==27771==    by 0x819620E: vm_mark_each_thread_func (vm.c:1493)
==27771==    by 0x8136FD9: st_foreach (st.c:747)
==27771==    by 0x819627B: rb_vm_mark (vm.c:1516)
==27771==    by 0x809B6FF: gc_mark_children (gc.c:1813)
==27771==    by 0x809B27C: gc_mark (gc.c:1605)
==27771==    by 0x809B2B6: rb_gc_mark (gc.c:1611)
==27771==    by 0x809CC23: gc_marks (gc.c:2423)
==27771==    by 0x809CE98: garbage_collect (gc.c:2474)
==27771==    by 0x8099C08: garbage_collect_with_gvl (gc.c:689)
==27771==    by 0x8099CB6: vm_malloc_prepare (gc.c:719)
==27771==    by 0x8099CE9: vm_xmalloc (gc.c:751)
==27771==    by 0x8099EBB: ruby_xmalloc2 (gc.c:831)
==27771==    by 0x81A005C: cont_save_machine_stack (cont.c:350)
==27771==    by 0x81A0E70: fiber_store (cont.c:1187)
==27771==    by 0x81A10D5: fiber_switch (cont.c:1277)
==27771==    by 0x81A113A: rb_fiber_transfer (cont.c:1292)
==27771==    by 0x81A11E4: rb_fiber_yield (cont.c:1311)
==27771==    by 0x81A1293: rb_fiber_s_yield (cont.c:1389)
==27771==    by 0x8185238: call_cfunc (vm_insnhelper.c:317)
==27771==    by 0x8185B7C: vm_call_cfunc (vm_insnhelper.c:404)
==27771==    by 0x8186091: vm_call_method (vm_insnhelper.c:526)
==27771==    by 0x818A6C7: vm_exec_core (insns.def:1012)
==27771==    by 0x8195705: vm_exec (vm.c:1163)
==27771==    by 0x8194404: invoke_block_from_c (vm.c:574)
==27771==    by 0x81945BE: rb_vm_invoke_proc (vm.c:620)
==27771==    by 0x81A0C93: rb_fiber_start (cont.c:1121)
==27771==    by 0x808AF19: ruby_exec_internal (eval.c:213)
==27771==    by 0x808AFF9: ruby_exec_node (eval.c:260)
==27771==    by 0x808AFD3: ruby_run_node (eval.c:253)
==27771==    by 0x805B1CD: main (main.c:38)
==27771==  Address 0xbed8aa48 is not stack'd, malloc'd or (recently) free'd

これは rb_context_t::saved_thread に thread の情報を格納した後
すぐに machine_stack_(start|end) を 0 クリアせず、そのまま vm stack の確保のために GC が走る
可能性があり、その時に saved_thread->machine_stack_end に保存されているアドレスが
現在のスタック末尾よりも伸びている場合に余分な領域まで mark してしまうようです。
一度は実際にそこまで machine stack が伸長していたわけなので、不正メモリアクセスエラーになる
危険はないかもしれませんが、無駄な mark を省くために修正したいと思います。

そこで saved_thread にコピーする時は常にすぐ machine_stack_(start|end) をクリアするようにしました。
また __ia64 では machine_register_stack_(start|end) というメンバもありこれも同様にしてみました。
ただ IA64 環境が使えないので動作は未確認です。

saved_thread.machine_stack_(start|end) の用途については cont.c を読んで以下のように
理解しているのでこれで良いと思っていますが、かなり込み入っているので
ささださんや現在の Fiber 実装された芝さんにチェックしていただきたいと思いパッチ投稿します。

 * FIBER_USE_NATIVE=0 の時(setjmp/longjmp 利用時)
saved_thread.machine_stack_(start|end) は利用しない。常に 0 で良い。

 * FIBER_USE_NATIVE=1 の時
saved_thread.machine_stack_end は利用しない。常に 0 で良い。
saved_thread.machine_stack_start は Thread の実行中の Fiber でない間は
ucontext_t::uc_stack のスタックを指しておく。
saved_thread に格納した後で 0 クリアしても fiber_setcontext() で改めて
保存されるので大丈夫。




-- 
http://redmine.ruby-lang.org

In This Thread

Prev Next