説明のために重要でない詳細については変更して,
Concert Hybrid 実行モデル
[37]
におけるlazy context creation
方式の変形を表現したい.
Lazy context creation は, callee が終了していなくても
caller に制御が戻るかもしれないという条件のもとで,
潜在的にブロックする
手続きがどのように caller に結果の値を渡すのかを定義している.
手続き f が, ブロックするかもしれない手続き g を呼び出したとしよう.
g がブロックせずに終了したときには, g は大域フラグ
blocked
をクリアし,
C の return
文によって結果の値を返す
.
一方, g がブロックしたときには, g はヒープコンテキストを確保し,
フラグをそのコンテキストへのポインタにセットする.
制御が f に戻った後は, フラグを調べ, もしそれがゼロでないならば
自分をブロックさせる. f と g の呼び出しの鎖を維持するために,
f はブロック前に g のコンテキストを f のコンテキストにリンクさせる
(g_ctxt->cont = f_ctxt
によって). g が後に再開され,
最終的に終了したら, g は他のコンテキストが g のコンテキストから
リンクされていないかどうかを調べ, もしそうならば, それを再開する.
返り値は f のコンテキストの中に書かれる.