雑KiN3-改

ここは自分にとっての過去ログです。すなわち、他人にとっては単なるゴミ。

 70本近いスレッドが走っているソフトの、一部のスレッドのスケジューリングをラウンドロビンからリアルタイムに変更したところ動きがおかしくなったから見てくれと言う話が持ち込まれました。X Window がからんでいるから動きがおかしいのは一目で判ります。XtAppAddInput で付け加えた処理が動いていない。リアルタイムにしてハイプライオリティで動作しているスレッドが実行権を握り続けてリリースしないように見えます。


 結構てこずったのですが結局のところは、XtAppAddInput のソースを読んでみたところ、AppContext に関してちょっとした処理を行っているだけのことで、それは大して時間コストのかかる処理でもないことから、次に XtAppMainLoop のソースを読んでみたら気がついたことが。XtAppMainLoop はループ処理に入って Xevent 等が来たら配布を繰り返す”だけ”と言われていますが、そのループの前後で AppContext をロックしています。とすると、 XtAppAddInput の処理が完全に終わらないうちに XtAppMainLoop が走り出して AppContext をロックしているなら、現状で発生している状態の説明がつく。リアルタイム化でスレッドの休止期間が無くなり XtAppMainLoop が走り出すタイミングが数十 msec 早まったのだろうと言うこと。ただ、説明が今ひとつすっきり着かないのは XtAppAddInput の戻り値は ID だと言い乍らこれまたアレなんですが、成功したつもりの値が返っているようなこと。時間がないので深追い出来ないんですが、これに説明を付けたいものだなぁ。