next up previous contents index
Next: 単一化器 Up: Timer Previous: 基本的な方式

実装詳細

Timerの実装はほぼ以下のつのファイルよりなる。より低レベルなものから、 KL1のインターフェースを実現したものの順に概説する。

timer.c:
再低位の関数群。
init_virtualized_timer():
タイマ関連の初期化。
call_at_specified_interval(), call_at_specified_time(), call_at_time_intervals():
各々、「特定の時間後」、「特定の時刻」、 「特定の間隔で」 タイマをセットするための関数。処理については引数funcにより関数として 設定する。通常はklic_timer_interrupt_handler() が セットされる(ktimer.c)。
schedule_timer_interrupt():
前期3つの関数の下請けであり、 タイマ要求リストに要求された時刻と処理関数をセットする。

process_timer_expired_events(), timer_expiration_handler():
実際にSIGALRMを受けたときに 実行されるUNIXレベルの例外ハンドラ。 リストを先頭から嘗め、「現在の時刻」以前の処理を次々と行う。 処理の結果、タイマ要求が残っているならば、restart_timer()を呼びだすことに より、タイマ処理を再開する。

restart_timer():
タイマ要求の先頭を参照し、 次の時刻をセットする。

insert_timer_queue():
タイマ要求を新たに登録する。 登録時にタイマ要求リストは時刻の昇順にソートされている状態にする。

ktimer.c:
より高水準のタイマの関数群。

低水準のタイマとの最大の差は、低水準タイマは SIGALRMが発生した直後に処理を行うのに対して、高水準なものは、 直後のリダクションの切れ目に処理をおこなうことにある。よって、少なくとも KL1の実行に関わるような事柄はこの高水準タイマで設定される必要がある。

高水準のタイマ要求リストには、要求時刻と、ハンドラ、およびデータを1つ 渡すことができるようになっている。

reserve_klic_timer_interrupt():
高水準タイマのCレベルのAPI。指定された時刻と具体化すべき変数とを 高水準タイマ要求として登録する。 仕様としては、タイマ設定時に変数が渡され、 その変数を具体化することにより時刻が来たことをKL1に知らせる、 となっている。つまり、KL1で利用されることを考慮したAPIである。

指定された時刻、処理をタイマ要求リストに登録し、その後、 process_timer_interrupt() を呼びだす。

タイマ要求リストには、具体化すべき変数と、それに「NILを具体化する」 という関数(process_timed_instantiation())が登録される。

set_simple_interval_timer_handler():
高水準のタイマであるが、設定する処理の内容は、Cの関数を指定する。 よって、「リダクションの切れ目で呼びだされるCレベルのタイマハンドラ」である。

指定された時刻、処理をタイマ要求リストに登録し、その後、 process_timer_interrupt() を呼びだす。

タイマ要求リストには、具体化すべき関数ポインタ(をアトムタグにしたもの)、 と、その「関数を実行する」関数(process_simple_timer_handler())が登録される。 アトムタグが付加されているのは、後述のgc_timer_dataで単純にコピーされることを 狙ってのことである。

process_timer_interrupt():
上記2つの関数の下請けであり、かつ、リダクションの切れ目で 実行される例外処理ハンドラである。

この関数では、高水準タイマ要求リストを嘗め、 すでに過去のものになっている要求について、その指定されているハンドラ (つまり、process_timed_instantiation()/process_simple_timer_handler())を 実行する。 実行した後には klic_timer_interrupt_handler() を例外処理関数として call_at_specified_time により低レベルタイマに登録する。

このklic_timer_interrupt_hander() は、一般的な例外処理と同様、単に 「例外があった」ことを記録し、klic_signal_handler() 内で process_timer_interrupt()も実行される。

gc_timer_data():
高水準タイマ要求リストには 変数が含まれている。その変数のメンテナンスを行うための関数。 GC hookの機構を用いて登録されている([*]ページ、第3章参照)。



Sekita Daigo
1998-05-18