From: "Nobuyoshi.Nakada" Date: 2000-09-20T18:25:30+09:00 Subject: [ruby-dev:10983] Re: [PATCH] require in require なかだです。 At Wed, 20 Sep 2000 14:04:50 +0900 matz@zetabits.com (Yukihiro Matsumoto) wrote: > | てな感じでデッドロックします。 > | > | 一応こんな風にしてみました。 > > そーゆーことまではしなくても直るようです。他の問題も合わせ、 > 以下のパッチが有効ではないでしょうか? a.rb で require "a" するとやっぱりデッドロックします。まぁ普通こんなこ とはしませんが、デッドロックはまずいかなと。おまけに busy loop だし。 あと [ruby-dev:10978] は一ヶ所間違ってました。Qfalse じゃなくて Qtrue を返さないと。 diff -pruPX ./.excludes current/dir.c devel/dir.c --- current/dir.c Mon Aug 7 14:01:46 2000 +++ devel/dir.c Wed Sep 6 10:12:13 2000 @@ -5052,9 +5054,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 Qtrue; + } rb_thread_schedule(); } } @@ -5186,7 +5192,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はできる。 中田 伸悦