Friday, 13 June 2014

デッドロック

珍しくTree VNCのデッドロックのバグ取りしてました。自分でフレームワーク作る時には非同期で作ることが多いので、デッドロックは珍しい。Web でも get/put は待たないのが普通だし。

でも、相手はRFBだから自分で定義したものではないからな。そもそも最初に、

version をやり取りする

つまり「相手も自分も読み込みする」といういかにもデッドロックするようなプロトコルになってる。こう言う風に作ってはいけません的な気もするね。というわけで、そこで、ものの見事にデッドロックしてました。あらら。まぁ、accpet loop を single thread で書いたのが敗因なんだけど、

accept 部分はdbいじることが多い

ので、single thread が楽。でも、仕方ないから accept 毎に thread 作るようにするか。それほど難しくはないです。

原因は簡単で、自分で socket 作って通信したら、その後で、もう一つ作られていた。受け側は先に作った方と通信するし、送り側はもう一つの方と通信するから、まぁ、返事はこないよね。両方とも connect quueue には入ってしまうのでエラーしないのね。なかなか面白い。なかなか気が付きませんでした。

これで、だいぶすっっきりしたかな。通信portは一つになったし。でも、まだ動作が変〜

学生が 65inch 4K なディスプレイの文字が小さくて疲れると言っていた。だいぶ、調整したけど。なれるのかコレ? Retina にもなれたしなぁ。
Post a Comment