From: arton Date: 2008-04-04T00:10:17+09:00 Subject: [ruby-dev:34244] Re: MVM interface draft artonです。 > --- ruby_vm_setenv(VALUE vm, const char *name, const char *value) > vm中の環境変数を設定する。 > --- ruby_vm_set_pwd(VALUE vm, const char *pwd) > vmのカレントディレクトリを設定する。 このあたりのAPIは、該当VMを実行するスレッド(ruby_vm_runの呼び出し前後と いうことになるのかな)からの呼び出し縛りなどありますか? 気になったのは、エンジンの仕様バグなどで、他のスレッドで実行中のVMに対し てこれらのメソッドを呼び出してしまうことです。仮にクリティカルセクション を設けるとしても、実行中にカレントディレクトリが変わるというのはまずそう に思います。 たとえば、 ['a', 'b', 'c'].each do |x| File.open(x, 'w') do |f| f.write foobar() end end を実行中のVMに対して、別のスレッドからruby_vm_set_pwdが呼ばれると、ファ イルa,bとcで異なるディレクトリに作られてしまうというようなバグを想定して います。 > 各VMがネイティブスレッドで並行動作できるようにするため、それぞれ > 独立したObjectSpaceを持ちます。結果として、あるVMで作られたオブ > ジェクトを別のVMに渡すことはできません。 Rubyで実行すれば良いとも思いますが、VMを分割することで実行コンテキストを 分けたWebアプリケーションで、メモリー上に保持するセッション情報を交換す る、あるいはvmを途中から追加するというシナリオを考えると、オブジェクトの VM間のコピーまたは移動を行うCのAPIが用意されているほうが望ましく思います。 ruby_object_copy(VALUE vm_from, VALUE vm_to, VALUE target_obj); (内部でマーシャル/アンマーシャルが行われる) ruby_import_objectsapce(VALUE vm_from, VALUE vm_to, VALUE objectspace); (書いてから気づきましたが、ruby_vm_clone(VALUE vm_from)があれば良いのか も) 危険なオペレーションとなる可能性は承知していますが、エンジン側で用意した 監視スレッド(ruby_vm_enter_threadしたスレッドとは異なるスレッド)から、 実行中のvm(スレッド)をできるだけ安全に殺すための ruby_vm_shutdown(VALUE vm); あるいは ruby_vm_kill(VALUE vm); せめて ruby_vm_raise_exception(VALUE vm, VALUE exception); を用意して欲しいです(しかも、Win32で実行可能なようにシグナルに頼らずに)。 -------------------------------------- GANBARE! NIPPON! Win your ticket to Olympic Games 2008. http://pr.mail.yahoo.co.jp/ganbare-nippon/