Closed qryxip closed 1 month ago
以前にも同じような感じの実装をしましたね!
それがissueに書いてあるSliceOwner
とかかな。
確かに実装してあげると良さそうですが、少なくともドキュメントでUBだと案内されていればOKで、ちゃんと実装する優先度は比較的低めだと感じています。 たしか以前のは結構起こりやすい経路だった記憶。今回はdelete後での利用でUBとのことなので、しっかり書かれたコードではちょっと起こりにくそうだなと思ったので。
とはいえ起こり得る話ではあるので、実装にネガティブという感じではないです!
内容
C APIにて
VoicevoxSynthesizer
などの#[repr(Rust)]
な型について、"delete"を「安全」なAPIにします。安全とは、プロセスをクラッシュさせることになるにしてもRustのUBを起こさないことです。Pros 良くなる点
Cons 悪くなる点
実現方法
(以下の説明は、どちらかというと私(qryxip)の中での整理という点が強いです)
安全と呼べるのに満たすべき性質は次のようになると思います。
1.だけ満たすのは #832 のように
RwLock
中心に設計すればいいのですが、2.と3.が厄介です。Voicevox…
型を単にRwLock
駆動にしただけだと、2.と3.でBox<_>
にアクセスしていいかどうか判断できません。対処としては次のようになると思います。まあどっちも面倒そう。525 の
CStringDropChecker
の設計のように、"new"したVoicevox…
型についてwhiltelistを管理する525 の
SliceOwner
の設計のように、オブジェクトの実体を完全にRust側で管理する方針1.はちゃんとやろうとするとロックのタイミングが面倒なことになりそう。
方針2.については、まず
Voicevox…
型の定義をこうしておき、Voicevox…
型の実体はこういう風に必要に応じて伸びるリストで管理し、プロセスの終わりまで決してデアロケートされないようにします。そしてRustのオブジェクト本体は次のように管理するようにします。
こうすれば
VoicevoxSynthesizer
を"delete"してもRust APIのSynthesizer
はしっかりとデストラクトされ、VoicevoxSynthesizer
自体もデストラクトされたように振る舞い、しかし本当はデストラクトされていないのでUBを避けたフールプルーフが可能になる、といったことが実現できます。個人的にはこの方針2.を考えています。VOICEVOXのバージョン
OSの種類/ディストリ/バージョン
その他