メモリの扱い
Nagiでは、データを所有する値と、元のデータを借りるviewを区別します。HighとLowでこの規則は共通です。現在はRustへコンパイルし、Rustが最終的な借用検査と値の解放を行います。GCやNagi専用のVMはありません。
| 値 | 保持と解放 |
|---|---|
| 数値・bool・コピーできるclass | 値を直接保持し、コピーして渡せる |
| str・bytes・List・所有データを含むclass | 所有権を渡して使う。不要になったときに解放する |
| view | 元のデータを借りる。自分ではそのデータを解放しない |
| shared | データを共有する。保持している参照がなくなったときに解放する |
| task・channel・DBの仕事 | ランタイムが確保する。待ち手の取消しと処理・資源の終了は同時とは限らない |
通常の値に参照カウントを一律に付ける方式ではありません。shared[T]はRustのArcを使い、参照の増減を管理します。sqlite.Poolなどのランタイム資源も内部で参照カウントを使う場合があります。sharedは循環参照を回収せず、共有した値の変更やスレッド安全性を自動で保証しません。
非同期処理を待つのをやめても、既にDB workerへ渡した仕事やRust側のblocking処理は続く場合があります。取消しはrollbackを意味しません。具体例と制約は所有権、view、DBにあります。
arenaで領域をまとめて確保・解放する実験テストはありますが、現在のアプリへ自動で適用していません。リクエスト単位のarenaを使う標準APIもありません。