From: Hiroshi Shirosaki Date: 2012-01-23T11:47:21+09:00 Subject: [ruby-dev:45149] [ruby-trunk - Bug #5812] test-all is stuck on Windows Issue #5812 has been updated by Hiroshi Shirosaki. File thread_signal.patch added Windowsのtest-allのパッチを作ってみました。検討をお願いします。 * TestThreadGroup#test_thread_timer_and_interrupt GenerateConsoleCtrlEventのCTRL_C_EVENTで0でないprocess groupを指定した場合は、CTRL+C signalは無視されるようです。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms683155%28v=vs.85%29.aspx Generates a CTRL+C signal. This signal cannot be generated for process groups. If dwProcessGroupId is nonzero, this function will succeed, but the CTRL+C signal will not be received by processes within the specified process group. かわりに、CTRL_BREAK_EVENTにして、process groupを指定するようにしました。 CTRL_BREAK_EVENTもSIGINTに対応するのではないかというコメントがありました。 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/18096 s.exited?, s.signaled?, s.stopped? は、windowsではunixのように取れないようなので、その部分のテストを修正しました。 http://bugs.ruby-lang.org/projects/ruby-trunk/repository/entry/win32/win32.c#L3893 if (stat_loc) *stat_loc = exitcode << 8; statusの下位8bitは常に0になるように見えます。 * TestQueue#test_thr_kill Thread.newの中のreadのrb_w32_wait_events_blockingを実行した時、GET_THREAD()でmain threadが取れることがあります。 そのため、killに反応しないようです。 かわりにruby_thread_from_native()を使った場合は、うまく動作しました。 他のGET_THREAD()もruby_thread_from_native()に変えてみました。 * ruby -e '$stdin.read'としたとき、CTRL-Cを押してもrubyが終了しません。 CTRL-Cを2回押すか、CTRL-C + Enterだと終了します。 これはテストにはないのですが、test_thread_timer_and_interruptと関連するのではないかと思います。 CTRL-Cを押したとき、ReadFileのエラーで、ERROR_OPERATION_ABORTEDになるので、そのときはretryしないようにしました。 * zlibのテストでエラーになるので、binmodeを追加しました。 この修正と同様と思います。 http://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/34243 trunkにこのパッチを当てて、mingw on Windows7でmake test, make test-allを確認しました。 make testは成功、make test-allのエラーは増えていませんでした。 ---------------------------------------- Bug #5812: test-all is stuck on Windows https://bugs.ruby-lang.org/issues/5812 Author: Usaku NAKAMURA Status: Assigned Priority: Normal Assignee: Usaku NAKAMURA Category: core Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2011-12-26 trunk 34131) [x64-mswin64_100] 以下の2つのテストがWindowsで刺さります。 test/ruby/test_thread.rb TestThreadGroup#test_thread_timer_and_interrupt test/thread/test_queue.rb TestQueue#test_thr_kill 要するにIO#read中にThread#killしても終わらないことがあるというわけですが、 しばらく頑張ってみたものの(thread_pthread.cからsignal_thread_listの仕組みを 持ってきてみるとか)修正できていないので、忘れないようにチケット化しておきます。 このままだと越年コース。 ちなみにtrunkのみならず1.9系全般で起きています。 今までテストがなかったのがいけないんですな。 -- http://bugs.ruby-lang.org/