珍しくTree VNCのデッドロックのバグ取りしてました。自分でフレームワーク作る時には非同期で作ることが多いので、デッドロックは珍しい。Web でも get/put は待たないのが普通だし。
でも、相手はRFBだから自分で定義したものではないからな。そもそも最初に、
version をやり取りする
つまり「相手も自分も読み込みする」といういかにもデッドロックするようなプロトコルになってる。こう言う風に作ってはいけません的な気もするね。というわけで、そこで、ものの見事にデッドロックしてました。あらら。まぁ、accpet loop を single thread で書いたのが敗因なんだけど、
accept 部分はdbいじることが多い
ので、single thread が楽。でも、仕方ないから accept 毎に thread 作るようにするか。それほど難しくはないです。
原因は簡単で、自分で socket 作って通信したら、その後で、もう一つ作られていた。受け側は先に作った方と通信するし、送り側はもう一つの方と通信するから、まぁ、返事はこないよね。両方とも connect quueue には入ってしまうのでエラーしないのね。なかなか面白い。なかなか気が付きませんでした。
これで、だいぶすっっきりしたかな。通信portは一つになったし。でも、まだ動作が変〜
学生が 65inch 4K なディスプレイの文字が小さくて疲れると言っていた。だいぶ、調整したけど。なれるのかコレ? Retina にもなれたしなぁ。
No comments:
Post a Comment