[#25636] [Oniguruma 3.X] reggnu.c — "K.Kosako" <sndgk393@...>

さっき気がついたのですが、元々は

15 messages 2005/02/05

[#25655] openssl binding for SSL_CTX_set_default_verify_paths and X509_STORE_set_default_paths — Tanaka Akira <akr@...17n.org>

open-uri で https を扱うことを考えていろいろと調べていた所、openssl で、

9 messages 2005/02/08
[#25670] Re: openssl binding for SSL_CTX_set_default_verify_paths and X509_STORE_set_default_paths — GOTOU Yuuzou <gotoyuzo@...> 2005/02/10

In message <876513vce0.fsf@serein.a02.aist.go.jp>,

[#25713] pthread trouble on sighandler — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

17 messages 2005/02/18
[#25714] Re: pthread trouble on sighandler — Yukihiro Matsumoto <matz@...> 2005/02/18

まつもと ゆきひろです

[#25755] I/O operation differs signal handler — Minero Aoki <aamine@...>

青木です。

14 messages 2005/02/24
[#25756] Re: I/O operation differs signal handler — Tanaka Akira <akr@...17n.org> 2005/02/24

In article <20050224091450P.aamine@loveruby.net>,

[ruby-dev:25742] Re: core dump with GC in rb_thread_save_context

From: Yukihiro Matsumoto <matz@...>
Date: 2005-02-22 03:57:32 UTC
List: ruby-dev #25742
まつもと ゆきひろです

In message "Re: [ruby-dev:25712] core dump with GC in rb_thread_save_context"
    on Fri, 18 Feb 2005 08:09:28 +0900, Tanaka Akira <akr@m17n.org> writes:

|昨日の夜からとあるプログラム (五月雨) が 4回ばかり core を吐いていて、
|それらで最後に GC が起きた所が一致しています。

分かりました。スレッド生成のためスタックを巻き戻している最中
にGCが起きると

  * curr_threadは生成元のスレッドを指している
  * が、スレッド生成のためスタックは巻き戻されている

ために生成元スタックがスキャンされず、オブジェクトがことごと
くGCに回収されてしまっていました。そこで、TAG_THREADをraise
する前にcurr_thread=thの設定と、thread_insert(th)の呼び出し
を行ってしまうことにしました。これはこれで問題を引き起こしそ
うですが。

ついでに、new_threadの内容もGCスキャンするようにしてみました
が、こちらは不要だったかもしれません。

Tue Feb 22 12:54:13 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_thread_start_0): update curr_thread before raising
	  TAG_THREAD.  [ruby-dev:25712]


--- eval.c	17 Feb 2005 14:29:20 -0000	1.754
+++ eval.c	22 Feb 2005 03:55:30 -0000
@@ -9943,2 +9951,7 @@ thread_mark(th)
 
+static struct {
+    rb_thread_t thread;
+    VALUE proc, arg;
+} new_thread;
+
 void
@@ -9955,2 +9968,7 @@ rb_gc_mark_threads()
     } END_FOREACH(th);
+    if (new_thread.thread) {
+	rb_gc_mark(new_thread.thread->thread);
+	rb_gc_mark(new_thread.proc);
+	rb_gc_mark(new_thread.arg);
+    }
 }
@@ -11605,7 +11624,2 @@ thread_insert(th)
 
-static struct {
-    rb_thread_t thread;
-    VALUE proc, arg;
-} new_thread;
-
 static VALUE
@@ -11654,2 +11668,4 @@ rb_thread_start_0(fn, arg, th)
 	th->anchor = ip;
+	thread_insert(th);
+	curr_thread = th;
 	longjmp((prot_tag = ip->tag)->buf, TAG_THREAD);
@@ -11749,4 +11765,2 @@ rb_thread_start_1()
 
-    thread_insert(th);
-
     ruby_frame = ip->frame;
@@ -11764,2 +11778,3 @@ rb_thread_start_1()
 	if (THREAD_SAVE_CONTEXT(th) == 0) {
+	    new_thread.thread = 0;
 	    curr_thread = th;

In This Thread