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

Re: [MD:4310] Meadow のデッドロック?



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))