#あ、そうだ。
#斎藤さんの環境でMinGW/pthread対応版はext/threadsのthread-status 'terminatedのテストをpassしますか?
#PLT Schemeにfutureと
##私の環境ではパスしません。 そこで停止して次へ進みません。 < terminated
#が、 make check ではなく gosh test.scm でテストを走らせるとパスしてしまうときもあるという状況です。
#にちゃんねるでもマシンによって再現したとかしなかったとかいう話が出てたので、ちょっとしたタイミングの差なんだと思います。 スレッド関連ではありがちですが…。
#どういうわけか私の環境だと make check だと何度やってもそこで停止しちゃうんですよ。 なんなんでしょうねぇ。
#そこはpthread_cancel()を呼んでるんですが、pthreads-win32のpthread_cancelって完全に実装されてましたっけ?
##Bugs に書いてあるのがそれでしょうか。
#POSIX だといくつかの関数が cancellation points になることになってるのが Windows ではそうではない、ってことかな。
#私は英語わかんない人なのでいいかげんな理解です…。
#あ、それじゃないかな。terminateのテストはひとつのスレッドをsys-nanosleep(windowsではSleep()でエミュレート)をかませた無限ループにしといて、別スレッドからpthread_cancelを送ってるんですが、Sleep()中にcancelのテストが無ければ終了しませんね。
#あれ、待てよ、sys-nanosleepのエミュレーションをwindowsに入れたのは0.9の後だな。これはsvn trunkの話だと思っていいですか?
#とりあえずのworkaroundとして、pthread_testcancel()の呼び出しをsrc/system.cのnanosleep()の定義中のSleep()の呼び出しの直後(2箇所)に入れてみるとどうでしょう。このBugsが問題なら、とりあえずそれでこのテストは通るんじゃないかな。
#ただ、根本的な解決ではありませんが。
#trunk での話です。
#早速やってみます。
#テストにパスしました。
#何度やってもちゃんとパスします。
#ちゃんと解決しようと思うとキャンセルポイント埋め込みまくりになるんだろうか…。
#いえ、今回の場合はsleepしているのが0.1秒なのでtestcancel()に引っかかりますが、完全にブロックしちゃうようなシステムコールだとtestcancel()さえ呼ばれないので対応できません。
#どうしても対応しようとしたら、Bugsの項に挙げてあるように全てのblocking system callの前後でcancel modeを切り替えるしかないでしょう。
#私としては、pthread-win32に依存するよりもWindowsスレッドを直接使えた方がいいので、そっちの方向で考えたいと思っています。
#ただ、boehm gc 7.1のmingw版はwindows threadでは動かないので、7.2alphaで試してみようとしてるところで止まってます。
#なるほど。
#ただ、windows threadでもcancellationは問題になりそうな気がしてるんですよね…
#たぶんシステムコール全てに渡って、キャンセル用イベントと結果受け取りの両方を待つようなコーディングをしないとならないんじゃないかと思ってます。
#そしたら、全システムコールの前後にsetcanceltype()を入れるのも大して手間は変わらないかもしれません。
#拡張を書くときもそのルールが必要になるのだとすればちょっとやっかいかも。