klic_interruptは、リダクションの切れ目にて、 ヒープ溢れが起きたかのように見えた時に呼び出される処理であり、 「実際にヒープが溢れた場合」、および「例外処理がおきたため、 擬似的にヒープが溢れたかのように見えた場合(heaplimit が0の場合) に呼び出される処理であった。
実際の処理は以下のように行われている。
ページ、第3.3.4章参照)。
この「エンキューし直し」処理を行う関数が
runtime/intrpt.cで定義されている
enqueue_resumed_goals()である。 ここでは、まず、ここで述べたようなエンキューが完了していないような ゴールがあることを考慮し、まず、enqueue_resumed_goals()を呼びだしている。
ページ)を参照のこと。
また、割り込み処理もKL1のゴールにて実現することができるようになっている。 この場合、ゴールのエンキュー は前述の「例外的ゴールスタック」に対して行われるため、 enqueue_resumed_goalsを呼び出し、処理ゴールがもしあればスケジュールされる ようにしておく(先にheapに不足ができていないか判断している 一因は、このエンキューのためにヒープが消費されている可能性のあることである)。
この「割り込み」は、通常のエンキュー時に起こる可能性があり、 汎用の(つまり、エンキューすべきゴールが、現在実行中の優先度 と同じであることが確定できない場合に呼びだされる)ゴールエンキュー 関数enqueue_goal()中で優先度を比較した上でセットする。 このエンキューはいわば同期的に行われるため、 前述の「割り込み用ゴールスタック」を用いずに、直接、通常の優先度付きゴール キューにエンキューされる。しかしながら、実行ゴールスタックの置きかえは やはりここで行われる。
if (allocp + this_more_space >= real_heaplimit)
このreal_heaplimitは、割り込み発生があっても、強制的に 0に起きかえられることのないheaplimitのコピーである。 this_more_space は、ヒープ不足で中断した計算を実行するために 最低限確保しなければならない 空きヒープ領域の容量を示している。
上記のif文がtrueになった場合にはGCを起動する(klic_gcの呼びだし)。 GC呼び出し前後にGC_ON(), GC_OFFとあるのはマクロであり、 GC処理についての統計情報を確保するためのものである。