[Ruby 1.9 - Bug #4983][Assigned] Fiberのガードページの設定が間違ってる

Issue #4983 has been reported by Motohiro KOSAKI.


Bug #4983: Fiberのガードページの設定が間違ってる

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”);

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のガードページの設定が間違ってる

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”);