[#15067] rb_eval_string — OJ <oj@...7.com>

OJです。

39 messages 2001/11/08
[#15068] Re: rb_eval_string — nobu.nakada@... 2001/11/08

なかだです。

[#15069] Re: rb_eval_string — OJ <oj@...7.com> 2001/11/08

OJです。

[#15071] Re: rb_eval_string — nobu.nakada@... 2001/11/09

なかだです。

[#15077] Re: rb_eval_string — OJ <oj@...7.com> 2001/11/09

OJです。

[#15078] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/09

わたなべです。

[#15083] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/09

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

[#15088] Re: rb_eval_string — nobu.nakada@... 2001/11/09

なかだです。

[#15089] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/09

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

[#15092] Re: rb_eval_string — nobu.nakada@... 2001/11/09

なかだです。

[#15096] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/09

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

[#15109] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15112] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

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

[#15114] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15115] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

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

[#15119] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15121] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

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

[#15124] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15126] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

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

[#15174] strange behavior about PTY.spawn — akira yamada / やまだあきら <akira@...>

18 messages 2001/11/15
[#15176] Re: strange behavior about PTY.spawn — matz@... (Yukihiro Matsumoto) 2001/11/15

まつもと ゆきひろです

[#15251] Re: [ruby-ext:01999] Re: syslog module is becoming ready — "Akinori MUSHA" <knu@...>

 というわけで 1.7 に syslog モジュールを入れました。

43 messages 2001/11/26

[#15270] ruby on NetBSD — "U.Nakamura" <usa@...>

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

25 messages 2001/11/28
[#15271] Re: ruby on NetBSD — Takahiro Kambe <taca@...> 2001/11/28

In message <20011128181510.3D11.USA@osb.att.ne.jp>

[#15272] Re: ruby on NetBSD — "U.Nakamura" <usa@...> 2001/11/28

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

[#15278] Re: ruby on NetBSD — Takahiro Kambe <taca@...> 2001/11/28

In message <20011128182726.3D14.USA@osb.att.ne.jp>

[#15296] Re: ruby on NetBSD — "U.Nakamura" <usa@...> 2001/11/29

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

[#15298] time.rb — Tanaka Akira <akr@...17n.org>

というわけで、timex.rb 改め time.rb が rough に入ったのでご意見募集です。

27 messages 2001/11/29

[ruby-dev:15185] Re: strange behavior about PTY.spawn

From: akira yamada / やまだあきら <akira@...>
Date: 2001-11-16 02:41:02 UTC
List: ruby-dev #15185
Fri, 16 Nov 2001 01:44:39 +0900 頃の
   Mail-Count: 15177
      Subject: [ruby-dev:15177] Re: strange behavior about PTY.spawn   
についてのお話にて やまだは言いました… 
(Y == matz@ruby-lang.org (Yukihiro Matsumoto) さん)
(あ == やまだ あきら)

In article 15176, <1005839997.280842.1714.nullmailer@ev.netlab.jp>
Y>                       1.7ではthread safeにしようとしてますが、
Y> どうも不完全な気がします。

というのはどういう点ですか?


これ(↓)よく考えたら

In article 15177, <20011115164438.B3EC23546D@rb.arika.org>
あ> 少なくも手元で試した範囲では, 
あ> 1.7の方ではそういうことがないようなので

というのは当り前でSIGSTOPが来るとloop{}において例外が発生するのですよね(^_^;
で, たとえばですがこういう感じにするというのはどうでしょうか?

Index: pty.c
===================================================================
RCS file: /home/akira/cvs/ruby-src/cvs/ruby/ext/pty/pty.c,v
retrieving revision 1.8
diff -u -r1.8 pty.c
--- pty.c	3 Oct 2001 07:19:15 -0000	1.8
+++ pty.c	16 Nov 2001 02:30:56 -0000
@@ -112,22 +112,42 @@
 };
 
 static void
-pty_raise(cpid)
-    int cpid;
+pty_raise(cpid, sig, th)
+    int cpid, sig;
+    VALUE th;
 {
     char buf[1024];
 
-    snprintf(buf, sizeof(buf),
-	     "eval %%Q{Thread.main.raise 'pty - stopped: %d'}, nil, \"%s\", %d",
-	     cpid, ruby_sourcefile, ruby_sourceline);
-    rb_eval_string(buf);
+    if (NIL_P(th)) {
+	snprintf(buf, sizeof(buf),
+		 "eval %%Q{Thread.main.raise 'pty - process %d received signal: %d'}, nil, \"%s\", %d",
+		 cpid, sig, ruby_sourcefile, ruby_sourceline);
+	rb_eval_string(buf);
+    }
+    else {
+	snprintf(buf, sizeof(buf), "pty - process %d received signal: %d", cpid, sig);
+	rb_funcall(th, rb_intern("raise"), 2, 
+		   rb_eRuntimeError, rb_str_new2(buf));
+    }
 }
 
 static VALUE
-pty_syswait(pid)
-    int pid;
+pty_yield(res)
+    VALUE res;
 {
-    int cpid, status;
+    rb_thread_stop();
+    return rb_yield((VALUE)res);
+}
+
+static VALUE
+pty_syswait(thver)
+    VALUE thver;
+{
+    int pid, cpid, status;
+    VALUE th;
+
+    pid = NUM2INT(RARRAY(thver)->ptr[0]);
+    th = RARRAY(thver)->ptr[1];
 
     cpid = rb_waitpid(pid, &status, WUNTRACED);
 
@@ -137,18 +157,32 @@
 
 #ifdef IF_STOPPED
     if (IF_STOPPED(status)) { /* suspend */
-	pty_raise(cpid);
+	pty_raise(cpid, SIGSTOP, th);
     }
 #else
 #ifdef WIFSTOPPED
     if (WIFSTOPPED(status)) { /* suspend */
-	pty_raise(cpid);
+	pty_raise(cpid, SIGSTOP, th);
     }
 #else
 ---->> Either IF_STOPPED or WIFSTOPPED is needed <<----
 #endif /* WIFSTOPPED */
 #endif /* IF_STOPPED */
-    
+
+#ifdef IF_SIGNALED
+    if (IF_SIGNALED(status)) { /* suspend */
+	pty_raise(cpid, WTERMSIG(status), th);
+    }
+#else
+#ifdef WIFSIGNALED
+    if (WIFSIGNALED(status)) { /* suspend */
+	pty_raise(cpid, WTERMSIG(status), th);
+    }
+#else
+---->> Either IF_STOPPED or WIFSTOPPED is needed <<----
+#endif /* WIFSTOPPED */
+#endif /* IF_STOPPED */
+
     return Qnil;
 }
 
@@ -364,7 +398,7 @@
 pty_getpty(self, shell)
     VALUE self, shell;
 {
-    VALUE res, th;
+    VALUE res, thc, thy, thver;
     struct pty_info info;
     OpenFile *wfptr,*rfptr;
     VALUE rport = rb_obj_alloc(rb_cFile);
@@ -388,14 +422,26 @@
     rb_ary_store(res,1,(VALUE)wport);
     rb_ary_store(res,2,INT2FIX(info.child_pid));
 
+    thver = rb_ary_new2(2);
+
     printf("start watching PTY command (%d)\n", info.child_pid);
-    th = rb_thread_create(pty_syswait, (void*)info.child_pid);
     if (rb_block_given_p()) {
-	res = rb_yield((VALUE)res);
-	rb_funcall(th, rb_intern("kill"), 0, 0);
+	thy = rb_thread_create(pty_yield, (void*)res);
+
+	rb_ary_store(thver,0,(VALUE)INT2NUM(info.child_pid));
+	rb_ary_store(thver,1,(VALUE)thy);
+	thc = rb_thread_create(pty_syswait, (void*)thver);
+
+	rb_funcall(thy, rb_intern("run"), 0, 0);
+	res = rb_funcall(thy, rb_intern("value"), 0, 0);
+
+	rb_funcall(thc, rb_intern("kill"), 0, 0);
 	return res;
     }
     else {
+	rb_ary_store(thver,0,(VALUE)INT2NUM(info.child_pid));
+	rb_ary_store(thver,1,(VALUE)Qnil);
+	thc = rb_thread_create(pty_syswait, (void*)thver);
 	return res;
     }
 }

子供が受けたシグナルに応じた例外を上げるのがいいのかなとも思いますが, 
ともかく, ブロック付きでPTY.spawnした時にはそのブロックで例外が
上がるのがいいなあというのが意図のつもりです(意図通りになってるといいなあ).

あ> 1.6にも1.7のptyをバックポートするといいのではないかなあ
あ> と思っているところです. 

-- 
 やまだ あきら <URL:http://arika.org/>
 (akira@arika.org, akira@ruby-lang.org or akira@linux.or.jp)

In This Thread