[#15040] WeakRef and load(file, true) — Shugo Maeda <shugo@...>
前田です。
[#15043] puts array — "Akinori MUSHA" <knu@...>
puts に配列を与えたときの挙動が最新の 1.7 では変わっていて
こんにちは、なかむら(う)です。
At Wed, 7 Nov 2001 09:54:03 +0900,
[#15044] resolv.rb — Kazuhiro NISHIYAMA <zn@...>
Resolv::Hostsのデフォルトのファイル名ってWindows 9x環境だと
[#15047] can't set chomped String to environment — nobu.nakada@...
なかだです。
まつもと ゆきひろです
[#15067] rb_eval_string — OJ <oj@...7.com>
OJです。
なかだです。
OJです。
なかだです。
OJです。
わたなべです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
[#15100] Using static mark stack, GC is slow. — sheepman <sheepman@...>
こんばんは
[#15101] [bug?] pty causes segv by getting SIGINT — akira yamada / やまだあきら <akira@...>
まつもと ゆきひろです
[#15102] Gtk::Object#flags!= — akira yamada / やまだあきら <akira@...>
[#15116] rubylib_mangle whitespace — Kazuhiro Yoshida <moriq.kazuhiro@...>
もりきゅうです。
まつもと ゆきひろです
わたなべです。
[#15132] uri.rb — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#15174] strange behavior about PTY.spawn — akira yamada / やまだあきら <akira@...>
まつもと ゆきひろです
[#15175] ruby-mingw32 configuration — HIDAKA Takahiro <cv8t-hdk@...>
ひだかです。
わたなべです。
[#15239] gc.c (gc_mark_rest): declare work area as static — "K.Kosako" <kosako@...>
現在のGCのアルゴリズム(matz-sheepman)を少し変更しようと思って、
On Thu, 22 Nov 2001 16:21:17 +0900
sheepmanさんの<20011122202749.56b8eb49.sheepman@tcn.zaq.ne.jp>から
[#15251] Re: [ruby-ext:01999] Re: syslog module is becoming ready — "Akinori MUSHA" <knu@...>
というわけで 1.7 に syslog モジュールを入れました。
なかだです。
ただただしです。
At Mon, 26 Nov 2001 22:30:03 +0900,
In article <86r8ql90zt.wl@archon.local.idaemons.org>,
At Mon, 26 Nov 2001 23:07:30 +0900,
あおきです。
At Wed, 28 Nov 2001 07:58:55 +0900,
あおきです。
そうそう、 optparse も標準に入っていると便利だと思うのですが
まつもと ゆきひろです
In message <1007018271.960435.20342.nullmailer@ev.netlab.jp>
まつもと ゆきひろです
[#15270] ruby on NetBSD — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
In message <20011128181510.3D11.USA@osb.att.ne.jp>
こんにちは、なかむら(う)です。
In message <20011128182726.3D14.USA@osb.att.ne.jp>
なかだです。
こんにちは、なかむら(う)です。
In message <20011129183834.3790.USA@osb.att.ne.jp>
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
取り込み、ありがとうございます。
こんにちは、なかむら(う)です。
[#15292] Re: m17n ruby 特に TRON 文字コード — TOYOFUKU Chikanobu <toyofuku@...>
豊福です。
[#15298] time.rb — Tanaka Akira <akr@...17n.org>
というわけで、timex.rb 改め time.rb が rough に入ったのでご意見募集です。
In article <hvovgftkgy7.fsf@coulee.a02.aist.go.jp>,
まつもと ゆきひろです
まつもと ゆきひろです
In article <1009298477.998171.30253.nullmailer@ev.netlab.jp>,
[ruby-dev:15185] Re: strange behavior about PTY.spawn
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)