[#34647] fork 不可能な環境での test_argv0_noarg — wanabe <s.wanabe@...>

ワナベと申します。

13 messages 2008/05/11
[#34667] Re: fork 不可能な環境での test_argv0_noarg — Yukihiro Matsumoto <matz@...> 2008/05/13

まつもと ゆきひろです

[#34742] Ruby 1.8.7-preview3 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.7-preview3 をリリースしました。

14 messages 2008/05/18
[#34744] Re: [ruby-list:44957] Ruby 1.8.7-preview3 has been released — Takahiro Kambe <taca@...> 2008/05/19

お疲れ様です。

[#34800] Windows2000上でtrunkがビルドできない — KIMURA Koichi <kimura.koichi@...>

木村です。

18 messages 2008/05/22
[#34801] Re: Windows2000上でtrunkがビルドできない — "U.Nakamura" <usa@...> 2008/05/22

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

[#34824] Re: Windows2000上でtrunkがビルドできない — KIMURA Koichi <kimura.koichi@...> 2008/05/23

木村です。

[#34850] Re: Windows2000上でtrunkがビルドできない — KIMURA Koichi <kimura.koichi@...> 2008/05/26

木村です。

[#34854] Re: Windows2000上でtrunkがビルドできない — "U.Nakamura" <usa@...> 2008/05/26

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

[#34889] Ruby 1.8.7-preview4 test-all failed in OpenSSL::TestSSL — Nobuhiro IMAI <nov@...>

いまいです。

10 messages 2008/05/29

[ruby-dev:34578] Re: write to broken pipe on Linux

From: Nobuyoshi Nakada <nobu@...>
Date: 2008-05-03 00:24:58 UTC
List: ruby-dev #34578
なかだです。

At Fri, 2 May 2008 16:27:45 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:34574]:
> EPIPEやENOTCONNが発生したfdをselectに渡すとふたたびそれらが発
> 生するべきであると(たとえば)POSIX的に明示されているのであれば、
> linux固有のバグと認定して、当面、場当たり的な対応をするとかも
> ありえるとは思うのですが。

そこまでは規定されていないような気がします。

> |shutdownでは、EPIPEの代わりにENOTCONNが発生するようになるだけで
> |その次の書き込みでやはりブロックしてしまうようです。closeにする
> |とEBADFにはなるのですが、eof?やcloseでも同じくEBADFが発生してし
> |まうようになります。他のスレッドの有無によって動作が変わってしま
> |うのもどうかという気もしますが。
> 
> はじめに立ち返って考えると、読み出そうとした時にEPIPEが返っ
> てきてしまったIOに対してどのように対処すべきなんでしょうね。
> BROKENPIPEフラグを立てる、というのもあんまり正しい対処のよう
> には思えないんですが。やはり強制的にcloseして例外かなあ。

ですかねぇ。

> |というか、1.9ではすでにblocking regionを使えばselectは必要ないは
> |ずです。
> 
> 1.9ではその方向で対応しましょうか。

1.8が問題ですね。とりあえず試してみたんですが、deadlockになって
しまいました。

# 法事で不在のため、5/5までIP unreachable。


Index: eval.c
===================================================================
--- eval.c	(revision 16276)
+++ eval.c	(working copy)
@@ -10930,4 +10930,11 @@ rb_thread_schedule()
 #endif
 	    FOREACH_THREAD_FROM(curr, th) {
+		if ((th->wait_for&WAIT_FD) && FD_ISSET(th->fd, &readfds)) {
+		    FD_CLR(th->fd, &readfds);
+ 		    th->status = THREAD_RUNNABLE;
+		    th->select_value = n;
+		    n = max;
+		    found = 1;
+		}
 		if (th->wait_for & WAIT_SELECT) {
 		    int v = 0;
@@ -10937,6 +10944,8 @@ rb_thread_schedule()
 		    v |= find_bad_fds(&exceptfds, &th->exceptfds, th->fd);
 		    if (v) {
+			th->status = THREAD_RUNNABLE;
 			th->select_value = n;
 			n = max;
+			found = 1;
 		    }
 		}
@@ -11019,5 +11028,5 @@ rb_thread_schedule()
 			th->thread, thread_status_name(th->status));
 	    if (th->wait_for & WAIT_FD) warn_printf("F(%d)", th->fd);
-	    if (th->wait_for & WAIT_SELECT) warn_printf("S");
+	    if (th->wait_for & WAIT_SELECT) warn_printf("S(%d)", th->fd);
 	    if (th->wait_for & WAIT_TIME) warn_printf("T(%f)", th->delay);
 	    if (th->wait_for & WAIT_JOIN)
Index: io.c
===================================================================
--- io.c	(revision 16276)
+++ io.c	(working copy)
@@ -351,4 +351,5 @@ io_fflush(f, fptr)
     int n;
 
+    rb_io_check_closed(fptr);
     if (!rb_thread_fd_writable(fileno(f))) {
         rb_io_check_closed(fptr);
@@ -388,4 +389,8 @@ rb_io_wait_readable(f)
 	return Qtrue;
 
+      case EPIPE:
+	close(f);
+	return Qfalse;
+
       default:
 	return Qfalse;
@@ -416,4 +421,8 @@ rb_io_wait_writable(f)
 	return Qtrue;
 
+      case EPIPE:
+	close(f);
+	return Qfalse;
+
       default:
 	return Qfalse;
@@ -1724,5 +1733,5 @@ rb_io_getline(rs, io)
 	while ((c = appendline(fptr, newline, &str)) != EOF &&
 	       (c != newline || RSTRING(str)->len < rslen ||
-		(rspara || rscheck(rsptr,rslen,rs), 0) ||
+		((rspara || rscheck(rsptr,rslen,rs)) && 0) ||
 		memcmp(RSTRING(str)->ptr+RSTRING(str)->len-rslen,rsptr,rslen)));
 


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread