[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:6211] Dead-lock on IME input



堀口です.

 どうもしばしばIMEでの文字確定直後に固まることが頻繁になってきた
(なぜ?)ので調べたところ, メインスレッドが update_frame をやってい
る最中にメッセージスレッドに WM_PAINT が来て expose_frame を実行
するとタイミング次第で固まるという感じです. W32_BLOCK_INPUT での
デッドロックです.

環境は Meadow 2.10 Rev. 3567/WinXP SP2/Pen4 HT

 IMEをONにしたまま右手をReturnキー, 左手を文字キーに置いて, 左右
の手をひたすらばしばしたたいていると(数文字ごとに確定を繰り返す)
早ければ2-3行. 運が悪いと画面が埋まるまで固まりませんが大体10行く
らいで固まります.

 普段使っているノートPCで起きた記憶がないので, HyperThreading(も
しくはSMP?)が構成要件かも知れません. またはCPUの性能の問題かもし
れません.

 対処として mw32_set_ime_font_property でも mw32_set_caret と同じ
ようにメッセージを送る時にブロックを解除するようにしました. (何か
微妙ですが..) これでデッドロックはおきなくなったようです. (Rev.3568)

 ほかにも同じような可能性を持った場所はいくつもありそうですが, そ
れは調べていません^^;

 以下が固まっときの状況です. なんとなく時間順..かな.

Main thread                          Message thread

redisplay_internal               
update_frame  W32_BLOCK_INPUT
update_window
detect_input_pending                 WndProc
get_input_pending                    WM_PAINT
gobble_input                         mw32_expose_frame W32_BLOCK_INPUT <= BLOCK
note_sync_event                      
mw32_process_main_thread_message
mw32_get_ime_font_property
   SEND_MSGTHREAD_..() <= BLOCK

-- 
ほりぐちきょうたろう