[#26266] pragma on ripper — nobuyoshi nakada <nobuyoshi.nakada@...>

なかだです。

15 messages 2005/06/02

[#26312] rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org>

最近、とあるプログラム(五月雨)が、無限ループに陥ることが何回かありました。

32 messages 2005/06/09
[#26323] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/10

In article <TYOMLEM04Rqf69aZbLA0000002d@tyomlvem02.e2k.ad.ge.com>,

[#26329] Re: rb_gc_mark_threads spin — nobu@... 2005/06/10

なかだです。

[#26331] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/11

In article <200506101543.j5AFhToG009328@sharui.nakada.niregi.kanuma.tochigi.jp>,

[#26333] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/11

In article <8764wlil9l.fsf@m17n.org>,

[#26334] Re: rb_gc_mark_threads spin — nobu@... 2005/06/11

なかだです。

[#26337] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/11

In article <200506111335.j5BDZkoG019423@sharui.nakada.niregi.kanuma.tochigi.jp>,

[#26405] WEBrick DoS vulnerability — Tanaka Akira <akr@...17n.org>

NetBSD 2.0 で WEBrick を使って HTTP サーバを動かした場合、クライアント

24 messages 2005/06/29
[#26477] Re: WEBrick DoS vulnerability — GOTOU Yuuzou <gotoyuzo@...> 2005/07/08

ごとうゆうぞうです。

[#26480] Re: WEBrick DoS vulnerability — Tanaka Akira <akr@...17n.org> 2005/07/08

In article <20050708.175802.957830318.gotoyuzo@sawara.does.notwork.org>,

[#26481] Re: WEBrick DoS vulnerability — GOTOU Yuuzou <gotoyuzo@...> 2005/07/08

In message <87fyupzgcq.fsf@m17n.org>,

[#26421] Subversion — Shugo Maeda <shugo@...>

前田です。

24 messages 2005/06/30
[#26422] Re: Subversion — Yukihiro Matsumoto <matz@...> 2005/06/30

まつもと ゆきひろです

[#26423] Re: Subversion — "U.Nakamura" <usa@...> 2005/06/30

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

[ruby-dev:26337] Re: rb_gc_mark_threads spin

From: Tanaka Akira <akr@...17n.org>
Date: 2005-06-11 16:13:37 UTC
List: ruby-dev #26337
In article <200506111335.j5BDZkoG019423@sharui.nakada.niregi.kanuma.tochigi.jp>,
  nobu@ruby-lang.org writes:

> rb_thread_terminated() から呼ばれた rb_thread_schedule() で、他
> の生きているスレッドに終了したスレッドのコンテキストを保存して
> しまうからじゃないかと思うのですが、確証はありません。

ふむ。curr_thread は実際のスタックに対応するスレッドを表現しているんで
すかね。

> ちなみに、この修正では[ruby-dev:26128]はどうなんでしょうか。

結局、調べてしまいました。

これは curr_thread ですでに rb_thread_terminated が終わって
THREAD_KILLED になっていて、main thread に SystemExit が伝播しないのが
原因のようです。

curr_thread をどうするかという点にも依存しますが、curr_thread を現在の
ままとすれば、こんな感じですかね。

Index: eval.c
===================================================================
RCS file: /src/ruby/eval.c,v
retrieving revision 1.788
diff -u -p -r1.788 eval.c
--- eval.c	10 Jun 2005 14:57:37 -0000	1.788
+++ eval.c	11 Jun 2005 15:55:54 -0000
@@ -4317,17 +4317,6 @@ terminate_process(status, mesg, mlen)
     rb_exc_raise(rb_class_new_instance(2, args, rb_eSystemExit));
 }
 
-void
-rb_exit(status)
-    int status;
-{
-    if (prot_tag) {
-	terminate_process(status, "exit", 4);
-    }
-    ruby_finalize();
-    exit(status);
-}
-
 
 /*
  *  call-seq:
@@ -10225,9 +10214,9 @@ rb_gc_mark_threads()
     rb_gc_mark((VALUE)ruby_cref);
 
     if (!curr_thread) return;
-    FOREACH_THREAD(th) {
+    FOREACH_THREAD_FROM(main_thread, th) {
 	rb_gc_mark(th->thread);
-    } END_FOREACH(th);
+    } END_FOREACH_FROM(main_thread, th);
     if (new_thread.thread) {
 	rb_gc_mark(new_thread.thread->thread);
 	rb_gc_mark(new_thread.proc);
@@ -10284,6 +10273,20 @@ static char *th_signm;
 #define RESTORE_EXIT		7
 
 extern VALUE *rb_gc_stack_start;
+
+void
+rb_exit(status)
+    int status;
+{
+    if (curr_thread->status == THREAD_KILLED) {
+        rb_thread_main_jump(ruby_errinfo, RESTORE_EXIT);
+    }
+    if (prot_tag) {
+	terminate_process(status, "exit", 4);
+    }
+    ruby_finalize();
+    exit(status);
+}
 
 static void
 rb_thread_save_context(th)
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread