[#10793] 今度こそ (patch of the ruby-1.4.6 for NT4.0&VC4.0 on DEC Alpha.) — kou@...1609.sip.eee.yamaguchi-u.ac.jp (Koichi Okada)

岡田です。

10 messages 2000/09/01

[#10920] SIGINT on windows — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

17 messages 2000/09/14
[#11077] Re: SIGINT on windows — matz@... (Yukihiro Matsumoto) 2000/09/27

まつもと ゆきひろです

[#10944] dummy DLL on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

19 messages 2000/09/18
[#10955] Re: dummy DLL on Windows — WATANABE Hirofumi <eban@...> 2000/09/19

わたなべです.

[#10963] Re: dummy DLL on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/09/19

なかだです。

[#10964] Re: dummy DLL on Windows — WATANABE Hirofumi <eban@...> 2000/09/19

わたなべです.

[#10978] [PATCH] require in require — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

15 messages 2000/09/20

[#10985] httphead.rb proxy version problem — Katsuyuki Komatsu <komatsu@...>

小松です.

16 messages 2000/09/20
[#10989] Re: httphead.rb proxy version problem — Minero Aoki <aamine@...> 2000/09/20

あおきです。

[ruby-dev:10978] [PATCH] require in require

From: "Nobuyoshi.Nakada" <nobu.nakada@...>
Date: 2000-09-20 04:02:08 UTC
List: ruby-dev #10978
なかだです。

$ cat a.rb
p __FILE__, $"
$ cat a/b.rb
p __FILE__, $"
require "a"
$ ruby -v -I. -ra/b -e0
ruby 1.6.0 (2000-09-19) [i686-cygwin]
"./a/b.rb"
["a/b.rb"]
./a/b.rb:2:in `require': Interrupt
        from ./a/b.rb:2

  てな感じでデッドロックします。

  一応こんな風にしてみました。


diff -pruPX ./.excludes current/eval.c devel/eval.c
--- current/eval.c	Tue Sep 19 01:28:34 2000
+++ devel/eval.c	Wed Sep 20 12:26:42 2000
@@ -5052,9 +5052,13 @@ rb_provided(feature)
   load_wait:
     if (loading_tbl) {
 	char *ext = strrchr(f, '.');
+	char *loading_thread;
 	if (strcmp(ext, ".rb") == 0) {
-	    while (st_lookup(loading_tbl, f, 0)) {
+	    while (st_lookup(loading_tbl, f, &loading_thread)) {
 		CHECK_INTS;
+		if ((VALUE)loading_thread == rb_thread_current()) {
+		    return Qfalse;
+		}
 		rb_thread_schedule();
 	    }
 	}
@@ -5186,7 +5190,7 @@ rb_f_require(obj, fname)
     if (!loading_tbl) {
 	loading_tbl = st_init_strtable();
     }
-    st_insert(loading_tbl, strdup(feature), 0);	/* partial state */
+    st_insert(loading_tbl, strdup(feature), rb_thread_current());	/* partial state */
 
     PUSH_TAG(PROT_NONE);
     if ((state = EXEC_TAG()) == 0) {


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


In This Thread

Prev Next