[#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:26333] Re: rb_gc_mark_threads spin

From: Tanaka Akira <akr@...17n.org>
Date: 2005-06-11 10:39:25 UTC
List: ruby-dev #26333
In article <8764wlil9l.fsf@m17n.org>,
  Tanaka Akira <akr@m17n.org> writes:

> 直ってない感じです。

やっと自分で調べてみたのですが、こういう直しかたはどうでしょうね?

rb_thread_remove の時点で curr_thread を変えるとうまく動かなくなる原因
はよくわかっていないのですが。

なお、問題の修正は rb_gc_mark_threads のところだけで、あとは FD_ZERO
が文の場合の対処です。

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 10:30:23 -0000
@@ -9816,7 +9816,7 @@ enum thread_status {
 # endif
 #endif
 
-#ifdef NFDBITS
+#ifdef HAVE_RB_FD_INIT
 void
 rb_fd_init(fds)
     volatile rb_fdset_t *fds;
@@ -10002,30 +10002,30 @@ struct thread_status_t {
     rb_thread_t join;
 };
 
-#define THREAD_COPY_STATUS(src, dst) (void)(	\
-    (dst)->node = (src)->node,			\
+#define THREAD_COPY_STATUS(src, dst) do {	\
+    (dst)->node = (src)->node;			\
 						\
-    (dst)->tracing = (src)->tracing,		\
-    (dst)->errinfo = (src)->errinfo,		\
-    (dst)->last_status = (src)->last_status,	\
-    (dst)->last_line = (src)->last_line,	\
-    (dst)->last_match = (src)->last_match,	\
+    (dst)->tracing = (src)->tracing;		\
+    (dst)->errinfo = (src)->errinfo;		\
+    (dst)->last_status = (src)->last_status;	\
+    (dst)->last_line = (src)->last_line;	\
+    (dst)->last_match = (src)->last_match;	\
 						\
-    (dst)->safe = (src)->safe,			\
+    (dst)->safe = (src)->safe;			\
 						\
-    (dst)->status = (src)->status,		\
-    (dst)->wait_for = (src)->wait_for,		\
-    (dst)->fd = (src)->fd,			\
-    (dst)->readfds = (src)->readfds,		\
-    (dst)->writefds = (src)->writefds,		\
-    (dst)->exceptfds = (src)->exceptfds,	\
-    rb_fd_init(&(src)->readfds),		\
-    rb_fd_init(&(src)->writefds),		\
-    rb_fd_init(&(src)->exceptfds),		\
-    (dst)->select_value = (src)->select_value,	\
-    (dst)->delay = (src)->delay,		\
-    (dst)->join = (src)->join,			\
-    0)
+    (dst)->status = (src)->status;		\
+    (dst)->wait_for = (src)->wait_for;		\
+    (dst)->fd = (src)->fd;			\
+    (dst)->readfds = (src)->readfds;		\
+    (dst)->writefds = (src)->writefds;		\
+    (dst)->exceptfds = (src)->exceptfds;	\
+    rb_fd_init(&(src)->readfds);		\
+    rb_fd_init(&(src)->writefds);		\
+    rb_fd_init(&(src)->exceptfds);		\
+    (dst)->select_value = (src)->select_value;	\
+    (dst)->delay = (src)->delay;		\
+    (dst)->join = (src)->join;			\
+} while (0)
 
 static int
 thread_set_raised()
@@ -10225,9 +10225,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);
Index: ext/io/wait/wait.c
===================================================================
RCS file: /src/ruby/ext/io/wait/wait.c,v
retrieving revision 1.5
diff -u -p -r1.5 wait.c
--- ext/io/wait/wait.c	3 Jun 2005 14:23:17 -0000	1.5
+++ ext/io/wait/wait.c	11 Jun 2005 10:30:28 -0000
@@ -105,7 +105,7 @@ io_wait(argc, argv, io)
     n = (int)rb_ensure(wait_readable, (VALUE)&arg,
 		       (VALUE (*)_((VALUE)))rb_fd_term, (VALUE)&arg.fds);
 #else
-    n = rb_thread_select(fd + 1, rb_fd_ptr(&rd), NULL, NULL, tp)
+    n = rb_thread_select(fd + 1, rb_fd_ptr(&arg.fds), NULL, NULL, arg.timeout);
 #endif
     if (n < 0)
 	rb_sys_fail(0);
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread