[#25035] 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...>

こんにちは。

16 messages 2004/12/03
[#25070] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — nobu@... 2004/12/06

なかだです。

[#25071] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...> 2004/12/06

In message <200412060607.iB667giF007533@sharui.nakada.niregi.kanuma.tochigi.jp>

[#25089] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — nobu@... 2004/12/07

なかだです。

[#25090] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...> 2004/12/07

In message <200412070015.iB70FAiF012770@sharui.nakada.niregi.kanuma.tochigi.jp>

[#25093] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — akira yamada / やまだあきら <akira@...> 2004/12/07

2004-12-07 (火) の 12:27 +0900 に Takahiro Kambe さんは書きました:

[#25041] temporal locking already locked string on simultaneous write — Tanaka Akira <akr@...17n.org>

同じ文字列をほぼ同時に IO に書き込むと、temporal locking already

13 messages 2004/12/04
[#25042] Re: temporal locking already locked string on simultaneous write — Yukihiro Matsumoto <matz@...> 2004/12/04

まつもと ゆきひろです

[#25043] Re: temporal locking already locked string on simultaneous write — Tanaka Akira <akr@...17n.org> 2004/12/04

In article <1102133507.339625.10453.nullmailer@x31.priv.netlab.jp>,

[#25096] double free problem — "Akinori MUSHA" <knu@...>

 ご無沙汰しております。

15 messages 2004/12/07
[#25099] Re: double free problem — Yukihiro Matsumoto <matz@...> 2004/12/07

Hi,

[#25101] non-stdio buffering — Tanaka Akira <akr@...17n.org>

えぇと、今回 1.9 でなにが起きたのかを私が把握している範囲でまとめてお

18 messages 2004/12/07

[#25152] 1.8 reopen problem with duplex popen — Tanaka Akira <akr@...17n.org>

次のように、1.8 で双方向 popen な IO を reopen するとエラーになること

11 messages 2004/12/10

[#25158] core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org>

NetBSD 2.0 で次のようにすると core を吐きます。

18 messages 2004/12/11
[#25159] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/11

In article <87hdmsivva.fsf@serein.a02.aist.go.jp>,

[#25163] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/12

In article <87ekhwiv7g.fsf@serein.a02.aist.go.jp>,

[#25165] Re: core dump on NetBSD 2.0 — nobu@... 2004/12/13

なかだです。

[#25167] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/13

In article <200412130040.iBD0e8Qh003275@sharui.nakada.niregi.kanuma.tochigi.jp>,

[#25193] 1.8.2 release schedule — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

15 messages 2004/12/14

[#25299] Re: リリース準備 — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

20 messages 2004/12/24
[#25301] Re: リリース準備 — TAKAHASHI Masayoshi <maki@...> 2004/12/24

高橋征義です。

[#25302] test_readline.rb blocks on BSD again — GOTOU Yuuzou <gotoyuzo@...>

In message <20041223175402.3116FC6718@lithium.ruby-lang.org>,

15 messages 2004/12/24
[#25314] Re: test_readline.rb blocks on BSD again — GOTOU Yuuzou <gotoyuzo@...> 2004/12/24

In message <20041224.131211.846943951.gotoyuzo@sawara.does.notwork.org>,

[#25315] Re: test_readline.rb blocks on BSD again — Yukihiro Matsumoto <matz@...> 2004/12/24

まつもと ゆきひろです

[#25317] Re: test_readline.rb blocks on BSD again — WATANABE Hirofumi <eban@...> 2004/12/25

わたなべです。

[ruby-dev:25291] GC problem assistant

From: Tanaka Akira <akr@...17n.org>
Date: 2004-12-23 11:24:35 UTC
List: ruby-dev #25291
unknown node type 0, called on terminated object, SEGV など、GC のタイ
ミングに依存して起こる問題はなかなか修正するのが難しいので、GC の情報
をもっと記録するパッチを書いてみました。

* GC が何回起きたか
* GC されたオブジェクトが何回目の GC で回収されたか
* 最後の GC がどこで起きたか (要 gcc, platform にも依存?)

という情報を記録します。

また、called on terminated object が起きたら NotImplementedError じゃ
なくて即座に core を吐いてそれらの情報を保全し、ついでに SIGSEGV,
SIGBUS が来た時の signal handler は stack を微妙に壊してしまうことがあ
るので除去してあります。

GC の問題で悩んでいる人がいれば、試してみるといいかもしれません。
まぁ、このパッチ自体が問題を解決するわけじゃありませんが。

Index: eval.c
===================================================================
RCS file: /src/ruby/eval.c,v
retrieving revision 1.747
diff -u -p -r1.747 eval.c
--- eval.c	16 Dec 2004 15:01:48 -0000	1.747
+++ eval.c	23 Dec 2004 11:10:54 -0000
@@ -3865,7 +3865,7 @@ rb_eval(self, n)
 	break;
 
       default:
-	rb_bug("unknown node type %d", nd_type(node));
+	rb_bug("unknown node type %d (0x%lx)", nd_type(node), (long)node);
     }
   finish:
     CHECK_INTS;
@@ -5741,8 +5741,8 @@ rb_call(klass, recv, mid, argc, argv, sc
     struct cache_entry *ent;
 
     if (!klass) {
-	rb_raise(rb_eNotImpError, "method `%s' called on terminated object (0x%lx)",
-		 rb_id2name(mid), recv);
+	rb_bug("method `%s' called on terminated object (0x%lx)",
+               rb_id2name(mid), recv);
     }
     /* is it in the method cache? */
     ent = cache + EXPR1(klass, mid);
Index: gc.c
===================================================================
RCS file: /src/ruby/gc.c,v
retrieving revision 1.194
diff -u -p -r1.194 gc.c
--- gc.c	20 Dec 2004 13:55:00 -0000	1.194
+++ gc.c	23 Dec 2004 11:10:54 -0000
@@ -284,6 +284,7 @@ typedef struct RVALUE {
 	struct {
 	    unsigned long flags;	/* always 0 for freed obj */
 	    struct RVALUE *next;
+            long gc_count;
 	} free;
 	struct RBasic  basic;
 	struct RObject object;
@@ -308,6 +309,7 @@ typedef struct RVALUE {
 #endif
 } RVALUE;
 
+static long gc_count = 0;
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
@@ -370,6 +372,7 @@ add_heap()
     while (p < pend) {
 	p->as.free.flags = 0;
 	p->as.free.next = freelist;
+	p->as.free.gc_count = gc_count;
 	freelist = p;
 	p++;
     }
@@ -1004,6 +1007,7 @@ finalize_list(p)
 	if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */
 	    p->as.free.flags = 0;
 	    p->as.free.next = freelist;
+            p->as.free.gc_count = gc_count;
 	    freelist = p;
 	}
 	p = tmp;
@@ -1038,6 +1042,7 @@ gc_sweep()
     unsigned long live = 0;
 
     mark_source_filename(ruby_sourcefile);
+    if (source_filenames)
     st_foreach(source_filenames, sweep_source_filename, 0);
 
     freelist = 0;
@@ -1057,6 +1062,7 @@ gc_sweep()
 		if (need_call_final && FL_TEST(p, FL_FINALIZE)) {
 		    p->as.free.flags = FL_MARK; /* remain marked */
 		    p->as.free.next = final_list;
+                    p->as.free.gc_count = gc_count;
 		    final_list = p;
 		}
 		else {
@@ -1113,6 +1119,7 @@ rb_gc_force_recycle(p)
 {
     RANY(p)->as.free.flags = 0;
     RANY(p)->as.free.next = freelist;
+    RANY(p)->as.free.gc_count = -1;
     freelist = RANY(p);
 }
 
@@ -1288,6 +1295,11 @@ int rb_setjmp (rb_jmp_buf);
 #endif /* __human68k__ or DJGPP */
 #endif /* __GNUC__ */
 
+#ifdef __GNUC__
+void *main_return_address;
+static void *last_gc_stacktrace[10];
+#endif
+
 static void
 garbage_collect()
 {
@@ -1310,6 +1322,25 @@ garbage_collect()
     if (during_gc) return;
     during_gc++;
 
+    gc_count++;
+    if (gc_count < 0)
+        gc_count = 0;
+
+#ifdef __GNUC__
+    memset(last_gc_stacktrace, 0, sizeof(last_gc_stacktrace));
+    if ((last_gc_stacktrace[0] = __builtin_return_address(0)) == main_return_address) goto gc_stacktrace_done;
+    if ((last_gc_stacktrace[1] = __builtin_return_address(1)) == main_return_address) goto gc_stacktrace_done;
+    if ((last_gc_stacktrace[2] = __builtin_return_address(2)) == main_return_address) goto gc_stacktrace_done;
+    if ((last_gc_stacktrace[3] = __builtin_return_address(3)) == main_return_address) goto gc_stacktrace_done;
+    if ((last_gc_stacktrace[4] = __builtin_return_address(4)) == main_return_address) goto gc_stacktrace_done;
+    if ((last_gc_stacktrace[5] = __builtin_return_address(5)) == main_return_address) goto gc_stacktrace_done;
+    if ((last_gc_stacktrace[6] = __builtin_return_address(6)) == main_return_address) goto gc_stacktrace_done;
+    if ((last_gc_stacktrace[7] = __builtin_return_address(7)) == main_return_address) goto gc_stacktrace_done;
+    if ((last_gc_stacktrace[8] = __builtin_return_address(8)) == main_return_address) goto gc_stacktrace_done;
+    if ((last_gc_stacktrace[9] = __builtin_return_address(9)) == main_return_address) goto gc_stacktrace_done;
+    gc_stacktrace_done: ;
+#endif
+
     init_mark_stack();
     
     /* mark frame stack */
Index: main.c
===================================================================
RCS file: /src/ruby/main.c,v
retrieving revision 1.13
diff -u -p -r1.13 main.c
--- main.c	23 Jun 2004 12:59:01 -0000	1.13
+++ main.c	23 Dec 2004 11:10:54 -0000
@@ -21,6 +21,10 @@
 static void objcdummyfunction( void ) { objc_msgSend(); }
 #endif
 
+#ifdef __GNUC__
+extern void *main_return_address;
+#endif
+
 int
 main(argc, argv, envp)
     int argc;
@@ -31,6 +35,10 @@ main(argc, argv, envp)
 #endif
 #if defined(__MACOS__) && defined(__MWERKS__)
     argc = ccommand(&argv);
+#endif
+
+#ifdef __GNUC__
+    main_return_address = __builtin_return_address(0);
 #endif
 
     ruby_init();
Index: signal.c
===================================================================
RCS file: /src/ruby/signal.c,v
retrieving revision 1.55
diff -u -p -r1.55 signal.c
--- signal.c	30 Nov 2004 17:28:16 -0000	1.55
+++ signal.c	23 Dec 2004 11:10:54 -0000
@@ -878,10 +878,10 @@ Init_signal()
 #endif
 
 #ifdef SIGBUS
-    install_sighandler(SIGBUS, sigbus);
+    /*install_sighandler(SIGBUS, sigbus);*/
 #endif
 #ifdef SIGSEGV
-    install_sighandler(SIGSEGV, sigsegv);
+    /*install_sighandler(SIGSEGV, sigsegv);*/
 #endif
 #ifdef SIGPIPE
     install_sighandler(SIGPIPE, sigpipe);

-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread

Prev Next