From: Hidetoshi NAGAI Date: 2003-07-15T22:08:24+09:00 Subject: [ruby-dev:20687] Re: frozen ThreadGroup 永井@知能.九工大です. From: matz@ruby-lang.org (Yukihiro Matsumoto) Subject: [ruby-dev:20681] Re: frozen ThreadGroup Date: Tue, 15 Jul 2003 16:46:40 +0900 Message-ID: <1058255237.819358.15871.nullmailer@picachu.netlab.jp> > |> (1)+(3) -> freeze > |> (2) -> enclose > |> > |> でどうでしょう? > | > |(1)+(2) のケースの必要性が本当にないかどうかについて > |ちょっと自信がありませんが,それで OK だと思います. > > では、それでいいんじゃないでしょうか。他と干渉もなさそうですし。 遅くなってしまいましたが,この仕様でのパッチを メール末尾に添えてますので,ご確認ください. > です。私はuser id/gruop idを操作する欲求も経験もありませんか > ら、機能の善し悪しについては判断できませんでした。が、名前の > 善し悪しについては判断するという。 この後で現在の 1.8.0 に適用できるように作業にかかり, 名前の候補も挙げてみようと思います. > |# この件といい今回の safeTk 絡みの件といい, > |# 一人で変なところを突っついて踊ってばかりいる気が... > そんなことはないです。人より広い見地を持つ人は孤独なのです、 > きっと。 > 「おれを見下した学会に復讐してやる」とか。^^;;; そんな大したモノならいいんですけどねぇ.(^_^; 実体は,今度の法人化案のせいで,月々わずか 3 万 5 千円程度しかない 研究費でさえ大幅に削られそうなために悲しんでいる, しがない大学教職員に過ぎませんです.はい. # 「研究などするな」と言っているも同然...(;_;) -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp Index: eval.c =================================================================== RCS file: /src/ruby/eval.c,v retrieving revision 1.480 diff -u -r1.480 eval.c --- eval.c 15 Jul 2003 10:50:54 -0000 1.480 +++ eval.c 15 Jul 2003 12:54:32 -0000 @@ -7871,6 +7871,8 @@ int abort; int priority; int gid; + int g_enclosed; + int g_frozen; st_table *locals; @@ -9203,6 +9205,8 @@ th->abort = 0;\ th->priority = 0;\ th->gid = 1;\ + th->g_enclosed = 0;\ + th->g_frozen = 0;\ th->locals = 0;\ } while (0) @@ -9282,6 +9286,11 @@ enum thread_status status; int state; + if (curr_thread->g_frozen) { + rb_raise(rb_eThreadError, + "can't start a new thread (frozen ThreadGroup)"); + } + #if defined(HAVE_SETITIMER) if (!thread_init) { #ifdef POSIX_SIGNAL @@ -9316,6 +9325,8 @@ curr_thread->next = th; th->priority = curr_thread->priority; th->gid = curr_thread->gid; + th->g_enclosed = curr_thread->g_enclosed; + th->g_frozen = curr_thread->g_frozen; } PUSH_TAG(PROT_THREAD); @@ -9865,6 +9876,7 @@ struct thgroup { int gid; + int enclosed; }; static VALUE thgroup_s_alloc _((VALUE)); @@ -9878,6 +9890,7 @@ group = Data_Make_Struct(klass, struct thgroup, 0, free, data); data->gid = serial++; + data->enclosed = 0; return group; } @@ -9903,6 +9916,60 @@ return ary; } +VALUE +thgroup_enclose(group) + VALUE group; +{ + struct thgroup *data; + rb_thread_t th; + + Data_Get_Struct(group, struct thgroup, data); + data->enclosed = 1; + + FOREACH_THREAD(th) { + if (th->gid == data->gid) { + th->g_enclosed = 1; + } + } + END_FOREACH(th); + + return group; +} + +VALUE +thgroup_freeze(group) + VALUE group; +{ + struct thgroup *data; + rb_thread_t th; + + rb_obj_freeze(group); + + Data_Get_Struct(group, struct thgroup, data); + data->enclosed = 1; + + FOREACH_THREAD(th) { + if (th->gid == data->gid) { + th->g_frozen = 1; + th->g_enclosed = 1; + } + } + END_FOREACH(th); + + return group; +} + +static VALUE +thgroup_enclosed_p(group) + VALUE group; +{ + struct thgroup *data; + + Data_Get_Struct(group, struct thgroup, data); + if (data->enclosed) return Qtrue; + return Qfalse; +} + static VALUE thgroup_add(group, thread) VALUE group, thread; @@ -9912,7 +9979,21 @@ rb_secure(4); th = rb_thread_check(thread); - Data_Get_Struct(group, struct thgroup, data); + + if (th->g_frozen) { + rb_raise(rb_eThreadError, "can't move from the frozen thread group"); + } else if (th->g_enclosed) { + rb_raise(rb_eThreadError, "can't move from the enclosed thread group"); + } + + if (OBJ_FROZEN(group)) { + rb_raise(rb_eThreadError, "can't move to the frozen thread group"); + } else { + Data_Get_Struct(group, struct thgroup, data); + if (data->enclosed) { + rb_raise(rb_eThreadError, "can't move to the enclosed thread group"); + } + } th->gid = data->gid; return group; @@ -9985,6 +10066,9 @@ cThGroup = rb_define_class("ThreadGroup", rb_cObject); rb_define_alloc_func(cThGroup, thgroup_s_alloc); rb_define_method(cThGroup, "list", thgroup_list, 0); + rb_define_method(cThGroup, "enclose", thgroup_enclose, 0); + rb_define_method(cThGroup, "freeze", thgroup_freeze, 0); + rb_define_method(cThGroup, "enclosed?", thgroup_enclosed_p, 0); rb_define_method(cThGroup, "add", thgroup_add, 1); rb_define_const(cThGroup, "Default", rb_obj_alloc(cThGroup)); }