-
Notifications
You must be signed in to change notification settings - Fork 120
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[project-vvm-async-api] "buffer"をRustの世界で保持し続ける #525
[project-vvm-async-api] "buffer"をRustの世界で保持し続ける #525
Conversation
とりあえずdocを書いたのでdraftを外します。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ほぼLGTMです!
すみません、二転三転して申し訳ないのですが、 というのも そこで回避策を考えているうちに思ったのですが、 今owner.rsには"owner"の必要性について長々と書いていると思うのですが、 #[no_mangle]
pub extern "C" fn new_string() -> *mut c_char {
CString::new("Hello!").unwrap().into_raw() // `into_raw`でownershipをC側に移し…
}
/// # Safety
///
/// - `s`は`new_string`で得たものである。
#[no_mangle]
pub unsafe extern "C" fn delete_string(s: *mut c_char) {
drop(CString::from_raw(s)); // C側から戻ってきたownershipを受け取って`from_raw`
} それができない理由は我々が #500 をやりたいから、それだけです。であるならユーザーに与える文字列そのものは"own"も"manage"もせずに「間違えた解放に対する拒否」ができればいいはずです。 (追記) そもそもこの部分が要らず、今となっては voicevox_core/crates/voicevox_core_c_api/src/helpers.rs Lines 279 to 282 in 0a0cf99
|
@qryxip なるほどです! CStringOwnerを不要にできるのは大きいですね!
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CStringDropChecker
にしました。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あくまでチェックということで、MaybeUninit
への書き込みとCString::{from,into}_raw
をここから外に出しました。
メソッド名および概念は"whitelist"(動詞兼名詞)と"blacklist"(動詞兼名詞)としてみました。
Co-authored-by: Ryo Yamashita <[email protected]>
/// Cの世界に`CString`を送り出す前に`whitelist`を通し、戻って来た`*mut c_char`を`CString`にしてdrop | ||
/// する前に`check`に通す。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
将来なにか関数増えたときにcheck通すの忘れそうですね。。
仕組みで解決できないので、まあ思い出すしか無さそう。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ですね... ベタ書きしたものをCの世界に向けて発射できる以上、どうしようもない気がします。
Co-authored-by: Hiroshiba <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!!!
見通しが上がったように感じます、ありがとうございます!!
内容
BufferManager
に対するリファクタです。BufferManager
でLayout
を持つのをやめ、UnsafeCell
でBox<[u8]>
/CString
を直接保持し続けます。Feature/c api cut memcpy #392 (comment)の考えです。
Rustの世界でowned型として保持しながらCの世界に
*mut _
で貸し出すわけにはいかないというのもあって選択肢から外してしまったのですが、UnsafeCell
で包んでしまえば(多分)大丈夫なことに気づいてしまいました。これにより
voicevox_wav_free
/voicevox_json_free
はRustの世界でunsafe
ではなくなります。デストラクトするのにUnsafeCell
をただdropするだけでよくなるからです。BufferManager
を解体し、SliceOwner<T>
とCStringOwner
に分解します。[u8]
とCStr
を別物として扱い始めた時点で、役割は分担可能だったのだからこうすべきでした。名前としては"owner"としました。何故なら正真正銘バッファをown(所有)しているからです。C側にはポインタを参照(reference)として貸し出し(lend)ます。
関連 Issue
char*
の解放を明示的に拒否する #500その他
正直なところ私自身C FFIへの経験/知識が薄く、手探りでやっている部分が大きいです。今回も #392 の時点でここまでわかっていれば...との思いがあります。