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

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



ほりぐちです. W32_BLOCK_INPUT周りを詳しく見て大方理解したとおもい
ます.

> これの善し悪しはわかりませんが、なんとなく間違ってそうな気がする。

 もう一箇所ありました. でも多分動いていないのですが.

 で, この一時UNBLOCKの処置ですが正しくありません.

 というのは expose_frame をやってほしくない区間をブロックしている
のに通してしまうのですから. でもここでメッセージスレッドの処理を流
さないとメインスレッドの処理も進まないのでどうしようもありません.


 そこでこれを解決するために, W32_BLOCK_INPUT で平等にブロックする
ようになっている排他処理をを不平等にしています.

  ・メインスレッドがブロック区間実行中: メッセージスレッドの
    expose_frameは処理を後回しにする. (単純にBeginPaint() を呼ばな
    ければ再度同じ WM_PAINT が発行されます.)

    メインスレッドのブロックは基本的にW32_BLOCK_INPUTと同じ範囲で
    行うようにします. (今はちょっと狭くてこれが問題を起こしています)

    =>メインスレッドからメッセージスレッドへの処理の依頼があったと
      きにも処理がとまりません.

  ・メッセージスレッドで expose_frame を実行中はメインスレッドの処
    理はブロックされる.

    => メッセージスレッドからメインスレッドに依頼される処理は描画
      には関係のないもの(*)だけです.

      *) WM_IME_STARTCOMPOSITION に対する WM_EMACS_GET_IME_FONT_PROP,
         WM_*BUTTONUP等に対する WM_EMACS_TOOL_BAR_DOWN/UP,
         WM_TIMER,WM_KEYDOWN,WM_MOUSEWHEEL に対する WM_EMACS_HIDE_TOOLTIP

  ・WM_ERASEBKGND は当面非同期で実行する(同期させるとブロック要因
    になるので).

  以上で現状の W32_BLOCK_INPUT がやっていることは置き換えられるの
 で W32_BLOCK_INPUT を NOP 化します.

 このほか現状手元で発現するバグが一個(メインスレッドのhdcのカウン
トが0にならずにつかみっぱなしになる.)あって, これが解決したらとり
あえずパッチをMLに流しますのですみませんが皆さんに試してみていただ
きたいのですが..


 で, ブランチ化ですが, 自分のところでもうまく動かず作業中というこ
とならブランチでじっくりということも可能ですが, 一応自分のところで
は正常に動作している状態になってしまうと結局ほかの人に試してもらう
しかありません.

 ということで結構ばたばたしてすみませんが, これは当面 ML->trunk
commit というパターンで進めさせてもらいたいのですがどうでしょうか.

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