next up previous contents index
Next: 中断、失敗処理: interrupt_goal Up: 例外処理 Previous: KL1レベルでの割り込み処理

割り込み処理: klic_interrupt

klic_interruptは、リダクションの切れ目にて、 ヒープ溢れが起きたかのように見えた時に呼び出される処理であり、 「実際にヒープが溢れた場合」、および「例外処理がおきたため、 擬似的にヒープが溢れたかのように見えた場合(heaplimit が0の場合) に呼び出される処理であった。

実際の処理は以下のように行われている。

1.
まず、resumeされているかもしれないゴールを通常のスタックに 書き戻す。これは、実行時ライブラリ中で行われた処理により エンキューされたようなゴールは大域変数resumed_goals にエンキューされている。 この二次的なゴールスタックにエンキューされているゴールを本来の ゴールスタックにエンキューし直す([*]ページ、第3.3.4章参照)。 この「エンキューし直し」処理を行う関数が runtime/intrpt.cで定義されている enqueue_resumed_goals()である。 

ここでは、まず、ここで述べたようなエンキューが完了していないような ゴールがあることを考慮し、まず、enqueue_resumed_goals()を呼びだしている。

2.
トレーサ対応のコードの場合、ここで、トレーサの処理をおこなう。  具体的には、stepping_flag、 trace_flagを参照し、を参照し、ONならば各々 step_after()、trace_after処理(共にruntime/trace.c内で定義 されている)を行う。詳細は、第8.3章 ([*]ページ)を参照のこと。

3.
割り込みの原因を調査する。



Sekita Daigo
1998-05-18