Closed higumachan closed 1 year ago
確かにRust側でもfreeはできそうですね。
ただそのBox::from_raw
ですが、Box<f32>
になって先頭の一要素しか解放されない気がします。length
も要求してVec::from_raw_parts
を使う形になるのではないかと思います。
ただそのBox::from_rawですが、Box
になって先頭の一要素しか解放されない気がします。lengthも要求してVec::from_raw_partsを使う形になるのではないかと思います。
確かにそのとおりでした. こんな感じですかね.
#[no_mangle]
pub unsafe extern "C" fn voicevox_predict_duration_data_free(predict_duration_data: *mut f32, predict_duration_data_length: usize) {
drop(Box::new(slice::from_raw_parts(predict_duration_data, predict_duration_data_length)));
}
ただ,APIが変わってしまうため議論しなければ行けないポイントは増えますね.
API合わせるなら,Rust内部でPointerから引けるHashMap的なStateを用意する感じかなと思います.
issue作成ありがとうございます!!たしかにメモリコピーを一度減らせそうだと感じました!
パラメータにlengthが追加されると、ユーザーにとってはAPIが変わるだけでなくその値を保持する必要があって少し大変になりそうだなと感じました。 そこはライブラリ側で持ってあげる形、つまり仰るとおりMapを作ることで結構きれいに解決できるのかなと感じました!!
Rustのアロケータ自身はサイズを覚えていないのかと思ったのですが、どうやら覚えていないみたいですね。
Mapで持つのがusize
かstd::alloc::Layout
かの違いだけになりそうですが、後者の方が意図が明確になるかも?
いや内部はglibcのmallocとかを呼んでいたと思うので、中途半端に使ったら危ないかもしれません。usize
の方がいいかも。
追記: いやfrom_raw(_parts
)でも変わらないかも
すこし方針を変えて,Boxを経由せずにVec::leak
を利用して実装するほうが安全そうだったのでこちらで実装を行いました.
内容
現状はc-apiにて https://github.com/VOICEVOX/voicevox_core/blob/a787f6d0f4bc111568114801ac38ca826320c339/crates/voicevox_core_c_api/src/lib.rs#L190-L253)
https://github.com/VOICEVOX/voicevox_core/blob/a787f6d0f4bc111568114801ac38ca826320c339/crates/voicevox_core_c_api/src/helpers.rs#L108-L118
https://github.com/VOICEVOX/voicevox_core/blob/a787f6d0f4bc111568114801ac38ca826320c339/crates/voicevox_core_c_api/src/helpers.rs#L128-L139
のように,Rustから取得されるバッファをlibc::mallocで確保し直したバッファにコピーしています.
Rust側で確保されているバッファのポインタをそのまま返すようにすると,コピーの回数が減るかと思います.
Pros 良くなる点
Cons 悪くなる点
実現方法
RustのBox::leakを利用すると以下のようにかけます.
指摘頂いた点を修正したので追記:
OSの種類/ディストリ/バージョン
その他