[#28230] bcc32 memory manager — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

15 messages 2006/01/18

[#28243] FUNCTION_CALL_MAY_RETURN_TWICE — Hajimu UMEMOTO <ume@...>

梅本です。

18 messages 2006/01/20

[#28270] Re: [PATCH] solaris 10 isinf and ruby_setenv fixes — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

17 messages 2006/01/23
[#28271] Re: [PATCH] solaris 10 isinf and ruby_setenv fixes — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2006/01/23

山本です。

[#28272] Re: [PATCH] solaris 10 isinf and ruby_setenv fixes — WATANABE Hirofumi <eban@...> 2006/01/23

わたなべです。

[#28273] Re: [PATCH] solaris 10 isinf and ruby_setenv fixes — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2006/01/23

山本です。

[#28274] Re: [PATCH] solaris 10 isinf and ruby_setenv fixes — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2006/01/24

山本です。

[#28275] Re: [PATCH] solaris 10 isinf and ruby_setenv fixes — "U.Nakamura" <usa@...> 2006/01/24

こんにちは、なかむら(う)です。

[#28286] SEGV with zlib — Tanaka Akira <akr@...17n.org>

最近、Data オブジェクトの free 関数が気になっているのですが、

24 messages 2006/01/30
[#28303] Re: SEGV with zlib — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2006/02/06

山本です。

[#28304] Re: SEGV with zlib — Yukihiro Matsumoto <matz@...> 2006/02/06

まつもと ゆきひろです

[#28305] Re: SEGV with zlib — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2006/02/06

山本です。

[#28306] Re: SEGV with zlib — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2006/02/06

山本です。

[#28307] Re: SEGV with zlib — Tietew <tietew-ml-ruby-dev@...> 2006/02/06

[#28308] Re: SEGV with zlib — Yukihiro Matsumoto <matz@...> 2006/02/06

まつもとゆきひろです。

[ruby-dev:28205] Re: Intel C++ Compiler and HP aC++/ANSI C on IA64

From: Tanaka Akira <akr@...17n.org>
Date: 2006-01-04 16:14:14 UTC
List: ruby-dev #28205
In article <87fyofvyns.fsf@m17n.org>,
  Tanaka Akira <akr@m17n.org> writes:

> 問題は、setjmp/getcontext から (longjmp/setcontext 経由で)
> return した時に r32 以降 (register stack に保存されるレジス
> タ) が setjmp/getcontext の呼出し時とは違う値になっている可
> 能性があるにもかかわらずコンパイラがその可能性を想定しないコー
> ドを生成している、というところにあります。

これは HP aC++/ANSI C についてはあてはまらない気がしてきまし
た。

# Intel C++ Compiler については依然としてあてはまると考えて
# います。

違う値になっている原因をさらに追った結果、getcontext 以降に
書き換えられた影響ではなく、register stack を save するのと
getcontext の間に書き換えられた register が save した値に戻っ
てしまっているのが問題でした。

で、次のように rb_thread_save_context(th) をなるべく
getcontext に近づけたら -O2 でも core を吐かなくなりました。

# 完璧を期すために rb_thread_save_context(th) を呼んでから
# getcontext を tail call する関数を (アセンブリ言語で) 書く
# ことも考えなくはなかったのですが、まぁ、それはまた必要になっ
# てからということで。

あと、getcontext じゃなくて setjmp なら
rb_thread_save_context(th) との間にコードが入らないので近づ
けるまでもなく core を吐かないんじゃないかと思って試してみた
らやっぱり吐きませんでした。しかも、なんか getcontext よりか
なり速いです。(というか、HP-UX で getcontext を使った場合が
やけに遅い) bsp の取得も getcontext には依存していないことも
あり、もはや ia64 で特に setjmp を避ける意味はなかろうという
わけで、ia64 では常に getcontext を使うという特別扱いを除去
してあります。

Index: configure.in
===================================================================
RCS file: /src/ruby/configure.in,v
retrieving revision 1.294
diff -u -p -r1.294 configure.in
--- configure.in	27 Dec 2005 11:52:54 -0000	1.294
+++ configure.in	4 Jan 2006 15:50:30 -0000
@@ -781,7 +781,7 @@ if test x"$enable_pthread" = xyes; then
     fi
 fi
 if test x"$ac_cv_header_ucontext_h" = xyes; then
-    if test x"$target_cpu" = xia64 -o x"$rb_with_pthread" = xyes; then
+    if test x"$rb_with_pthread" = xyes; then
 	AC_CHECK_FUNCS(getcontext setcontext)
     fi
 fi
Index: eval.c
===================================================================
RCS file: /src/ruby/eval.c,v
retrieving revision 1.863
diff -u -p -r1.863 eval.c
--- eval.c	31 Dec 2005 13:57:20 -0000	1.863
+++ eval.c	4 Jan 2006 15:50:31 -0000
@@ -158,17 +158,18 @@ int function_call_may_return_twice_false
 #define FUNCTION_CALL_MAY_RETURN_TWICE 0
 #endif
 #define ruby_longjmp(env, val) rb_jump_context(env, val)
-#define ruby_setjmp(j) ((j)->status = 0, \
+#define ruby_setjmp(just_before_setjmp, j) ((j)->status = 0, \
+    (just_before_setjmp), \
     FUNCTION_CALL_MAY_RETURN_TWICE, \
     getcontext(&(j)->context), \
     (j)->status)
 #else
 typedef jmp_buf rb_jmpbuf_t;
 #if !defined(setjmp) && defined(HAVE__SETJMP)
-#define ruby_setjmp(env) _setjmp(env)
+#define ruby_setjmp(just_before_setjmp, env) ((just_before_setjmp), _setjmp(env))
 #define ruby_longjmp(env,val) _longjmp(env,val)
 #else
-#define ruby_setjmp(env) setjmp(env)
+#define ruby_setjmp(just_before_setjmp, env) ((just_before_setjmp), setjmp(env))
 #define ruby_longjmp(env,val) longjmp(env,val)
 #endif
 #endif
@@ -918,7 +919,7 @@ static struct tag *prot_tag;
 #define PROT_YIELD  INT2FIX(3)	/* 7 */
 #define PROT_TOP    INT2FIX(4)	/* 9 */
 
-#define EXEC_TAG()    (FLUSH_REGISTER_WINDOWS, ruby_setjmp(prot_tag->buf))
+#define EXEC_TAG()    (FLUSH_REGISTER_WINDOWS, ruby_setjmp(0, prot_tag->buf))
 
 #define JUMP_TAG(st) do {		\
     ruby_frame = prot_tag->frame;	\
@@ -10123,6 +10124,7 @@ rb_thread_save_context(rb_thread_t th)
         th->bstr_max = len;
     }
     th->bstr_len = len;
+    rb_ia64_flushrs();
     MEMCPY(th->bstr_ptr, th->bstr_pos, VALUE, th->bstr_len);
 #endif
 #ifdef SAVE_WIN32_EXCEPTION_LIST
@@ -10196,8 +10198,7 @@ rb_thread_switch(int n)
 }
 
 #define THREAD_SAVE_CONTEXT(th) \
-    (rb_thread_save_context(th),\
-     rb_thread_switch((FLUSH_REGISTER_WINDOWS, ruby_setjmp((th)->context))))
+    (rb_thread_switch((FLUSH_REGISTER_WINDOWS, ruby_setjmp(rb_thread_save_context(th), (th)->context))))
 
 NORETURN(static void rb_thread_restore_context(rb_thread_t,int));
 NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int,void*)));
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread

Prev Next