梅本です。
FreeBSD の ports に最近
http://www.freebsd.org/cgi/cvsweb.cgi/ports/lang/ruby18/files/patch-eval.c?rev=1.3&content-type=text/x-cvsweb-markup
というパッチが追加されたのですが、それ以降、xcgroup が落ちるようになっ
たと報告を受けました。
/usr/local/lib/ruby/1.8/timeout.rb:52: [BUG] Segmentation fault ruby
1.8.4 (2005-12-24) [i386-freebsd6]
ちなみに、patch-eval.c が追加される直前の ports では問題なく動作して
いました。
# xcgroup は、XCAST6 (http://sourceforge.net/projects/xcast6/) のグルー
# プを管理するプログラムです。マイナーなプログラムで申し訳ありません。
#
# http://cvs.sourceforge.net/viewcvs.py/xcast6/xcgroup/
FreeBSD の ports に patch-eval.c が入った時の commit log には
Fix build on sparc64
とあるのですが、パッチを見ると、FUNCTION_CALL_MAY_RETURN_TWICE を追加
する部分が、sparc64 以外の arch にも影響しています。
patch-eval.c と同等の修正が Ruby の Repo. にも入っています。
http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/eval.c.diff?r1=1.870;r2=1.871
http://lists.freebsd.org/pipermail/freebsd-sparc64/2006-January/003731.html
から始まるスレッドを見ると、
http://lists.freebsd.org/pipermail/freebsd-sparc64/2006-January/003739.html
で投稿されている元々のパッチでは FUNCTION_CALL_MAY_RETURN_TWICE を
getcontext(&(j)->context), の前から後にずらしているだけだったのが、
amd64 ではダメだということで、getcontext() の前後に加えるように変更さ
れ、Ruby Repo. に commit されたようです。
試しに、更に
Index: eval.c
diff -u -p eval.c.orig eval.c
--- eval.c.orig Fri Jan 20 12:35:30 2006
+++ eval.c Fri Jan 20 12:37:05 2006
@@ -166,7 +166,6 @@ int function_call_may_return_twice_false
#endif
#define ruby_longjmp(env, val) rb_jump_context(env, val)
#define ruby_setjmp(j) ((j)->status = 0, \
- FUNCTION_CALL_MAY_RETURN_TWICE, \
getcontext(&(j)->context), \
FUNCTION_CALL_MAY_RETURN_TWICE, \
(j)->status)
という変更を加えたところ、問題なく xcgroup が動作するようになりました。
どうやら、getcontext() の前後に加えると、i386 で問題があるようです。
FUNCTION_CALL_MAY_RETURN_TWICE をどこに入れるか、arch 毎に分けないとい
けないように思うのですが、いかがでしょうか?
--
梅本 肇 @ インターネット互助会横浜 http://www.imasy.org/~ume/
ume@xxxxxxxxxxxx ume@{,jp.}FreeBSD.org
プログラムは書いた人の意図ではなく書かれた通り動く I hate Modula-3 :-)
|