From: Hidetoshi NAGAI Date: 2003-07-15T04:51:13+09:00 Subject: [ruby-dev:20667] safeTk interpreter (Re: frozen ThreadGroup) 永井@知能.九工大です. え〜っと,完全に反応なしとなってますが (^_^; Subject: [ruby-dev:20655] frozen ThreadGroup > ThreadGroup に次の機能を加えるのはいかがでしょうか. という話を出したのは safeTk インタープリタを うまく利用可能にする方法はないかと悩んだ過程からです. safeTk インタープリタを使えるようにする際の条件として 考えたのは次の通りです. ---------------------------------------------- ・少なくとも master と slave (safeTk) との二つのインタープリタが 同時に使えなければならない. mainloop や Tk インタープリタの終了は master インタープリタで 行う必要がある. ・slave インタープリタから master インタープリタが使えてはならない. 例えば Ruby 側は両方のインタープリタからの callback を受け付けて 適切に処理を振り分けねばならないが,その際に slave から master へのアクセスができないようにしなければならない. ・逆に master インタープリタからは slave インタープリタを コントロールできねばならない. ・widget コントロールのために master と slave とで異なる書式が 必要となるような状況は避けたい. また,従来の Ruby/Tk との互換性を維持,つまり,これまでと同様の 書式でスクリプトを書けるようにしたい. ・かといって,メソッド呼び出し時にインタープリタオプションを 常に必要とするようなことも避けたい. インタープリタ指定が必要なのは master から slave をコントロール しようとする時くらいのはずで,さらにはその場合だけにしても, すべてのメソッド呼び出しでインタープリタを指定するのは煩雑. ---------------------------------------------- 色々と考えてはみたのですが,うまい方法が思いつかず, ない知恵をなんとか絞り出して整理しつつあるのが次の案です. ---------------------------------------------- MultiTkIP クラス invoke 等はクラスメソッドとして実装. ===> TkCore::INTERP の値としてこのクラスを設定. MultiTkIp.new で master IP や slave IP を生成. master IP も slave IP も実行管理にスレッドを用いる. 実行管理スレッドは各インタープリタごとに独立したスレッドグループに属する. 通常は Thread.stop で停止した状態とし,スレッドローカル変数に proc を設定して wakeup して proc をスレッド内で call. ===> slave_IP.eval{ <... Tk methods ...> } というような呼び出しが できるようにする. invoke 等の呼び出し時にどのインタープリタが呼び出されるかは 呼び出しを行ったスレッドグループで決まる. ===> ThreadGroup::Default での実行はデフォルトの master IP で実行. slave IP のスレッドグループを freeze することで 他の IP の権限に昇格できないように防御する. Tk_CMDTBL ===> 手続きを登録したスレッド or スレッドグループを 特定できる情報を同時に保持. ( callback は mainloop スレッドで呼ばれるため ) Tk_WINDOWS ===> スレッド or スレッドグループを特定できる情報を同時に保持. あるいは,この情報を参照しようとする時点で widget が属するべき特定のスレッドグループ下で 実行されているはずであるから,このテーブル自体を IP オブジェクトに持たせるようにする. 他,インタープリタ毎に 1 個というようなものはすべて スレッド or スレッドグループを特定できる情報を同時に保持, または IP オブジェクトごとに保持. 保持すべきスレッド or スレッドグループを特定できる情報は, クラスメソッドの呼び出しによって獲得する. Tcl/Tk 上の ruby コマンドの扱い ===> 信頼するインタープリタについては制限の必要なし. master IP として生成したインタープリタは信頼できるものとする. ===> 信頼できないインタープリタについては隠しコマンド方式で対処し, callback 以外の直接呼び出しはエラーとする. ---------------------------------------------- 見ての通り,この案では 「 ThreadGroup 間の移動を禁止できること 」 というのが前提となっています. 現在でも $SAFE == 4 では禁止されていますが, 「 slave インタープリタを使うには $SAFE == 4 でなければダメ 」 というのは制約として厳しすぎるのではないかと考えます. 「 GUI 操作の結果の可能性がある Tk からの値は, すべて汚染されているとして扱う 」とか「 callback はイベントループが 動いているスレッド上で呼ばれる 」とかを考えるとなおさらです. そこで先のような提案となったわけですが,いかがなものでしょうか. もちろん safeTk サポートのためにこんなトリッキーな方法しか 思いつけなかったことが問題ですから,他にもっと良い方法さえあれば, ThreadGroup の機能追加は必要ありません. ですので,上に述べたような条件下で safeTk サポートのための 良いアイディアがありましたら,ぜひお教えください. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp