パラレルmakeがハングする理由を調べてみる…再起動-序盤-

もうすぐ連休で纏まった時間が取れそうなので(学生さんは、もうすぐ夏休みですね〜)、このネタをもう少し引っ張ることにした。と言うか、纏まった時間ではない昨日も調べてたんですけどね…。
make v3.82を使っても、最新MinGW+MSYS環境上ではパラレルmakeがハングするので、前回よりも、もう少し深掘りしてみる。何度か(ではないな。かなりの回数)試してみると、希に動くときがある。ログを確認するとmakeツリーの探索よりも、運良くコマンド実行が先に実施されると、パラレルmakeが正常に動作する。このケースでは常に最大ジョブ数未満で処理が進んでいくため、パラレルmakeができる様だ。とは言っても、レアケースなので、このパスは無視することにする。と言うわけで、殆どの(ハングする)ケースが、どこのパスを走っているかを追ってみた。
で、調べた結果、ジョブを管理しているところ&新しいジョブを登録するところ(new_job)の、恐らくwaitの代わりに使われていると思われるreadで止まっていることが判明。さらに、本来ならば実行中のジョブ(子プロセス)が終了したとき、CHLDシグナルが発生(捕捉)しreadが中断するところが、なぜかCHLDシグナルを捕捉できずに、readでwaitしたままになっているところまで判明した。
プログラム上は、CHLDシグナルを捕捉しreadを中断させるようなコードが入っており、またシステムコール上でも目的の処理をしていることを確認した。
だが、しかし、実際には子プロセスが終了してもCHLDシグナルを捕捉できていない。straceを仕掛けてみると、トレース処理があまりに遅く、パラレルmakeにならない(T-T)。アプローチを変えて似たようなサンプルを作ってみても、どこが違うのか正しくCHLDシグナルを捕捉できてしまう。どこか根本的に違うアプローチを考えないと駄目かもしれないと思いつつ、msys DLLに手を入れることを考え始めた…中盤?に続く