[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
Re: [MD:4310] Meadow のデッドロック?
- X-ml-count: 4320
- Subject: Re: [MD:4310] Meadow のデッドロック?
- From: MIYASHITA Hisashi(宮下 尚:HIMI) <himi@xxxxxxxxxxx>
- Date: Thu, 03 Apr 2003 03:08:20 +0900
- User-agent: Wanderlust/2.5.7 (Smooth) SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.3 Emacs/21.1 (i386-msvc-nt5.1.2600) MULE/5.0 (SAKAKI) Meadow/1.99 Alpha4 (KUROGANE)
At Wed, 02 Apr 2003 19:53:24 +0900,
MIYOSHI Masanori wrote:
> なお、この現象は、圭一さんの報告 [MD:4167] の現象と同じです。
>
> (1) デッドロックの原因
>
> o メインスレッド:Fset_window_configuration()@window.c にて
> W32_BLOCK_INPUT が呼ばれて、他のスレッドをブロックする。
>
> o メッセージスレッド:W32_BLOCK_INPUT が呼ばれると、UNBLOCK され
> るまで待機状態になる。
>
> o メインスレッド:Fselect_window() -> Ffep_get_mode() が呼ばれる。
>
> o メインスレッド:Ffep_get_mode() では、IME のモードを取得するた
> めに、メッセージスレッドにメッセージ送るが、メッセージスレッド
> は待機状態にあるため、応答は得られない。
>
> →メッセージスレッドは応答待ち、メッセージスレッドは待機状態のま
> まになり、デッドロック発生。
>
> これに限らず、クリティカルセクション(W32_BLOCK_INPUT と
> W32_UNBLOCK_INPUT の間)にて、メッセージが使われると、デッドロック
> に陥る可能性があります。
うーむ、だいたいわかりました。しかし、正確には、message threadがlockされるのは、
new_focusと、exposureだけなので、この場合に限るんですけどね。しかし、
lispを呼びかねないときにlockは厳禁ということですね。しかし、まあ、new_focusが
このタイミングでかかるとは考慮外だったですねぇ。
というわけで、単純にFselect_window, Fredirect_frame_focusを
critical sectionから追い出せばよいのでしょう。ちょっとテストしてみて
くださいませ。よければ、commentをつけてcommitかな。
他にも、mouse faceの非同期更新をやめて、両方のロック
(set_window_configuration, new_focus)を解除する、という手があります。
まあ、これはそのうちやりますかねぇ。
from himi
*** window.c.~1.10.~ Sun Mar 02 16:36:29 2003
--- window.c Thu Apr 03 03:02:30 2003
***************
*** 5052,5057 ****
--- 5052,5060 ----
}
}
}
+ #ifdef MEADOW
+ W32_UNBLOCK_INPUT;
+ #endif
FRAME_ROOT_WINDOW (f) = data->root_window;
/* Prevent "swapping out point" in the old selected window
***************
*** 5075,5080 ****
--- 5078,5086 ----
0, 0);
#endif
+ #ifdef MEADOW
+ W32_BLOCK_INPUT;
+ #endif
/* Set the screen height to the value it had before this function. */
if (previous_frame_height != FRAME_HEIGHT (f)
|| previous_frame_width != FRAME_WIDTH (f))