[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 1236] Re: ieatta2.



  こんにちは、川合です。


Koyanagi Masaaki さんは 2000/11/05 23:03:20 の「[OSASK 1235] Re:
 ieatta2.」で書きました:

>・countup2 を起動すると非常に動作が重くなり、アクティブウインドウ
>の切替(画面の書換が終了するまで)に 3秒くらいかかったりする

  これは、かなりすごいです。3秒もかかるんですか・・・。それだと
かなり絶妙なデバッグができそうです。

>・問題が起こるのは countup2 だけで countup1 では発生しない

  うーん、そうなんですか・・・それだと、僕にはなおさら分からなく
なってきました(後述)。

>  ソースを見て私が推測すると、countup2 を起動している時には
>ウインドウ切替処理が終了していない時に、次のウインドウ切替処理が
>呼ばれると、前の処理が完了するまで待つはずなのに、待たずに次の処理を
>行ってしまうため、ウインドウの関係 ->up ->down がこわれてしまうのでは
>ないでしょうか。

  と、僕も察しました。しかし、これはあらかじめ想定されていたこと
で、そのためにreadjob()とwritejob()という2つの関数を用意して、
なにか作業をしている間は、指示された作業を開始しないことになって
います。

>  この前の処理が完了するまで待つのが lib_waitsignal() だと思うのですが、

  違います。前の処理が完了すると変数jobnowが0になり、すぐに関数r
unjobnext()が呼び出されてバッファリングしていた処理を開始するよ
うになっているんです。

  F9でアクティブなウィンドウを変更した場合、一番最後にwinman0が
受け取るシグナルは、新しく一番上に来たウィンドウを制御しているタ
スクからの「即時再描画完了」のシグナルです。これが来るまで、ユー
ザーからの要求はwritejob()でバッファにため続けます。そして、「即
時再描画完了」を受信すると変数jobnowが0になります。

  ・・・というシナリオなんですが、どうしてうまくいかないんでしょ
う。しかもcountup2だけ・・・。うまくいかないってことは、僕の意図
した通りには動いていないってことなんですよねえ・・・。

>>  countup系は一秒間に100回もタイマーからシグナルを受け取るうえに
>>シグナル処理部分がずさんなのですぐにシグナルをため込んでしまう可
>>能性があります。
>これが原因で、lib_waitsignal() が正常に動作していないかもしれません。

  countup2はcountup系での変わり者で、タイマーシグナルは1秒間に
1回だけです。ですからcountup2では、対策前からINT 0x03になったこ
とがありません。それゆえに、この関係ではないと思います。

  また仮にこの問題が関係しているとしても、おかしくなるのはcountu
p2のタスクだけです。winman0は完全にアプリケーションから独立した
タスクで実行されていますから、countup2のシグナルがあふれても、co
untup2が暴走しても、winman0は全く平和に実行されます。タスク間の
独立性が危ぶまれた問題はどうやら落ち着いたようですし、やはりこの
部分の問題は今回の件には無関係だろうと僕は思います。

  僕の印象では、countup1の方がよっぽどシビアだと思います。なのに
countup1では起きなくて、countup2では起きる・・・。うーん。

  これをうちで試す方法は、完了シグナルや受理シグナルを出すのが遅
いタスクを作って、それでF9を連打することでしょうかねえ・・・。

  参考までに書いておくと、関数job_activewin0()が指定されたウィン
ドウをリンクから切り離します。そして、オーバーラップ関係を調査し
、状態が変更されるウィンドウ(を管理しているタスク)にシグナルを
送ります。

  そして、関数job_openwin1()が受理シグナルや完了シグナルが一通り
帰ってくるのを待ちます。

  job_activewin0()で出した要求の数と、受信した受理シグナル・完了
シグナルの数が一致したら、job_openwin2()に制御が移ります。で、こ
こでトップになったウィンドウにシグナルを送って再描画させ、その完
了シグナルをjob_openwin3()で受けて、ここでjobnowがやっと0になる
わけです。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.or.jp
Homepage http://www.imasy.or.jp/~kawai/