[Ruby] Win32OLE と Thread (Ruby 1.9)
artonさんが作ってくださったパッチを適用してWindows XP で VC2008EE でコンパイルして試してみたら、 nmake test-all TESTS=win32ole で win32ole.so を requireするタイミングでSEGVした。
パッチを適用したときには、何のエラーメッセージも出なかったので、適用はしくじっていないと思う。やっぱり、Windows XP だと TlsAllocを使わないと駄目なのかな。
ということで、TlsAllocを使うようにして、CygwinでもMingw(in Cygwin) でもコンパイルできるようにしてみた。
が、今度は、
- Cygwin では、 make test-all TESTS=win32ole が最後まで実行されてからSEGVする。
- mswin32 版では、 nmake test-all TESTS=win32ole が最後まで実行されてからSEGVする。
- Mingw では、 最後まで実行されずに途中でSEGVする。
ようになってしまった。うーむ。本当は手元であらかじめ作っておいたtest_thread2.rb が動作するようになるはずだったのに....。試しに、test_thread2.rb を実行するとなんか完全にテストが途中で停止しているっぽくてこれも駄目っぽい....。
TlsAllocの使い方を間違えているのか?
とりあえず、今日、できた分は、win32ole_marshal.tar.bz2 です。
| 固定リンク
この記事へのコメントは終了しました。
コメント
どうもWMIそのものがクロススレッドをサポートしていないようです(VS2010で作ったMSWin32では内部でデッドロックする)。別のサーバに変えるとうまく動きました。
ところで、Tlsno使い方は以下のようにする必要があるように思います(VS2010だとSEGVしないので良くわからないのですけど)。
http://www.artonx.org/data/win32ole.tls.patch
投稿: arton | 2010年10月10日 (日) 05時02分
パッチありがとうございます。
適用してみましたが、改善されませんでした。
mswin32版は、nmake test-all TESTS=win32ole でテスト開始直後に
「問題が発生したため、ruby.exeを終了します。」
というエラーメッセージが表示されました。
マイクロソフトエラー報告を【送信しない】ボタンを押すとテストが
最後まで実行されて、
test_err_in_callback(TestErrInCallBack):
Errno::EACCES: Permission denied - test_err_in_callback.log
C:/cygwin/home/svn/ruby/trunk/test/win32ole/test_err_in_callback.rb:40:in `u
nlink'
C:/cygwin/home/svn/ruby/trunk/test/win32ole/test_err_in_callback.rb:40:in `t
eardown'
とテストで1つエラーが発生し、テスト終了後にSEGVしました。
mingw は適用前と現象は変わらず。
Cygwin はテストそのものが実行されずにいきなり終了しました。
投稿: suke | 2010年10月10日 (日) 09時35分