ひたすらにキーボードを叩く。
 空が明るくなる頃、ようやく一段落付く。
 パーツごとの単体テストでは問題ないので、全体のテストに移る。
げげっ!
 スタックオーバーフロー発生(デバッガによりプログラムが一時停止される)。
 手当たり次第コメントアウトして、デバッグ用出力を埋め込む。
 どこだ…どこだ…どこだ…。
 見~つけた(喜)。
 ここをこうして…ほ~ら、直った。
じゃ、今度はちょっと無茶な使い方をしてみよう。
 たとえば、プレビューを作成してる間にウィンドウを閉じちゃうとか。
 もちろんプレビュー作成を中断して終了処理を行うんだよね。
…固まった(汗)。
 またも手当たり次第…(中略)…埋め込んで、カヲル君(=バグ)を捜してみる。
 『どこ』はスグに判ったのだが、『なぜ』が全く判らない。
 ひたすらにソースを睨み続けること 4 時間…。
「そうか、そういうことかリリン」(今週2度目)
こういうことだったのである(左→右の順に読むと良い)。
| メインスレッド(ユーザからの入力に応答) | ワーカースレッド(プレビューを作り表示する) | 
| それぞれがやってること | |
| ユーザからの終了を受理。 | やめられない仕事中。 | 
| 終了(Exit)を通知→ | まだ仕事中。 | 
| ワーカースレッドが終わるまで待機。 | 最後の仕事を終えるためにメインスレッドに処理(Process)を依頼。それが終わったらEが来てるかチェックしよう。 | 
| 待機中のため、Pを処理できない。 | Pが終了しないのでEを検知できない。それどころか、次の仕事にも移れない。→終わらない。 | 
要は、お互いがお互いに処理待ちをしていてデッドロックになっていたのだ。
 この部分を改善して、またテスト。
 問題がないようなので、一連の設定を行い、実行させてみる。
 おいらが麻婆豆腐を作り始めてから完食するまで正常に動いていたので、それほど重大なバグはなさそうである。
こんなのが出来上がりました(※サイト分割に伴いリンク解除)。
 まだヘルプもないし、ReadMeもちょっとしか書いてないけどね。


コメント