-
Notifications
You must be signed in to change notification settings - Fork 118
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
add: C APIの#[repr(Rust)]
なものへのアクセスをすべて安全にする
#849
add: C APIの#[repr(Rust)]
なものへのアクセスをすべて安全にする
#849
Conversation
C APIにおいて次の状況に対してセーフティネットを張り、パニックするように する。 1. オブジェクトが他スレッドでアクセスされている最中に"delete"を試みる 2. "delete"後に他の通常のメソッド関数の利用を試みる 3. "delete"後に"delete"を試みる このPRは VOICEVOX#836 の解決**ではなく**、ドキュメントにも手を加えていない。とい うのも`VoicevoxVoiceModelFile`には次のゲッターメソッドがあり、これらをカ バーするのは現状のAPIの形だと不可能だからである。 * `voicevox_voice_model_file_id` * `voicevox_voice_model_file_get_metas_json`
5a56580
to
223a77b
Compare
元々やりたかったこととしては #832 みたいな設計をC APIでもやることでした。しかしそのためには
個人的には1.か4.なのですが、VoicevoxCoreSharpを作っている @yamachu さんにも意見を伺いたいなーと。 |
/// プロセスの終わりまでデストラクトされない、ユーザーにオブジェクトとして貸し出す`u32`相当の値。 | ||
/// | ||
/// インスタンスは次のような形。 | ||
/// | ||
/// ``` | ||
/// #[derive(Clone, Copy, Debug, From, Into)] | ||
/// #[repr(Rust)] | ||
/// pub struct VoicevoxSynthesizer { | ||
/// id: u32, | ||
/// } | ||
/// ``` | ||
/// | ||
/// `Body`そのものではなくこのトレイトのインスタンスをユーザーに渡すようにし、次のユーザー操作に対するセーフティネットを実現する。 | ||
/// | ||
/// 1. オブジェクトが他スレッドでアクセスされている最中に"delete"を試みる | ||
/// 2. "delete"後に他の通常のメソッド関数の利用を試みる | ||
/// 3. "delete"後に"delete"を試みる | ||
/// | ||
/// ただし次のゲッター関数に関しては機能しない。 | ||
/// | ||
/// - `voicevox_voice_model_file_id` | ||
/// - `voicevox_voice_model_file_get_metas_json` |
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.
doc commentだけ書いてみました。
Discordの会話: https://discord.com/channels/879570910208733277/893889888208977960/1292402538745954346
今回の変更ですが、言語バインディングライブラリを作る者として扱いやすいC APIになるなと感じました、ありがとうございます。 #849 (comment) 1 は他の API との一貫性が取れているように感じるので、良いのかなとは思いました。 |
自分もちゃんとわかってない気もしますが、1が良さそうに思いました! |
`VoicevoxVoiceModelFile`の次のゲッター関数を、ゲッター関数ではなくする。 - `voicevox_voice_model_file_id` `uint8_t (*output_voice_model_id)[16]`に吐き出すようにする。 - `voicevox_voice_model_file_get_metas_json` `voicevox_voice_model_file_create_metas_json`に改名。 ねらいとしては VOICEVOX#832 のような設計をC APIでも行うことで、サードパーティの バインディング製作者の労力を減らすため。上記のゲッター関数がゲッターでは なくなれば、オブジェクトへのアクセスを完全に管理できる。 VOICEVOX#849 (comment)
`VoicevoxVoiceModelFile`の次のゲッター関数を、ゲッター関数ではなくする。 - `voicevox_voice_model_file_id` `uint8_t (*output_voice_model_id)[16]`に吐き出すようにする。 - `voicevox_voice_model_file_get_metas_json` `voicevox_voice_model_file_create_metas_json`に改名。 ねらいとしては #832 のような設計をC APIでも行うことで、サードパーティの バインディング製作者の労力を減らすため。上記のゲッター関数がゲッターでは なくなれば、オブジェクトへのアクセスを完全に管理できる。 #849 (comment)
|
あとはドキュメントを更新すれば #836 をresolveできるはず。 |
09d4990
to
274c2ea
Compare
|
#[repr(Rust)]
なものへのアクセスをすべて安全にする
54d967f
to
242e8ed
Compare
242e8ed
to
e6abd77
Compare
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.
一応確認なのですが、レビュー始めちゃっても大丈夫でしょうか 👀
大丈夫です! |
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!!!
1点だけ、ドキュメントに関して細かいコメントをしただけになってしまいました!
クラッシュという表現もいい感じな気がしました。もしかしたら最近のプログラマーには通じないのかもだけど。
異常終了が丸いかも。でもまあ何でもいい気がしました!!
|
||
let this = { | ||
let mut heads = Self::lock_heads(); | ||
heads.push(Default::default()); |
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.
I noticed that the validate
function below checks if the pointer points inside heads
, but this line can cause heads
to reallocate, which means that creating a new object might invalidate existing pointers.
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.
Oh no thank you! You are obviously right.
I'll use boxcar.
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.
(probably) fixed in #862.
Fix up #849. The main purpose is fixing the following bug using `boxcar`. #849 (comment) Refs: #849
内容
C APIにおいて、Rust APIのオブジェクトそのものの代わりにトークンのような1-bit長の構造体ユーザーに渡すようにすることで、次のことを実現する。
ドキュメントとしてのsafety requirementsもあわせて緩和する。
このPRは #836 の解決
ではなく、ドキュメントにも手を加えていない。というのも。VoicevoxVoiceModelFile
には次のゲッターメソッドがあり、これらをカバーするのは現状のAPIの形だと不可能だからであるvoicevox_voice_model_file_id
voicevox_voice_model_file_get_metas_json
関連 Issue
Resolves #836.
その他