From: Hidetoshi NAGAI Date: 2003-07-16T17:16:39+09:00 Subject: [ruby-dev:20697] Re: [ruby-cvs] ruby: * eval.c (rb_disable_super, rb_enable_super): deprecate. 永井@知能.九工大です. From: matz@ruby-lang.org (matz) Subject: [ruby-cvs] ruby: * eval.c (rb_disable_super, rb_enable_super): deprecate. Date: Wed, 16 Jul 2003 07:11:27 +0000 > * eval.c (thgroup_s_alloc): re-implement group struct. > > * eval.c (thgroup_add): add check for enclose and frozen status. これですが,下記の修正を rb_thread_start_0() に追加しなければ, ------------------------------------- th = Thread.new{ Thread.stop Thread.new{p 'create new thread'; Thread.stop} Thread.stop } tg = ThreadGroup.new tg.add th p tg.list #==> th のみ tg.freeze th.wakeup sleep 1 p tg.list #==> th と 新しく生成された thread の二つ ------------------------------------- というスクリプトで freeze されたスレッドグループに 新しいスレッドが追加できてしまいます. [ruby-dev:20673] の (1) + (3) での仕様では これを許さないということでしたよね? なお,スレッドが終了した場合には,たとえ freeze された スレッドグループでも含まれるスレッドの数が減少しますが, この内部変化は認めるのですよね? Index: eval.c =================================================================== RCS file: /src/ruby/eval.c,v retrieving revision 1.481 diff -u -r1.481 eval.c --- eval.c 16 Jul 2003 07:11:27 -0000 1.481 +++ eval.c 16 Jul 2003 08:03:16 -0000 @@ -9256,6 +9256,11 @@ enum thread_status status; int state; + if (OBJ_FROZEN(curr_thread->thgroup)) { + rb_raise(rb_eThreadError, + "can't start a new thread (frozen ThreadGroup)"); + } + #if defined(HAVE_SETITIMER) if (!thread_init) { #ifdef POSIX_SIGNAL -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp