From: Motohiro KOSAKI Date: 2011-07-06T21:16:00+09:00 Subject: [ruby-dev:44044] [Ruby 1.9 - Bug #4983] Fiberのガードページの設定が間違ってる Issue #4983 has been updated by Motohiro KOSAKI. 別件でささださんに質問があるのですが、ファイバーのスタックサイズは #define FIBER_MACHINE_STACK_ALLOCATION_SIZE (0x10000 / sizeof(VALUE)) のように sizeof(VALUE)での割り算を入れることにより、sizeof(VALUE)の倍数を保とうとしている痕跡がありますが、 ガードページ用に1ページ食われてしまうので、結局、真のスタックサイズは sizeof(VALUE)の倍数である保証は なくなってしまっています。 これは問題ないでしょうか?それとも意図を誤読してます? ---------------------------------------- Bug #4983: Fiberのガードページの設定が間違ってる http://redmine.ruby-lang.org/issues/4983 Author: Motohiro KOSAKI Status: Assigned Priority: Normal Assignee: Motohiro KOSAKI Category: core Target version: 1.9.3 ruby -v: trunk 以下の関数でスタックのアロケーションとガードページの設定をしていますが、ガードページがPROT_READ|PROT_WRITEなのは なにかの間違いだと思います。あとで直しておきます。 static VALUE* fiber_machine_stack_alloc(size_t size) { VALUE *ptr; (snip) } else { void *page; STACK_GROW_DIR_DETECTION; ptr = (VALUE*)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); if (ptr == (VALUE*)(SIGNED_VALUE)-1) { rb_raise(rb_eFiberError, "can't alloc machine stack to fiber"); } page = ptr + STACK_DIR_UPPER((size - RB_PAGE_SIZE) / sizeof(VALUE), 0); if (mprotect(page, RB_PAGE_SIZE, PROT_READ | PROT_WRITE) < 0) { // ここ! rb_raise(rb_eFiberError, "mprotect failed"); -- http://redmine.ruby-lang.org