[#45703] test_advise failure on GNU/Linux — Tanaka Akira <tanaka.akira@...>
今朝、気がついたのですが、手元で test_advise が失敗します。
小崎です
>> /tmp は tmpfs で、カレントディレクトリは ext3 なのですが、
2012年6月22日 16:42 KOSAKI Motohiro <kosaki.motohiro@gmail.com>:
[#45723] Developers' meeting (7/21) — Yusuke Endoh <mame@...>
Hello, committers
Four seats are now left.
[#45735] [ruby-trunk - Feature #6587][Open] proposal: adding new methods File.rootname and Pathname#rootname — "usa (Usaku NAKAMURA)" <usa@...>
[#45745] Re: [ruby-changes:24028] yugui:r36079 (trunk): Embedding CRuby interpreter without internal headers has been difficult — SASADA Koichi <ko1@...>
見逃していました.
2012/6/15 SASADA Koichi <ko1@atdot.net>:
ささだです.
2012/6/15 SASADA Koichi <ko1@atdot.net>:
ささだです.
2012/6/19 SASADA Koichi <ko1@atdot.net>:
こんにちは、なかむら(う)です。
2012/6/15 U.Nakamura <usa@garbagecollect.jp>:
なかだです。
[#45769] [ruby-trunk - Bug #6606][Open] default_external encoding and STDOUT and UTF-8 — "shyouhei (Shyouhei Urabe)" <shyouhei@...>
[#45780] Re: [ruby-changes:24083] nobu:r36134 (trunk): process.c: no method calls in async-signal-safe — Tanaka Akira <akr@...>
2012/6/19 nobu <ko1@atdot.net>:
[#45794] :new_pgroup and :pgroup option for spawn. — Tanaka Akira <akr@...>
process.c で気がついたのですが、spawn に Windows 用の :new_pgroup というオプションが
こんにちは、なかむら(う)です。
2012年6月25日 11:27 U.Nakamura <usa@garbagecollect.jp>:
こんにちは、なかむら(う)です。
2012年6月25日 11:52 U.Nakamura <usa@garbagecollect.jp>:
こんにちは、なかむら(う)です。
2012年6月25日 12:13 U.Nakamura <usa@garbagecollect.jp>:
こんにちは、なかむら(う)です。
[#45818] [ruby-trunk - Feature #6643][Open] io.seek(off, :end) — "akr (Akira Tanaka)" <akr@...>
At Mon, 25 Jun 2012 19:32:06 +0900,
2012年6月25日 23:37 SATOH Fumiyasu <fumiyas@osstech.jp>:
[#45826] Question: Thread#kill doesn't throw Exception — SASADA Koichi <ko1@...>
ささだです.
> さらに突っ込んだ質問:
(2012/06/26 4:25), KOSAKI Motohiro wrote:
[ruby-dev:45783] Re: [ruby-changes:24083] nobu:r36134 (trunk): process.c: no method calls in async-signal-safe
2012/6/19 Tanaka Akira <akr@fsij.org>:
>
> どういう状況でこの NUM2MODET からメソッド呼び出しが起こるのか
> 理解できなかったんですが、どういう話なんでしょう?
さらに調べたところ、 rb_num2uint の
check_uint(num, rb_funcall(val, '<', 1, INT2FIX(0)))
というところで、 メソッド呼び出しが起こることを理解しました。
うぅむ。これは rb_num2uint を変えた方がまだマシなような。
(根本的には親プロセスで mode_t な値に変換するのが適切でしょうが)
なお、記録として調べた方法を書いておきますが、
中田さんの変更を入れる直前の r36133 に
以下のパッチの numeric.c の部分を除いて適用すると、make check や
./ruby -e 'system("echo a", :umask => 0)' において、
fork した (async-signal-safe を意図した) 子プロセスで rb_call0 が
呼ばれることを確認できます。
また、numeric.c の部分も適用すれば、rb_call0 が呼ばれなくなることを
確認できます。
% svn diff --diff-cmd diff -x '-u -p'
Index: vm_eval.c
===================================================================
--- vm_eval.c (revision 36133)
+++ vm_eval.c (working copy)
@@ -219,6 +219,7 @@ static inline VALUE
rb_call0(VALUE recv, ID mid, int argc, const VALUE *argv,
call_type scope, VALUE self)
{
+ assert(!forked_child);
rb_method_entry_t *me = rb_search_method_entry(recv, mid);
rb_thread_t *th = GET_THREAD();
int call_status = rb_method_call_status(th, me, scope, self);
Index: process.c
===================================================================
--- process.c (revision 36133)
+++ process.c (working copy)
@@ -984,7 +984,7 @@ proc_detach(VALUE obj, VALUE pid)
return rb_detach_process(NUM2PIDT(pid));
}
-static int forked_child = 0;
+int forked_child = 0;
#ifdef SIGPIPE
static RETSIGTYPE (*saved_sigpipe_handler)(int) = 0;
Index: internal.h
===================================================================
--- internal.h (revision 36133)
+++ internal.h (working copy)
@@ -12,6 +12,8 @@
#ifndef RUBY_INTERNAL_H
#define RUBY_INTERNAL_H 1
+#include <assert.h>
+
#if defined(__cplusplus)
extern "C" {
#if 0
@@ -158,6 +160,7 @@ VALUE rb_proc_location(VALUE self);
st_index_t rb_hash_proc(st_index_t hash, VALUE proc);
/* process.c */
+extern int forked_child;
/* argv_str contains extra two elements.
* The beginning one is for /bin/sh used by exec_with_sh.
Index: numeric.c
===================================================================
--- numeric.c (revision 36133)
+++ numeric.c (working copy)
@@ -1945,7 +1945,8 @@ rb_num2uint(VALUE val)
{
VALUE num = rb_num2ulong(val);
- check_uint(num, rb_funcall(val, '<', 1, INT2FIX(0)));
+ check_uint(num, FIXNUM_P(val) ? FIX2LONG(val) < 0 :
+ rb_funcall(val, '<', 1, INT2FIX(0)));
return (unsigned long)num;
}
--
[田中 哲][たなか あきら][Tanaka Akira]