From: Hidetoshi NAGAI Date: 2010-06-28T03:21:59+09:00 Subject: [ruby-dev:41749] Re: (ruby/tk) ruby_1_9_2 への backport Yugui さん, 永井@知能.九工大です. お手数をお掛けしてしまっています. From: Yugui Subject: [ruby-dev:41742] Re: (ruby/tk) ruby_1_9_2 への backport Date: Sun, 27 Jun 2010 23:32:18 +0900 Message-ID: > この修正はマージするか迷ったんですが、下のような副作用がどこまで出る > か分からなかったのでマージを後回しにして忘れておりました。 > 結構大きな変更でもありますし、時期的にできるだけマージしたくないんで > すが、windowsでの[ruby-core:30358]の回避策というのはないんでしょうか。 [ruby-core:30397] に "Just with 8.5 built from source with msys/mingw." などとあるように,速度の早いマルチコアの Windows 環境で発生してしまう 問題であると考えています. テスト目的で一時的に Tcl/Tk インタープリタを生成して確認を行った後に その確認用インタープリタを delete していたのですが, マルチスレッド絡みで delete 前にイベントが到着し, イベント処理されないままに delete を完了しているのだろうと思います. 同じようなことは今後増すことはあっても減ることはないでしょうから, その根本的な解決として,確認用インタープリタの生成を止めるようにしました. 代りに,MacOS X では適切なマクロ定義がなされていることが必須となったため, その情報を得るための tclConfig.sh/tkConfig.sh も必要となりました. > reasonableな回避策がなければ、バグでもありますしマージに賛成したいと思います。 [ruby-core:30372] で試してもらった回避策は本当に非常手段で, これを実行すると Thread.new{Tk.mainloop} というように イベントループを main thread 以外で実行していた従来のスクリプトは 全滅することになります. 確認用インタープリタの生成を行わずに済ませるように修正する以外には 適切な方法はないと考えています. 以前に cygwin 版でうまく動かないという報告があった件も 実は同じ原因だったのかもしれないとも思っています. 残念ながら今の時点では確認できないため, cygwin 向けには変更を見送っています. ただし,cygwin の場合でも ---------------------------------------------------------- module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD = false; end ---------------------------------------------------------- を実行してから require 'tk' を行うという逆回避は有効なはずです. > > (2) MacOS X 上での tcltklib.c を適切に compile するために, > > tclConfig.sh と tkConfig.sh が事実上必須となる. > > > > → これらは Tcl/Tk の導入時に通常インストールされているはずのもので, > > compile 時に与えるべきフラグの情報が記載されている. > > インストールされているはずってことは、 > > 修正後は,tclConfig.sh/tkConfig.sh がない場合に > > 特に Aqua 版で正しく compile できなくなる可能性 > > というのはどういうケースで発生し得るでしょうか。念のため、その辺を伺えれば有り難いです。 Tcl/Tk のインストールは適切になされているという前提であるなら, 例えば,インストールした場所とは別のディレクトリから インストール済みの Tcl/Tk のライブラリへのリンクを張り, 同じ場所にインストールされているはずの tclConfig.sh/tkConfig.sh へは リンクが張られていないというようなケースでしょうか. そのような場合にリンク元を Tcl/Tk ライブラリの場所として指定されると tclConfig.sh/tkConfig.sh が見付からないことになります. まぁ,tclConfig.sh/tkConfig.sh が全く存在していないという場合以外は configure オプションで指定してやればいいだけです. 特殊なインストール状況を作り出せている人なら, きっと configure オプションの指定程度のことは問題にしないでしょうね. -- 永井 秀利 (nagai@ai.kyutech.ac.jp) 九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門