next up previous contents index
Next: 詳細な実装 Up: ループへの対処 Previous: 問題点

解決方法

%read は送信したが中断ゴールがフックしていないような場合, 既に送信した %read は取り消してもよい. その %read の応答である %answer_value を待つゴールはないからである.

局所GC で, 中断ゴールがフックしていないコンシューマ外部参照オブジェクト X が 見つかったならば以下の処理を行う.

1.
コンシューマ外部参照オブジェクト X をジェネレータ外部参照オブジェクトに変える (戻す).
2.
X が指していたワーカへ以下の「読出し要求取り消しメッセージ」 を送る.
%cancel(X,Ret)
メッセージの引数 Ret は, 取り消す読出し要求を特定するためのものである.

%cancel(X,Ret) を受信したワーカは以下の処理を行う.

参照先が変数ならば
フックしているコンシューマ(群)を検索し, Ret と同じ返信先を記憶しているリプライ・オブジェクトを 解放し %release を送信する.
参照先が具体値ならば
何も行わない. これは既に %answer_value が送信されている場合である.

以上の処理により (図10.13参照), ゴミとなったループを, すべてではないが, 局所処理によって解放することができる.



Sekita Daigo
1998-05-18