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

[MD:7043] Re: r3987 - trunk/src



>>>>> On 25 Nov 2005 02:54:12 -0000,
> 
> Author: horiguti
> Date: 2005-11-25 11:54:10 +0900 (Fri, 25 Nov 2005)
> New Revision: 3987
> 
> Modified:
>    trunk/src/ChangeLog.Meadow
>    trunk/src/mw32term.c
> Log:
> Avoid dead-lock between WM_PAINT and MW32_update_begin.

...snip...

> Modified: trunk/src/mw32term.c
> ===================================================================
> --- trunk/src/mw32term.c	2005-11-24 18:40:02 UTC (rev 3986)
> +++ trunk/src/mw32term.c	2005-11-25 02:54:10 UTC (rev 3987)
> @@ -531,9 +531,21 @@
>  
>        if (MW32_MAIN_THREAD_P ())
>  	{
> +	  int block = FALSE;
> +
> +	  if (W32_SELF_INPUT_BLOCKED_P)
> +	    {
> +	      W32_UNBLOCK_INPUT;
> +	      block = TRUE;
> +	    }
> +
>  	  EnterCriticalSection (&(f->output_data.mw32->hdc_critsec));
>  	  phdc = &f->output_data.mw32->hdc;
>  	  LeaveCriticalSection (&(f->output_data.mw32->hdc_critsec));
> +
> +	  if (block)
> +	    W32_BLOCK_INPUT;
> +
>  	  pcount = &f->output_data.mw32->hdc_refcount;
>  	}
>        else


これなんですが、HDC 二関する最近の変更はまったく目を通せていないので、
ソースをちゃんと見ずにいっていますが、ちょっと気になったので。。。

上記diff のようなことしなければならない状況と言うのが、ちょっと心配です。

それよりなにより、 メンバ hdc のポインタを取得するためにクリティカルセク
ションを使用するって、意味が無くないですか?  phdc を保持する理由があると
したらmw32 のポインタ値が変わった事に対応するためと考えられますが、その値
が変化するのだとしたらEnterCriticalSection()/LeaveCriticalSection() で使
用するわけにはいかないはずだし。

あと、hdc_refcount って本当に必要なのかな? と気になる。DC の使い方を整理
したという事だったと思うのですが、refcount を用いる必要があると言う事は参
照による複製を作られると言う事ですよね。それって整理方向と違うような気が
して。1つのスレッドで描画する事が徹底していて、GetDC()で描画時にHDCを取得
するのであれば、HDCは参照コピーされるような事はないと単純に考えますが、そ
ういうわけにもいかない? (ソースを見てないので的外れの可能性が高いのです
が)。

--- Regards,
 Shun-ichi Goto  <gotoh@xxxxxxxxxxx>
   R&D Group, TAIYO Corp., Tokyo, JAPAN