[#47562] [Backport 200 - Backport #8716][Open] segmation fault 正規表現で大量のグループを利用時 — "taka-yoshi (taka-yoshi taka)" <smokeonthewater222@...>

15 messages 2013/08/01

[#47569] [ruby-trunk - Feature #8726][Open] Class#source_location — "takiuchi (Genki Takiuchi)" <genki@...21g.com>

14 messages 2013/08/03

[#47663] Re: [ruby-core:56878] [ruby-trunk - misc #8835][Open] Introducing a semantic versioning scheme and branching policy — "Akinori MUSHA" <knu@...>

At Fri, 30 Aug 2013 21:49:34 +0900,

6 messages 2013/08/30

[ruby-dev:47036] Re: [ruby-trunk - Bug #8749][Open] Readline.readline stops STDOUT?

From: Tanaka Akira <akr@...>
Date: 2013-08-07 23:05:03 UTC
List: ruby-dev #47036
2013/8/7 no6v (Nobuhiro IMAI) <nov@yo.rim.or.jp>:
> Bug #8749: Readline.readline stops STDOUT?
> https://bugs.ruby-lang.org/issues/8749

> r42402 で、以下のようなスクリプトの挙動が変わっています。
> (Enter を押すかどうかは関係なくて、)Readline.readline を実行中に標準出力への出力が出来なくなっているように見えます。

うぅむ。Readline.readline が GVL を確保したままブロックしてしまって、
メインスレッドが進まなくなっているようです。

とりあえずもとのコードをなるべく保存するならこうかなぁ。

% svn diff --diff-cmd diff -x '-u -p'
Index: ext/readline/readline.c
===================================================================
--- ext/readline/readline.c	(revision 42429)
+++ ext/readline/readline.c	(working copy)
@@ -127,6 +127,7 @@ static char **readline_attempted_complet
  */

 static VALUE readline_instream;
+static int readline_infd = -1;
 static VALUE readline_outstream;

 #if defined HAVE_RL_GETC_FUNCTION
@@ -143,7 +144,7 @@ readline_getc(FILE *input)
     VALUE c;
     if (!readline_instream) return rl_getc(input);
     GetOpenFile(readline_instream, ifp);
-    if (rl_instream != ifp->stdio_file) return rl_getc(input);
+    if (fileno(rl_instream) != readline_infd) return rl_getc(input);
 #if defined(_WIN32)
     {
         INPUT_RECORD ir;
@@ -398,6 +399,7 @@ readline_readline(int argc, VALUE *argv,
                 rl_instream = NULL;
             }
             readline_instream = Qfalse;
+            readline_infd = -1;
             rb_raise(rb_eIOError, "closed stdin");
         }
     }
@@ -467,6 +469,7 @@ clear_rl_instream(void)
             }
         }
         readline_instream = Qfalse;
+        readline_infd = -1;
         rl_instream = NULL;
     }
 }
@@ -504,6 +507,7 @@ readline_s_set_input(VALUE self, VALUE i
         }
         rl_instream = f;
         readline_instream = input;
+        readline_infd = fd;
     }
     return input;
 }

でも、readline_getc では単に GVL を外して rl_getc を呼べばいいのではないか、という気もします。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
_______________________________________________
ruby-dev mailing list
ruby-dev@ruby-lang.org
http://lists.ruby-lang.org/cgi-bin/mailman/listinfo/ruby-dev

In This Thread