From: nobu.nakada@... Date: 2003-06-27T22:48:28+09:00 Subject: [ruby-dev:20479] Re: 原因不明のSEGV なかだです。 At Fri, 27 Jun 2003 22:38:54 +0900, Yukihiro Matsumoto wrote: > |> また〆切と戦っています。 > | > |じゃあ+1した理由を今思い出してもらうのは無理? > > 〆切を片付けて改めて考えてみるのですが、例によってどうにも思 > い出せません。 > > 変更は > > Fri Jun 11 15:21:21 1999 Yukihiro Matsumoto > > * gc.c (rb_gc_mark_locations): add safety margin 1. > > と記録されているもののようです。この辺のリストをあさってみる > となにか分かるかな。 漁ってはみたんですが、それらしいものは見付かりませんでした。 どうせマージン持たせるなら、いっそこのくらいしてはどうでしょう か。 Index: gc.c =================================================================== RCS file: /cvs/ruby/src/ruby/gc.c,v retrieving revision 1.48.2.35 diff -u -2 -p -r1.48.2.35 gc.c --- gc.c 23 Mar 2003 10:55:39 -0000 1.48.2.35 +++ gc.c 27 Jun 2003 13:16:29 -0000 @@ -435,5 +435,5 @@ rb_gc_mark_locations(start, end) end = tmp; } - n = end - start + 1; + n = end - start; mark_locations_array(start,n); } @@ -1096,4 +1096,8 @@ stack_growup_p(addr) #endif +#define STACK_ROUND_MASK 0xff +#define STACK_ROUND_DOWN(p) (VALUE *)((VALUE)(p) & ~STACK_ROUND_MASK) +#define STACK_ROUND_UP(p) STACK_ROUND_DOWN((VALUE)(p) + STACK_ROUND_MASK) + void Init_stack(addr) @@ -1107,8 +1111,10 @@ Init_stack(addr) if (rb_gc_stack_start) { if (stack_growup_p(addr)) { + addr = STACK_ROUND_DOWN(addr); if (rb_gc_stack_start > addr) rb_gc_stack_start = addr; } else { + addr = STACK_ROUND_UP(addr); if (rb_gc_stack_start < addr) rb_gc_stack_start = addr; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦