Skip to content
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

Python APIではpanic=unwindにする #505

Merged
merged 2 commits into from
Jun 4, 2023

Conversation

qryxip
Copy link
Member

@qryxip qryxip commented May 30, 2023

内容

Python APIをpanic=unwindでビルドすることにより、ユーザー環境で万が一パニックが発生した際の挙動を「プロセスのabort」ではなく「例外の発生」に変えます。

C APIおよびPython APIでは現在(#218 によって)パニック発生時の動作がデフォルトのpanic=unwindからpanic=abort、すなわち「問答無用でのプロセスの強制終了」となっています。

提供するのがC APIのみならこれはバイナリサイズ縮小の効果しかありませんでした。なぜならパニックはそもそもextern "C"の境界を越えられないからです(リンク先のextern "C-unwind"まだnightly-onlyです)。
(なのでsh1ma/voicevoxcore.go#5のようなことはおそらく不可能です)

しかしPyO3であれば話は別です。PyO3はRustのパニックをpyo3_runtime.PanicExceptionというC Pythonの例外に変換してくれます。例外はCPythonのAPIを通じて外に出るため、DLLの壁を越えることができます。

panic=abort:

thread '<unnamed>' panicked at 'パニックメッセージ', crates/voicevox_core/src/publish.rs:36:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
zsh: IOT instruction (core dumped)  python ./run.py

panic=unwind:

 thread '<unnamed>' panicked at 'パニックメッセージ', crates/voicevox_core/src/publish.rs:36:9
 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
-zsh: IOT instruction (core dumped)  python ./run.py
+Traceback (most recent call last):
+  File "./run.py", line 86, in <module>
+    main()
+  File "./run.py", line 25, in main
+    core = VoicevoxCore(
+pyo3_runtime.PanicException: パニックメッセージ
 ❯ echo $?
-134
+1

バイナリサイズの微妙な減少と例外への変換を比べたとき、ユーザーにとってどちらが望ましいかですが、個人的には後者だと思っています。

  • Cargo.tomlでpanic=abortを指定するのをやめる
  • Actionsを更新し、C APIだけこれまで通りpanic=abortでビルドされるようにする

関連 Issue

なし

その他

@qryxip qryxip marked this pull request as ready for review June 2, 2023 15:32
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!

Copy link
Member

@PickledChair PickledChair left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@PickledChair PickledChair merged commit 5491660 into VOICEVOX:main Jun 4, 2023
@qryxip qryxip mentioned this pull request Jun 6, 2023
67 tasks
Hiroshiba added a commit that referenced this pull request Jun 12, 2023
* Docs: 事例紹介にvoicevoxcore.goを追加 (#498)

Docs: 事例紹介のvoicevoxcore.goを追加

* 間違った`char*`の解放を明示的に拒否する (#500)

* Cargo.tomlをフォーマットする (#504)

* Update rust toolchain 1.70.0 (#506)

Co-authored-by: PickledChair <[email protected]>
Co-authored-by: Ryo Yamashita <[email protected]>

* Rust APIのbuild.rsを抹消する (#508)

* Python APIでは`panic=unwind`にする (#505)

* Python APIでは`panic=unwind`にする

* C APIは`-C panic=abort`でビルドする

* READMEのスペースが足りてなかった (#511)

* windows-latestでなぜかdownload_testが落ちるのを改修 (#517)

* windows-latestでなぜかdownload_testが落ちるのを修正

* a

* cbindgenに`fn.args=vertical`を設定し、`__declspec`の後の空行を消す (#518)

* `__declspec(dllimport)`と関数定義の隙間の空行を消す

* `fn.args="vertical"`を設定

* cbindgenの`include_version`を有効化する (#519)

* cbindgenの`include_version`を有効化する

* jobをリネーム

* 誤字

---------

Co-authored-by: Kota Amasaka <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: PickledChair <[email protected]>
Co-authored-by: Hiroshiba <[email protected]>
@qryxip
Copy link
Member Author

qryxip commented Jul 11, 2023

提供するのがC APIのみならこれはバイナリサイズ縮小の効果しかありませんでした。なぜならパニックはそもそもextern "C"の境界を越えられないからです(リンク先のextern "C-unwind"まだnightly-onlyです)。
(なのでsh1ma/voicevoxcore.go#5のようなことはおそらく不可能です)

7/13にリリースされるRust 1.71にextern "C-unwind"が入っていますね。まだ試していませんが、これでC APIからもパニックを送出できるはず。

rust-lang/blog.rust-lang.org#1118

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants