[#25035] 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...>

こんにちは。

16 messages 2004/12/03
[#25070] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — nobu@... 2004/12/06

なかだです。

[#25071] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...> 2004/12/06

In message <200412060607.iB667giF007533@sharui.nakada.niregi.kanuma.tochigi.jp>

[#25089] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — nobu@... 2004/12/07

なかだです。

[#25090] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...> 2004/12/07

In message <200412070015.iB70FAiF012770@sharui.nakada.niregi.kanuma.tochigi.jp>

[#25093] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — akira yamada / やまだあきら <akira@...> 2004/12/07

2004-12-07 (火) の 12:27 +0900 に Takahiro Kambe さんは書きました:

[#25041] temporal locking already locked string on simultaneous write — Tanaka Akira <akr@...17n.org>

同じ文字列をほぼ同時に IO に書き込むと、temporal locking already

13 messages 2004/12/04
[#25042] Re: temporal locking already locked string on simultaneous write — Yukihiro Matsumoto <matz@...> 2004/12/04

まつもと ゆきひろです

[#25043] Re: temporal locking already locked string on simultaneous write — Tanaka Akira <akr@...17n.org> 2004/12/04

In article <1102133507.339625.10453.nullmailer@x31.priv.netlab.jp>,

[#25096] double free problem — "Akinori MUSHA" <knu@...>

 ご無沙汰しております。

15 messages 2004/12/07
[#25099] Re: double free problem — Yukihiro Matsumoto <matz@...> 2004/12/07

Hi,

[#25101] non-stdio buffering — Tanaka Akira <akr@...17n.org>

えぇと、今回 1.9 でなにが起きたのかを私が把握している範囲でまとめてお

18 messages 2004/12/07

[#25152] 1.8 reopen problem with duplex popen — Tanaka Akira <akr@...17n.org>

次のように、1.8 で双方向 popen な IO を reopen するとエラーになること

11 messages 2004/12/10

[#25158] core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org>

NetBSD 2.0 で次のようにすると core を吐きます。

18 messages 2004/12/11
[#25159] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/11

In article <87hdmsivva.fsf@serein.a02.aist.go.jp>,

[#25163] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/12

In article <87ekhwiv7g.fsf@serein.a02.aist.go.jp>,

[#25165] Re: core dump on NetBSD 2.0 — nobu@... 2004/12/13

なかだです。

[#25167] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/13

In article <200412130040.iBD0e8Qh003275@sharui.nakada.niregi.kanuma.tochigi.jp>,

[#25193] 1.8.2 release schedule — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

15 messages 2004/12/14

[#25299] Re: リリース準備 — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

20 messages 2004/12/24
[#25301] Re: リリース準備 — TAKAHASHI Masayoshi <maki@...> 2004/12/24

高橋征義です。

[#25302] test_readline.rb blocks on BSD again — GOTOU Yuuzou <gotoyuzo@...>

In message <20041223175402.3116FC6718@lithium.ruby-lang.org>,

15 messages 2004/12/24
[#25314] Re: test_readline.rb blocks on BSD again — GOTOU Yuuzou <gotoyuzo@...> 2004/12/24

In message <20041224.131211.846943951.gotoyuzo@sawara.does.notwork.org>,

[#25315] Re: test_readline.rb blocks on BSD again — Yukihiro Matsumoto <matz@...> 2004/12/24

まつもと ゆきひろです

[#25317] Re: test_readline.rb blocks on BSD again — WATANABE Hirofumi <eban@...> 2004/12/25

わたなべです。

[ruby-dev:25038] Continuation protection (Re: Re: IO#flush dumps core again)

From: nobu@...
Date: 2004-12-03 05:05:55 UTC
List: ruby-dev #25038
なかだです。

At Thu, 2 Dec 2004 14:57:14 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:25029]:
> |rb_protect()自体をこうしてしまったほうがいいような気がしてきま
> |した。rb_protect()を使うようなところからcallccを外部に持ち出せ
> |て嬉しいというか、安全な状況はあまりないと思います。
> 
> 賛成です。コミット希望。

スレッドを考慮してませんでした。

protectはrb_protect()を呼ぶグローバルメソッドとして

  $ cat ext/protect/protect.c
  #include "ruby.h"

  static VALUE
  call_protect(argc, argv)
      int argc;
      VALUE *argv;
  {
      VALUE val;
      int state;

      rb_scan_args(argc, argv, "01", &val);
      val = rb_protect(rb_yield, val, &state);
      if (state) rb_jump_tag(state);
      return val;
  }

  void
  Init_protect()
  {
      rb_define_global_function("protect", call_protect, -1);
  }

途中で別スレッドでrb_protect()を使うと対応が合わなくなります。

  $ ruby -rprotect -e '
  trap("INT"){c=nil;(puts; c.call(false)) if callcc{|c|
  Thread.pass;print "."; true}}
  Thread.new{protect{Process.kill("INT", $$)}}.join'
  .
  -e:2:in `call': continuation called across trap (RuntimeError)
          from -e:2
          from -e:2:in `call'
          from -e:4:in `initialize'
          from -e:4:in `new'
          from -e:4

また、外部の継続も呼び出せないのはちょっと制限がきついかもとい
う気がして来ました。

  $ ruby -rprotect -e '
  c=nil
  protect{puts; c.call(false)} if callcc{|c| print "."; true}'
  -e:3:in `call': continuation called across trap (RuntimeError)
          from -e:3
          from -e:3:in `protect'
          from -e:3


Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.741
diff -U2 -p -d -r1.741 eval.c
--- eval.c	2 Dec 2004 15:17:35 -0000	1.741
+++ eval.c	3 Dec 2004 05:01:23 -0000
@@ -1298,4 +1298,7 @@ static int thread_set_raised();
 static int thread_reset_raised();
 
+static void thread_push_cont_protect();
+static void thread_pop_cont_protect();
+
 static VALUE exception_error;
 static VALUE sysstack_error;
@@ -5147,6 +5150,4 @@ rb_rescue(b_proc, data1, r_proc, data2)
 }
 
-static VALUE cont_protect;
-
 VALUE
 rb_protect(proc, data, state)
@@ -5159,9 +5160,9 @@ rb_protect(proc, data, state)
 
     PUSH_TAG(PROT_NONE);
-    cont_protect = (VALUE)rb_node_newnode(NODE_MEMO, cont_protect, 0, 0);
+    thread_push_cont_protect();
     if ((status = EXEC_TAG()) == 0) {
 	result = (*proc)(data);
     }
-    cont_protect = ((NODE *)cont_protect)->u1.value;
+    thread_pop_cont_protect();
     POP_TAG();
     if (state) {
@@ -9585,4 +9586,5 @@ struct thread {
 
     VALUE thread;
+    NODE *cont_protect;
 };
 
@@ -9657,4 +9659,20 @@ thread_reset_raised()
 }
 
+static void
+thread_push_cont_protect()
+{
+    NODE *c = curr_thread->cont_protect;
+    curr_thread->cont_protect =
+	rb_node_newnode(NODE_MEMO, (VALUE)c, Qtrue, 0);
+}
+
+static void
+thread_pop_cont_protect()
+{
+    NODE *c = curr_thread->cont_protect;
+    curr_thread->cont_protect = c->u1.node;
+    c->u2.value = Qfalse;
+}
+
 static void rb_thread_ready _((rb_thread_t));
 
@@ -9785,4 +9803,5 @@ thread_mark(th)
     rb_mark_tbl(th->locals);
     rb_gc_mark(th->thgroup);
+    rb_gc_mark((VALUE)th->cont_protect);
 
     /* mark data in copied stack */
@@ -11336,4 +11355,5 @@ rb_thread_group(thread)
     th->locals = 0;\
     th->thread = 0;\
+    th->cont_protect = 0;\
 } while (0)
 
@@ -12274,5 +12294,5 @@ rb_callcc(self)
     }
     th->thread = curr_thread->thread;
-    th->thgroup = cont_protect;
+    th->cont_protect = curr_thread->cont_protect;
 
     for (vars = ruby_dyna_vars; vars; vars = vars->next) {
@@ -12316,6 +12336,6 @@ rb_cont_call(argc, argv, cont)
 	rb_raise(rb_eRuntimeError, "continuation called across threads");
     }
-    if (th->thgroup != cont_protect) {
-	rb_raise(rb_eRuntimeError, "continuation called across trap");
+    if (th->cont_protect && !RTEST(th->cont_protect->u2.value)) {
+	rb_raise(rb_eRuntimeError, "continuation called across context");
     }
     switch (argc) {


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

In This Thread