From: Hidetoshi NAGAI Date: 2005-01-26T16:17:03+09:00 Subject: [ruby-dev:25545] Re: some problems on ext/tk/sample/**/*.rb 永井@知能.九工大です. From: Hidetoshi NAGAI Subject: [ruby-dev:25537] Re: some problems on ext/tk/sample/**/*.rb Date: Wed, 26 Jan 2005 11:58:07 +0900 Message-ID: <20050126.115804.74740030.nagai@ai.kyutech.ac.jp> > (;_;)(;_;)(;_;)(;_;) > だとしたら状況はかなり厳しいです. とりあえず,順序入れ替えとチェック増加を行ってみました. これではいかがでしょうか? Index: tcltklib.c =================================================================== RCS file: /var/cvs/src/ruby/ext/tk/tcltklib.c,v retrieving revision 1.1 diff -u -r1.1 tcltklib.c --- tcltklib.c 25 Jan 2005 14:31:44 -0000 1.1 +++ tcltklib.c 26 Jan 2005 07:15:42 -0000 @@ -4,7 +4,7 @@ * Oct. 24, 1997 Y. Matsumoto */ -#define TCLTKLIB_RELEASE_DATE "2005-01-25" +#define TCLTKLIB_RELEASE_DATE "2005-01-26" #include "ruby.h" #include "rubysig.h" @@ -3333,18 +3333,19 @@ Tcl_Preserve(slave); - if (!Tcl_InterpDeleted(slave) && !ip_null_namespace(slave)) { - if (Tcl_Eval(slave, DEF_CANCEL_AFTER_SCRIPTS_PROC) == TCL_OK) { - if (Tcl_GetCommandInfo(slave, CANCEL_AFTER_SCRIPTS, &info)) { - DUMP2("call cancel after scripts proc '%s'", - CANCEL_AFTER_SCRIPTS); - Tcl_Eval(slave, CANCEL_AFTER_SCRIPTS); - } - } + if (!Tcl_InterpDeleted(slave) && !ip_null_namespace(slave) && + Tcl_GetCommandInfo(slave, finalize_hook_name, &info)) { + DUMP2("call finalize hook proc '%s'", finalize_hook_name); + Tcl_Eval(slave, finalize_hook_name); + } - if (Tcl_GetCommandInfo(slave, finalize_hook_name, &info)) { - DUMP2("call finalize hook proc '%s'", finalize_hook_name); - Tcl_Eval(slave, finalize_hook_name); + if (!Tcl_InterpDeleted(slave) && + Tcl_Eval(slave, DEF_CANCEL_AFTER_SCRIPTS_PROC) == TCL_OK) { + if (!Tcl_InterpDeleted(slave) && !ip_null_namespace(slave) && + Tcl_GetCommandInfo(slave, CANCEL_AFTER_SCRIPTS, &info)) { + DUMP2("call cancel after scripts proc '%s'", + CANCEL_AFTER_SCRIPTS); + Tcl_Eval(slave, CANCEL_AFTER_SCRIPTS); } } @@ -3355,7 +3356,7 @@ del_root(slave); /* while(!rbtk_InterpDeleted(slave)) { */ if (!Tcl_InterpDeleted(slave)) { - DUMP1("wait ip is deleted"); + DUMP2("delete slave ip(%lx)", slave); Tcl_DeleteInterp(slave); } @@ -3393,25 +3394,29 @@ Tcl_ResetResult(ptr->ip); - if (Tcl_Eval(ptr->ip, DEF_CANCEL_AFTER_SCRIPTS_PROC) == TCL_OK) { - if (Tcl_GetCommandInfo(ptr->ip, CANCEL_AFTER_SCRIPTS, &info)) { + if (!Tcl_InterpDeleted(ptr->ip) && !ip_null_namespace(ptr->ip) && + Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) { + DUMP2("call finalize hook proc '%s'", finalize_hook_name); + Tcl_Eval(ptr->ip, finalize_hook_name); + } + + if (!Tcl_InterpDeleted(ptr->ip) && + Tcl_Eval(ptr->ip, DEF_CANCEL_AFTER_SCRIPTS_PROC) == TCL_OK) { + if (!Tcl_InterpDeleted(ptr->ip) && + !ip_null_namespace(ptr->ip) && + Tcl_GetCommandInfo(ptr->ip, CANCEL_AFTER_SCRIPTS, &info)) { DUMP2("call cancel after scripts proc '%s'", CANCEL_AFTER_SCRIPTS); Tcl_Eval(ptr->ip, CANCEL_AFTER_SCRIPTS); } } - if (Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) { - DUMP2("call finalize hook proc '%s'", finalize_hook_name); - Tcl_Eval(ptr->ip, finalize_hook_name); - } - /* del_root(ptr->ip); */ DUMP1("delete interp"); /* while(!rbtk_InterpDeleted(ptr->ip)) { */ if (!Tcl_InterpDeleted(ptr->ip)) { - DUMP1("wait ip is deleted"); + DUMP2("delete ip(%lx)", ptr->ip); Tcl_DeleteInterp(ptr->ip); } @@ -3878,25 +3883,28 @@ delete_slaves(ptr->ip); DUMP1("finalize operation"); - if (Tcl_Eval(ptr->ip, DEF_CANCEL_AFTER_SCRIPTS_PROC) == TCL_OK) { - if (Tcl_GetCommandInfo(ptr->ip, CANCEL_AFTER_SCRIPTS, &info)) { + if (!Tcl_InterpDeleted(ptr->ip) && !ip_null_namespace(ptr->ip) && + Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) { + DUMP2("call finalize hook proc '%s'", finalize_hook_name); + Tcl_Eval(ptr->ip, finalize_hook_name); + } + + if (!Tcl_InterpDeleted(ptr->ip) && + Tcl_Eval(ptr->ip, DEF_CANCEL_AFTER_SCRIPTS_PROC) == TCL_OK) { + if (!Tcl_InterpDeleted(ptr->ip) && !ip_null_namespace(ptr->ip) && + Tcl_GetCommandInfo(ptr->ip, CANCEL_AFTER_SCRIPTS, &info)) { DUMP2("call cancel after scripts proc '%s'", CANCEL_AFTER_SCRIPTS); Tcl_Eval(ptr->ip, CANCEL_AFTER_SCRIPTS); } } - if (Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) { - DUMP2("call finalize hook proc '%s'", finalize_hook_name); - Tcl_Eval(ptr->ip, finalize_hook_name); - } - del_root(ptr->ip); DUMP1("delete interp"); /* while(!rbtk_InterpDeleted(ptr->ip)) { */ if (!Tcl_InterpDeleted(ptr->ip)) { - DUMP1("wait ip is deleted"); + DUMP2("delete ip(%lx)", ptr->ip); Tcl_DeleteInterp(ptr->ip); } -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp